多线程抓取豆瓣编程书籍(linux\windows都可运行)

首先创建两个队列,queue队列存储要爬的网址,out_queue存储的是要取内容的网页源代码。

创建线程类,ThreadUrl的作用是从给定的网址上抓取网页内容,并将内容存储在out_queue队列上,而DatamineThread的作用是从网页源代码中通过正则来取想要的内容。

这个代码在window下运行的话就需要将.decode(‘utf8‘)那句话前面的#删除就ok了,编码方式需要改一下。

如果想自己编写的话,使用queue的时候一定不要忘了调用task_done()函数,不然程序将一直运行。

使用正则表达式的时候抓取内容的格式一定要注意,要与源代码中一致,开始的时候我少了几个空格回车,各种抓不到啊。

运行时间更电脑配置有关,可能会较长,可以通过调整抓取网页的数量来控制时间。

#-*- coding:utf-8 -*-

import Queue
import threading
import urllib2
import time
import re
from BeautifulSoup import BeautifulSoup 

host = 'http://www.douban.com/tag/%E7%BC%96%E7%A8%8B/book?start='

queue = Queue.Queue()
out_queue = Queue.Queue()

class ThreadUrl(threading.Thread):
    def __init__(self,queue,out_queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.out_queue = out_queue

    def run(self):
        while True:
            host = self.queue.get()
            url = urllib2.urlopen(host)
            chunk = url.read()
            self.out_queue.put(chunk)
            self.queue.task_done()

class DatamineThread(threading.Thread):
    def __init__(self,out_queue):
        threading.Thread.__init__(self)
        self.out_queue = out_queue

    def run(self):
        while True:
            chunk = self.out_queue.get()
            title = re.findall('''class="title" target="_blank">(.*?)</a>''',chunk)
            apprise = re.findall('''<span class="rating_nums">(.*?)</span>''',chunk)
            desc = re.findall('''<div class="desc">
        (.*?)
      </div>''',chunk)
            #print desc[14]
            for i in range(14):
                print ('书名:'+title[i]+'\n评价:'+apprise[i]+'\n描述:'+desc[i]+'\n')#.decode('utf8')
            self.out_queue.task_done()

start = time.time()
def main():
    for i in range(5):
        t = ThreadUrl(queue,out_queue)
        t.setDaemon(True)
        t.start()

    for BookNum in range(10):
        queue.put(host+str(BookNum*15))

    for i in range(5):
        dt = DatamineThread(out_queue)
        dt.setDaemon(True)
        dt.start()

    queue.join()
    out_queue.join()

#print '++++++++++++++++++++++++++++++++JD_SPIDER+++++++++++++++++++++++++++++++++++++'
main()
print "Total time :%s"%(time.time()-start)
#print '++++++++++++++++++++++++++++++++JD_SPIDER+++++++++++++++++++++++++++++++++++++'
时间: 2024-08-01 19:13:14

多线程抓取豆瓣编程书籍(linux\windows都可运行)的相关文章

python实现爬虫(一)--- Scrapy框架抓取豆瓣书籍信息

Scrapy是一个用python实现都爬虫框架,简单易用,功能强大,只需要在框架的基础上自定义自己的分析规则即可,具体如何新建工程等待都在官方文档上面讲解得非常清楚,官方文档tutorial(http://doc.scrapy.org/en/latest/intro/tutorial.html)请保证下载较新版本的Scrapy(我的是0.24.2,scrapy -v)旧版本会出现一些问题. 下面我使用Scrapy抓取豆瓣上面编程书籍的一些简单信息 一.准备爬取的页面如下,新建一个douban工程

PHP利用Curl实现多线程抓取网页和下载文件

PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery类来采集数据库,在此之外也可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件. 至于具体实现过程,请参考下面几个例子: 1.实现抓取多个URL并将内容写入指定的文件 $urls = array( '路径地址', '路径地址', '路径地址

用python+selenium抓取豆瓣读书中最受关注图书,按照评分排序

抓取豆瓣读书中的(http://book.douban.com/)最受关注图书,按照评分排序,并保存至txt文件中,需要抓取书籍的名称,作者,评分,体裁和一句话评论 #coding=utf-8 from selenium import webdriver from time import sleep class DoubanPopularBook:     def __init__(self):         self.dr = webdriver.Chrome()         self.

1-1 用Python抓取豆瓣及IMDB上的电影信息

下面的代码可以抓取豆瓣及IMDB上的电影信息,由于每段代码使用的数据源自上一段代码输出的数据,所以需要按顺序执行. step1_getDoubanMovies.py 1 # -*- coding: utf-8 -*- 2 ''' 3 该脚本得到豆瓣上所有电影的如下信息: 4 "rate": "7.5", 5 "cover_x": 2000, 6 "is_beetle_subject": false, 7 "title

数据挖掘_多线程抓取

在这一篇文章中,我们主要来介绍多线程抓取数据. 多线程是以并发的方式执行的,在这里要注意,Python的多线程程序只能运行在一个单核上以并发的方式运行,即便是多核的机器,所以说,使用多线程抓取可以极大地提高抓取效率 下面我们以requests为例介绍多线程抓取,然后在通过与单线程程序比较,体会多线程的效率的提高 这一次,我就不用我的网站做测试了,因为网站的内容此时还并不是太多,不能体现多线程的优势 我们通过当当网来测试我们的多线程实例,通过对搜索结果的同一抓取实现功能的演示,搜索模式地址如下 h

用python+selenium抓取豆瓣电影中的正在热映前12部电影并按评分排序

抓取豆瓣电影(http://movie.douban.com/nowplaying/chengdu/)中的正在热映前12部电影,并按照评分排序,保存至txt文件 #coding=utf-8 from selenium import webdriver import unittest from time import sleep class DoubanMovie(unittest.TestCase):     def setUp(self):          self.dr = webdriv

抓取豆瓣的电影排行榜TOP100

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称 5 Anthor: Andrew Liu 6 Version: 0.0.1 7 Date: 2014-12-04 8 Language: Python2.7.8 9 Editor: Sublime Text2 10 Operate: 具体操作请看README.md介绍 11 "&q

多线程抓取异常

下面这段代码  可以看出  run方法里面会抛出一个异常.我们在主方法里面进行抓取.但是大家可以复制去测试.这个抓取异常中的代码不会运行 也就是没有抓取到. 在线程里面的异常主程序是无法抓取的. public static void main(String[] args) { try { T01 t01 = new T01(); t01.start(); } catch (Exception e) { System.out.println(1); } } } class T01 extends

Docker在Linux/Windows上运行NetCore文章系列

原文:Docker在Linux/Windows上运行NetCore文章系列 Windows系列 因为Window很简单,VS提供界面化配置,所以只写了一篇文章 Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用 Linux(ubuntu 16.04) Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 Docker在Linux上运行NetCore系列(二)把本地编译好的镜像发布到线上阿里云仓库 Docker