天天看点

Python网络爬虫中常用第三方库总结一、re二、json三、xpath四、threading五、multiprocessing六、pymysql七、mechanize八、readability

python对于爬虫的编写已经是相当的友好了,不过除了利用requests库或者scrapy框架之外,有一些库还需要我们知道,以便于我们更熟练、便捷的完成目标数据的爬取,接下来我就总结一下我认为在爬虫中常用的几个库。

一、re

re库是正则表达式库,是regex的缩写,用于从网页源码或者数据文件中提取我们所需的数据,具体使用方法如下:

①闯进过滤字符串的规定,一般用变量regex存储;

②将规则编译:pattern = re.compile(regex)

③使用规则进行查找:content = re.findall(pattern, html)

对于re库来说,最难的便是编写出相应的过滤规则,曾看到过这样一句话:如果一个问题你用了正则,那么就变成了两个问题。  接触过正则的也都知道它确实存在一定的难度性,下面是我对常用的符号用法的总结:

‘*’:匹配前面的子表达式零次或无数次;‘+’:匹配前面的子表达式一次或无数次;

‘.’:匹配除换行符\n以外的任何单字符;‘?‘:匹配前面的子表达式零次或一次;

’^':匹配输入字符串开始位置;‘$’:匹配输入字符串的结尾位置

‘\w':匹配字母、数字、下划线;’\d‘:匹配数字;

’\s':匹配空格;反义:将前面的字母改为大写,即指原义的反义;

‘{n}’:重复n次;‘{n,m}’:重复n到m次;

‘{n, }':重复n次或更多次;’?<=exp‘:匹配exp后的信息;如 How are you:(?<txt>(?<=How).+)

‘(?=exp)’:匹配exp前面的位置,如 How are you doing:(?<txt>.+(?=ing)) 这里取ing前所有字符,并定义txt为捕获分组名。

二、json

json是本身是一种存储格式,与python中的字典比较类似。因为我们在爬取时可能直接爬取到json格式数据,或者为方便后面的  使用需要将爬取数据转为json数据。因此学会运用json库,可以更加方便地提取我们所需数据。json中常用操作有: ①dumps:将python对象编码成json字符串。 其中一个参数为ensure_ascii,默认为True,若出现non-ascii字符,则出现\uxxxx,设为False即可。 ②loads:用于解码json数据,返回python字段数据类型。 ③encode:在转json文件时将文件编码转为utf-8 ④decode:用于转为python类型时文件的解码。

三、xpath

同样是数据解析包,得到网页响应后传入xpath表达式,结果返回表达式所对应所有节点列表,如scrapy中:response.xpath()。 extract():在提取节点中特定数据时后面要加,序列化该节点为unicode字符串并返回列表,后面可跟encode转码。如:

item['workType'] = data.xpath('./td[2]/text()').extract()[0]

           

xpath提取例子: ①/html/head/title/text():选择<html>下<head>下<title>元素的文字。 ②//td:选择所有<td>元素,用 | 实现或操作,用 and 实现且操作。 ③//div[@class='mine']:选择所有具有class='mine'属性的div元素,返回节点列表。 注:若要提取链接,定位到标签内部吼,后面加上 /@href 即可获取到标签内的链接。

四、threading

该库是Python中实现多线程加速的第三方库,具体用法如下: ①创建待加速函数,如爬取函数spider(url)。 ②对每个url创建多线程:threading.Thread(target=spider, args=(u,)); 注意:在Thread中的参数分别是待加速函数和待加速函数的参数,这两个是分开写的!! ③随后使用.start()开始加速,将所创多线程加入到所建threadlist中。 ④最后使用 .join() 即可, 遍历threadlist,完成加速

五、multiprocessing

multiprocessing一般用来实现多进程加速,使用方法类似于threading,具体如下: ①一般使用from multiprocessing import Process 导入多进程加速方法。 ②创建待加速函数,如爬取函数spider(url)。 ③对每个url创建多进程:p = Process(target=spider, args=(u,)); 注意:在Process中的参数与上述多线程加速一样,也将函数与所传参数分开写!! ④最后使用 p.start() 即可。

六、pymysql

pymysql提供了python与mysql数据库相连的接口,即利用该库可以实现python与mysql数据库的连接,具体操作如下: ①创建连接:conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='对应名', charset='utf-8') ②创建游标:cursor = conn.cursor() ③执行sql语句,并返回受影响行数:effect_row = cursor.execute("select * from table") ④提交:conn.commit() ⑤关闭游标与连接:cursor.close(); conn.close()

七、mechanize

利用mechanize,可以实现对浏览器行为更好的模拟,常用有以下模拟方法: ①Browser():创建(打开)浏览器。 ②open():打开网页。 ③links():获取网页中所有链接;可以遍历 links() 方法,其下还有 .base_url 与 .url 属性。 ④forms():获取所有表单。 ⑤form[‘form_name’]:填写名为form_name表单中的信息。 ⑥submit():提交表单。 ⑦response().read():查看提交表单后的结果。 ⑧addheaders变量:存放用于欺骗服务器的表头。 mechanize中包含了许多模拟浏览器设置,如处理机器人协议等,具体使用时,具体查询即可,常用的一系列设置如下:

#options
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

#Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)
           

八、readability

readability是专门用于网页正文内容提取的第三方库,平时用的不多,但是可以轻松实现提取: ①导入:from readability.readability import Document ②使用: 正文:readable_article = Document(urllib.urlopen(url).read()).summary() 题目:readable_title = Document(urllib.urlopen(url).read()).short_title()

以上八个库便是在完成爬虫时常需借助的第三方库,愿能够为大家带来帮助。