【原创】编写多线程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, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
随机推荐
- SCU 3133(博弈)
传送门:windy和水星 -- 水星游戏 2 题意:在一张由 n*m 的格子组成的棋盘上放着 k 个骑士每个骑士的位置为(xi,yi),表示第xi行,第yi列骑士如果当前位置为(x,y),一步可以走的 ...
- hdu3496(二维背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3496 题意:题意是 DuoDuo 想看n部电影,但是被要求最长能看的总时间数为 L,每部电影有他的时长 ...
- LDA主题模型学习笔记3.5:变分參数推导
如今来推导一下得到变分參数更新式的过程.这一部分是在论文的附录中,为避免陷入过多细节而影响总体理解.能够在刚開始学习LDA的时候先不关注求解细节.首先要把L写成关于γ,ϕ\gamma,\phi函数.依 ...
- "ScrollView can host only one direct child"问题解决了
1. 问题叙述性说明: (请注意以下几点大胆). ScrollView作为顶层view时报错,直接导致apk崩溃.具体错误信息例如以下: 12-21 09:12:15.150: D/AndroidRu ...
- jquery关于表格隐藏和显示问题
1. 关于指定表格指定列隐藏显示 $(":checkbox[name*=month]").each(function(){ if(!$(this).attr("check ...
- 如何收集 EBS 各种相关业务的表的数据
1. Receiving 相关 參照 Note: 402245.1, 跑 rcv11i_sa.sql 就能够, 输入 po number, 其余默认. 參照 Note: 1294177.1, 假设上面 ...
- 内存分析工具 MAT 的使用
1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,当中有两项功能可用于内存检查 : · heap 查看堆的分配情况 · ...
- Bitmap
Bitmap篇 在前一篇中介绍了使用API做Distinct Count,但是计算精确结果的API都较慢,那有没有能更快的优化解决方案呢? 1. Bitmap介绍 <编程珠玑>上是这样 ...
- 安装ecshop提示“安装数据失败”或者“创建管理员帐号”
解决方法: 在install/includes/init.php文件的顶部,<?php 下增加: date_default_timezone_set ('Asia/Shanghai'); 即可 ...
- Redis 的性能幻想与残酷现实(转)
2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的 ...