编写程序
一、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)网站达到最大连接次数仍无法成功连接,抓取动作太频繁,保存数据隔一段时间再抓。