ControlThread类
首先定义各种参数,及其对应的add_***函数,进行传递
analysis = None #url提取规则和html抽取规则
thread_run = True #线程运行状态
keyword = None #是否添加前缀的关键词 为add or replace
analysiss = None #前缀字符串
maximum = 1000 #最大爬虫运行次数
limit = None #进入url list 的限制,用正则表达式
operation_file = None #数据保存形式以列表传入。为
whether = True #是否进行多行正则匹配
sleeptime = 0 #线程休息时间
maxumunqueue = 100 #最大队列容量
urlList = [] #url列表
proxy_ip_list = [] #代理ip列表
modiftUrl
补全有缺陷的url,对其进行增加和替换,替换使用的是 HTMLAnalysis的modifyUrl
tip:这里使用xrange,xrange 是一个类,返回的是一个xrange对象。
使用xrange()进行遍历,每次遍历只返回一个值。
range()返回的是一个列表,一次性计算并返回所有的值。
因此,xrange()的执行效率要高于range()
judge_url
判断进入urllist的url是否满足limit的条件,正则匹配
tip:isinstance是用于判断对象的类型
queue_add_url
将url添加到队列中,并通过judge_url 进行判断
getHtmlUrl
从html获取url
有两种获取方式R , X
根据analysisDic的[‘url’][0]
前者是调用的是 HTMLAnalysis的findAll
后者是xpath
并使用modiftUrl进行补全
find_analysis
通过analysisDic字典找到url的解析方式,返回
write_start_url
初始化url队列
tip:
extend函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
*gerItem
解析html文档中所需的内容
有两种获取方式R , X
根据analysisDic的[‘url’][0]
前者是调用的是 HTMLAnalysis的findAll
后者是xpath
run
- 爬虫的运行逻辑
初始化 队列
初始化解析类
- 线程运行时循环
控制队列大小,在小于maxumunqueue时,url进入队列
队列为空,则跳出
- 队列不为空时循环
获取url
生成运行日志
线程不能运行则退出
能运行则判断内存使用量是否超过30%,若是,则释放内存
进入爬取
通过代理ip获取html页面
线程休息
find_analysis获取html解析的字典
getHtmlUrl 从html中提取url
queue_add_url将url添加到对队列中
定义listKey为analysisDic出去url键的字典
保存数据 分为json方式和mongodb方式- 定期释放内存
urllist超过10mb(calculation_mebibyte转换),不存入url
SaveData
save_data_json
ClearData.clear_dict_space先清除字典中的一些‘ ’
将Dic转成json文件格式
写入到文件中
tip:
json.dumps()json格式转换
save_data_mongodb
同样清除字典中的空格
client创立连接mogodb的地址
连接数据库db = client[‘name’]
连接聚集 posts =db[‘name’]
插入数据 posts.insert
关闭
ClearData
clear_dict_space
清除字典中的空格
需要进行类型判断,list,str,还是lxml.etree._Element再清理
tip:
str用strip()直接去除
lxml 用xpath(‘string(.)’)提取出字符串,之后strip()
clear_list_space
使用analysis_element对列表项目进行清理
并去除空项目
analysis_element
清除列表中lxml.etree._Element类中的空格
DownLoad
这个模块是专门为了下载相应url的html文档
getHtmlByU通过urllib2的模块进行下载速度较requests快
获得的文档是字节码没有进行任何转码
getHtmlByR
getHtmlByR通过requests的模块进行下载
getHtmlByU
getHtmlByU通过urllib2的模块进行下载速度较requests快
tip:
urllib2使用代理时,要自定义opener对象
urllib2.ProxyHandler({‘http’: proxyIp}) 代理ip字典
urllib2.HTTPCookieProcessor(cookielib.CookieJar()) Cookie处理
urlencode 将data编码
getHtmlByGAndF
这里使用grequests来进行代理ip并行访问
tip:
grequests用法:
urls = [‘****************’] rs = (grequests.get(u) for u in urls) grequests.map(rs)
HtmlAnalysis类
__init__
设定xpath的解析器的解析格式
self.parser = etree.HTMLParser(encoding=’utf-8’)
change_code
修改html编码格式,转化为utf-8‘’
tip:
chardet.detect 判断编码格式
decode 解码
encode 编码
search
判断匹配方式字符串是不是在html里
change_code 转换
之后通过re.search匹配
xpath
通过xpath方式对html对文档进行解析
*findAll
用正则表达式对文档进行解析
可以用whether参数决定是否多行匹配
modifyUrl
用re.sub来修改代替url
extract
把数据从element对象中提取出来
tip:
使用element.xpath(‘string(.)’)
* informationSplit
处理信息中的转义字符以及空格
tip:
split(str)
strip()
* getInformation*
使用 informationSplit来处理各种转义字符以及空格