【原创】编写多线程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, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
随机推荐
- IP分类地址——a,b,c 类是如何划分的
今天IP网络使用32位地址,点分十进制格式,如172.16.0.0.地址格式:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址. IP地址类型 当互联网最初的设计,为了便于网络 ...
- 使用ffmpeg 对视频截图,和视频转换格式
//执行CMD命令方法 public static void CmdProcess(string command)//调用CMD { //实例化一个进程类 ...
- 计算机视觉与模式识别代码合集第二版three
计算机视觉与模式识别代码合集第二版three Topic Name Reference code Optical Flow Horn and Schunck's Optical Flow ...
- Ubuntu 问题解决汇总
汇总一些ubuntu相关的问题 1.Ubuntu支持安装多媒体播放插件(新系统安装后必备) ubuntu-restricted-extras package allows users to insta ...
- MATLAB——scatter的简单应用
scatter可用于描绘散点图. 1.scatter(X,Y) X和Y是数据向量,以X中数据为横坐标,以Y中数据位纵坐标描绘散点图,点的形状默认使用圈. 样例: X = [1:10]; Y = X ...
- SCU 3132(博弈)
传送门:windy和水星 -- 水星游戏 1 题意:在一张由 n*m 的格子组成的棋盘上放着 k 个骑士每个骑士的位置为(xi,yi),表示第xi行,第yi列骑士如果当前位置为(x,y),一步可以走的 ...
- hdu1565+hdu1569(最大点权独立集)
传送门:hdu1565 方格取数(1) 传送门:hdu1569 方格取数(2) 定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集 步骤: 1. 先染色,取一个点染白 ...
- Android中倒计时代码
布局: maina.xml <DigitalClock android:id="@+id/myClock" android:layout_width="wrap_c ...
- C#-循环滚动字幕,timer,从左至右,从右至左,暂停---ShinePans
Lable的Left属性是能够更改的,可是 Right属性不能够更改,所以我们能够利用 这个特点做自加 自减运算 using System; using System.Collections.Gene ...
- mongoDB 查询附近的人的语句
mongoDB 自带LBS查询附近的人 {"location":{ $nearSphere: { $geometry: { type : "Point", co ...