【原创】编写多线程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, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
随机推荐
- [Android学习笔记]自定义控件的使用
自定义控件时,最好抽象得彻底,并且编写需严谨,因为可能程序中多处都会引用到它,或者提供给团队中的其他人使用. 其一般步骤为: 1.创建控件的类文件,定义其功能逻辑.一般继承自现有控件或者View2.在 ...
- [Android学习笔记]some tips
集合合并去重: listA.removeAll(listB); listA.addAll(listB); android:singleLine="true"//单行显示 andro ...
- LCS最大公共子序列问题
在生物应用中,经常需要比较两个(或多个)不同生物体的DNA, 例如:某种生物的DNA可能为S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA, 另一种生物的DNA可能为S2=GTCGTT ...
- Codeforces Round #296 (Div. 2) A. Playing with Paper
A. Playing with Paper One day Vasya was sitting on a not so interesting Maths lesson and making an o ...
- ArcGIS多面体(multipatch)解析——引
多面体(multipatch)结构在ArcGIS数据结构中是与点.线.面平行的一种数据结构,对于ArcGIS三维来说是一个很核心的结构,有了它,ArcGIS平台才可以灵活的描述规则和不规则的三维实体. ...
- HTML5系列之——applicationCache对象
ApplicationCache主要简单介绍: applicationCache对象实现HTML5相应WEB离线功能.以下我们来主要解说applicationCache对象的一些主要功能和方法 app ...
- no copy constructor available or copy constructor is declared 'explicit'
今天新写了一个类.然后对这个类使用STL中的vector,碰到错误: no copy constructor available or copy constructor is declared 'ex ...
- java的url
中国的争论导致了扭曲
话不多说,,直接粘代码 发件人 UrlParaCode.jsp <%@ page language="java" import="java.util.*" ...
- H3C TE老版本OSPF正确配置
R1配置: ---------------------------------------------------- # sysname RT1# super password level 3 cip ...
- NTFS权限设置时卡死
客户是一家技术咨询和零部件制造的小公司,使用的文件服务器为R410上插4块1T硬盘做raid 5,服务器操作系统为windows server 2008R2,所有的设计资料的授权都是结合域账户和NTF ...