目标:

以特定语言技术为关键字,爬取八戒网中网站设计开发栏目下发布的任务相关信息

需求:

用户通过设置自己感兴趣的关键字或正则表达式,来过滤信息。

我自己选择的是通过特定语言技术作为关键字,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爬虫来过滤八戒网上的发布任务的更多相关文章

  1. 一个简单的多线程Python爬虫(一)

    一个简单的多线程Python爬虫 最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模 ...

  2. python爬虫入门(八)Scrapy框架之CrawlSpider类

    CrawlSpider类 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com CrawSpid ...

  3. python爬虫实战(八)--------知乎

    相关代码已经修改调试成功----2017-4-22 一.说明 1.目标网址:知乎登入后的首页 2.实现:如图字段的爬取 zhihu_question表: zhihu_answer表: 3.数据:存放在 ...

  4. [Python爬虫] 之十八:Selenium +phantomjs 利用 pyquery抓取电视之家网数据

    一.介绍 本例子用Selenium +phantomjs爬取电视之家(http://www.tvhome.com/news/)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字:融合:电视 抓 ...

  5. python爬虫入门八:多进程/多线程

    什么是多线程/多进程 引用虫师的解释: 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期. 进程(有时被称为重量级进程)是 ...

  6. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  7. 静听网+python爬虫+多线程+多进程+构建IP代理池

    目标网站:静听网 网站url:http://www.audio699.com/ 目标文件:所有在线听的音频文件 附:我有个喜好就是听有声书,然而很多软件都是付费才能听,免费在线网站虽然能听,但是禁ip ...

  8. python爬虫之多线程、多进程+代码示例

    python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...

  9. Python爬虫之多线程下载豆瓣Top250电影图片

    爬虫项目介绍   本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:   本次爬虫项目将分别不使用多线程和使 ...

随机推荐

  1. Vim -&gt; 边确认边查找替换

    进行简单的全局查找替换的时候,能够使用ex的例如以下命令 :%s/which/what/g 它的使用方法比較简单 % 表示每一行(everyline) s 替换(substitue) which 查找 ...

  2. 利用Node.js实现模拟Session验证的登陆

    1.身份验证和用户登陆 在一般的Web应用上,假设要实现用户登陆,最经常使用,也是最简单的方法就是使用Session,主要的思路是在Session中保留一些用户身份信息,然后每次在Session中取, ...

  3. sql中的CHARINDEX和暂时表

    update #temp set #temp.Recycle=case when UnionA.num>0 then 1 else 0 end from (select GradeID,sum( ...

  4. HDU1754_I Hate It(线段树/单点更新)

    解题报告 题意: 略 思路: 单点替换,区间最值 #include <iostream> #include <cstring> #include <cstdio> ...

  5. JavaScript 中的闭包和作用域链(读书笔记)

    要想理解闭包,应当先理解JavaScript的作用域和作用域链. JavaScript有一个特性被称之为“声明提前(hoisting)”,即JavaScript函数里声明的所有变量(但不涉及赋值)都被 ...

  6. libevent安装总结 - jinfg2008的专栏 - 博客频道 - CSDN.NET

    libevent安装总结 - jinfg2008的专栏 - 博客频道 - CSDN.NET libevent安装总结 分类: linux 系统配置 2013-02-13 22:37 99人阅读 评论( ...

  7. python+ueditor+七牛云存储整合

    开发环境:python pyramid. 參考网址:http://developer.qiniu.com/docs/v6/sdk/python-sdk.html,http://my.oschina.n ...

  8. MD5 概念与用途

    MD5概念: MD5这是message-digest algorithm 5(信息-摘要算法)缩写.用于加密和解密技术上,它能够说是文件的"数字指纹".不论什么一个文件,不管是可运 ...

  9. C语言数组

    在C语言中,对于三维或三维以上数组的使用并没有很好的支持,而且使用率也非常的低,后面会对三维数组做一些简单的分析,这篇文章主要以二维数组来探讨一些C语言中数组使用的相关概念和技巧. 1 一个var[i ...

  10. IE8,IE9,IE10,FireFox 的CSS HACK

    #employeesView { top: 732px; //所有浏览器 top: 730px\9;//所有IE浏览器 } @media all and (min-width:0) { #employ ...