断点续传大规模爬虫

编写程序

一、count()方法

(1)python中的count()方法:统计字符串中子字符串的出现次数,统计列表中相同元素的出现次数。python中生成器不能用该方法。

(2)mongodb中collection的count()函数:统计条目数。在pymongo生成器可采用该方法。

二、pymongo把字典保存到mongodb后,字典中会自动添加一个mongodb的id键值对。

三、BeatifulSoup的find()与find_all(),python自带的find()和mongodb的find()

(1)find()的参数依次为(标签名,标签属性),返回一个标签(可多重嵌套)或None;

(2)find_all()的参数依次为(标签名,标签属性),返回一个标签列表或者空列表[];

(3)soup.find('head').find('title')可简写为soup.head.title。

(4)python的find()是字符串对象的方法,用于查找子字符串,返回第一个字串出现的位置或-1(字串不存在)。

(5)mongodb的find()是列表对象的方法,接收字典参数,键值对为所要查找条目键值对,用于查找条目,返回True

四、在引用其它py文件或其函数,列表,变量等等时,如果运行主程序,被引用的py文件中的可执行语句也会被执行,因此,所有的py文件都应该封装好再在主程序中引用。

五、requests抛出错误,达到最大连接次数仍然无法连接成功,说明对网站请求频率过高,应延长请求的时间间隔。

六、dict添加新的键值对用字典的setdefault(键,值)方法。

七、list和dict可以通过pop(位置)删除该位置的元素。

八、mongodb的查询方法find()与find_one()

find()方法成功找到符合条件的记录则返回一个生成器(实质是停留在符合条件记录的集合的第一条记录位置的cursor),用list方法转化为列表后,如果该存在符合条件的记录,则生成一个列表,否则生成一个空列表。

find_one({查询键值对},{显示字段:0表示不显示or1表示显示,其余默认不显示,'_id'默认显示})返回查询到的第一条。

特别注意:

(1)只返回第一条,没查询到返回null。

(2)find_one第二个参数留空则返回一条完整的记录。

九、BautifulSoup可以寻找下一个标签和内容,分别是next_sibling方法和next_element方法。

程序运行

中断常见原因:

(1)数组越界,BeautifulSoup没成功抓取,尝试按标签列表处理时出错。处理方式:所有抓取到的数据都要进行判断分析。

如果BautifulSoup的select方法没成功抓取,它会返回一个空列表[],空列表的bool值为False,通过代码:

if []:

run part1;

if not []:

run part2

可以进行正反判断。

(2)编码出错,所有需要保存的数据(写入文件或者写入数据库)都要先用encode('utf-8')编码为utf-8码再保存,读取时用decode解码为unicode码(大部分编程界面码)。为了避免出现类似错误,还可以将pycharm的程序编码设置为‘utf-8’。

编码错误有两个问题:

如果抓取的内容是utf-8编码的,抓取到后如果要在cmd运行界面print出来,有时就会报错:

UnicodeEncodeError: 'gbk' codec can't encode character

这个呢,并不是程序的编码有问题,问题是出在操作系统的默认编码上,windows的默认编码是‘gbk’,对有些unicode码并不能显示。

处理方法:不要设置print,直接将数据保存到mongodb数据库中。或者将数据用utf-8方式encode为bytes保存到mongodb中,不过这样查询起来非常不方便,因为都是bytes符号。建议采取第一个方式。

(3)网站达到最大连接次数仍无法成功连接,抓取动作太频繁,保存数据隔一段时间再抓。

你可能感兴趣的:(断点续传大规模爬虫)