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:(?(?<=How).+)
‘(?=exp)’:匹配exp前面的位置,如 How are you doing:(?.+(?=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():选择下
下元素的文字。②//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()
以上八个库便是在完成爬虫时常需借助的第三方库,愿能够为大家带来帮助。