【原创】编写多线程Python爬虫来过滤八戒网上的发布任务
目标:
以特定语言技术为关键字,爬取八戒网中网站设计开发栏目下发布的任务相关信息
需求:
用户通过设置自己感兴趣的关键字或正则表达式,来过滤信息。
我自己选择的是通过特定语言技术作为关键字,php、java和python。
注意:如果不选用正则表达式,就会把javascript也爬进来,那前端的信息就比较多了。
为什么要使用多线程:
网络烂,读网页时很容易阻塞,这个时候后面的工作都得等;
在保存页面时,有对硬盘I/O的需求,如果阻塞了也得等。
实现:
0、3个线程。一个线程A负责读取网页,一个线程B负责分析返回的网页并分析出所需的数据,一个线程C负责把所需的数据写到硬盘上。
1、A线程通过一个list和B线程通信,B线程通过一个list和C线程通信。A是纯生产者,B面对A时是消费者,面对C时是生产者,C是纯生产者。可以把3个线程想象成一个链表,A --> B --> C,其中A线程必定最早结束,其次是B,最后是C。但是注意,前面线程结束了,如果list中还有数据,后面的进程需要消费完该数据后才能结束。
2、既然要访问共享区域,自然是上锁互斥了。
3、具体如何分析网页就不讲了,比较简单。八戒网做的比较实在,都在<li></li>标签内部,很好识别。输出的时候我选择输出为html文件,这样直接就能当网页看。
全部代码:
# @author shadowmydx import urllib2
import re
from threading import Thread,Lock listPage = [] # 网页读取线程和网页分析线程通信的缓存区域
listResu = [] # 网页分析线程和输出线程通信的缓存区域
listFilter = []
listFilter.append(re.compile(r'php'))
listFilter.append(re.compile(r'[Pp]ython'))
listFilter.append(re.compile(r'[jJ]ava[^Ss]')) # 防止匹配到javascript pageLock = Lock() # a 和 b的锁
writLock = Lock() # b 和 c的锁 openEnd = False # a线程结束了吗?
analEnd = False # b线程结束了吗? target = r'http://www.witmart.com/cn/web-design/jobs'
webhost = r'http://www.witmart.com/cn/web-design/jobs'
numPages = 22 class ReadPageThread(Thread):
def run(self):
global listPage
global target
global numPages
global pageLock
global openEnd
self.nextPage = 1
while numPages != 0:
f = self.openPage(target)
pageLock.acquire()
listPage.append(f)
print target + ' is finished.'
pageLock.release()
target = self.findNext(f)
numPages -= 1
openEnd = True def openPage(self,target):
tmp = True
while tmp:
try:
print 'open page..'
f = urllib2.urlopen(target).read()
print 'open successed!'
break
except:
tmp = True
return f def findNext(self,target):
global webhost
self.nextPage += 1
return webhost + '?p=' + str(self.nextPage) class AnalsPageThread(Thread):
def run(self):
global listPage
global pageLock
global openEnd
global analEnd
f = False
while not openEnd or len(listPage) != 0:
pageLock.acquire()
if len(listPage) != 0:
f = listPage.pop(0)
else:
f = False
pageLock.release()
if f != False:
self.analsPage(f)
analEnd = True def analsPage(self,target):
global listResu
global writLock
global listFilter
ul = r'<ul class="joblist"'
liItem = re.compile(r'<li.*?</li>',re.DOTALL)
ulStart = target.find(ul) target = target[ulStart:]
liList = liItem.findall(target) for item in liList:
# judge if has php
for key in listFilter:
if key.search(item):
writLock.acquire()
item = self.replaceHref(item)
listResu.append(item)
print 'analysis one item success!'
writLock.release()
break def replaceHref(self,item):
return item.replace('/cn','http://www.witmart.com/cn') class WritePageThread(Thread):
def __init__(self,pathTo):
Thread.__init__(self)
self.pathTo = pathTo def run(self):
global listResu
global writLock
global analEnd
f = open(self.pathTo + '/' + 'res.html','wb')
f.write(r'<html><body><ul>')
while analEnd == False or len(listResu) != 0:
writLock.acquire()
if (len(listResu) != 0):
liItem = listResu.pop(0)
f.write(liItem)
f.write('<br />')
print 'write one item success!'
writLock.release()
f.write('</ul></body></html>')
f.close() a = ReadPageThread()
b = AnalsPageThread()
c = WritePageThread(r'/home/wmydx/info') a.start()
b.start()
c.start()
【原创】编写多线程Python爬虫来过滤八戒网上的发布任务的更多相关文章
- 一个简单的多线程Python爬虫(一)
一个简单的多线程Python爬虫 最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模 ...
- python爬虫入门(八)Scrapy框架之CrawlSpider类
CrawlSpider类 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com CrawSpid ...
- python爬虫实战(八)--------知乎
相关代码已经修改调试成功----2017-4-22 一.说明 1.目标网址:知乎登入后的首页 2.实现:如图字段的爬取 zhihu_question表: zhihu_answer表: 3.数据:存放在 ...
- [Python爬虫] 之十八:Selenium +phantomjs 利用 pyquery抓取电视之家网数据
一.介绍 本例子用Selenium +phantomjs爬取电视之家(http://www.tvhome.com/news/)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字:融合:电视 抓 ...
- python爬虫入门八:多进程/多线程
什么是多线程/多进程 引用虫师的解释: 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期. 进程(有时被称为重量级进程)是 ...
- Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺
更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...
- 静听网+python爬虫+多线程+多进程+构建IP代理池
目标网站:静听网 网站url:http://www.audio699.com/ 目标文件:所有在线听的音频文件 附:我有个喜好就是听有声书,然而很多软件都是付费才能听,免费在线网站虽然能听,但是禁ip ...
- python爬虫之多线程、多进程+代码示例
python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...
- Python爬虫之多线程下载豆瓣Top250电影图片
爬虫项目介绍 本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
随机推荐
- SetDlgItemText控件运行错误
SetDlgltem函数把一个WM_SETTEXT消息发送到指定的控件. 今天在测试一个小程序,发现使用SetDlgItemText控件编译没问题,但是运行就出错误. 语句为: time=CTime: ...
- 获取CentOS软件源中的updates包
之前在本地网络中建了一个CentOS软件源,挺好用的,可是发现有些软件还是装不上,因为系统安装盘中的包并不全,有些软件的依赖在updates源中,updates源在网上,怎么把其中的包拿到呢?一种方法 ...
- HOG算子
原地址:http://blog.csdn.net/chlele0105/article/details/11991533 梯度直方图特征(HOG) 是一种对图像局部重叠区域的密集型描述符,它通过计算局 ...
- ffmpeg 频中分离 video audio 截取片断
1.获取视频的信息 ffmpeg -i video.avi 2,将图片序列分解合成视频 ffmpeg -i src.mpg image%d.jpg ffmpeg -f image2 -i ...
- 七古·夏泳小梅沙
七古·夏泳小梅沙 文/天地尘埃2020 近日与同学等海泳小梅沙,归后背黑而焦灼如针刺.一周后焦皮始脱尽,发现还是往日那个黄种人.涂鸦一文以记之. 一湾碧水青山前, 夏日方来酷暑煎. 疏狂仅仅愿清凉刻, ...
- C语言 - 结构体(struct)比特字段(:) 详细解释
结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...
- Android 从相冊获取近期拍摄的多张照片(获取相机拍照所存储的照片)
转载请标明出处:http://blog.csdn.net/android_ls/article/details/39928519 在做公司项目时.遇到的需求:自己定义显示照片的网格视图,显示用户近期採 ...
- xml(3)--dom4j实现crud操作
1.XML解析技术概述 (1)XML解析方式分为两种:dom和sax dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种标准方 ...
- NYOJ 104 最大子矩阵(二维DP)
最大和 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 给定一个由整数组成二维矩阵(r*c),如今须要找出它的一个子矩阵,使得这个子矩阵内的全部元素之和最大,并把这个 ...
- SSM框架理解(转)
SSM框架理解 最近两星期一直在学JavaEE的MVC框架,因为之前学校开的JavaEE课程就一直学的吊儿郎当的,所以现在真正需要掌握就非常手忙脚乱,在此记录下这段时间学习的感悟,如有错误,希望大牛毫 ...