以人人车(https://www.renrenche.com/)为爬取对象
在获取列表页(https://www.renrenche.com/bd/ershouche/p1)的所有汽车概述信息所在标签时,可以用BeautifulSoup的两种方法:
car_info1 = soup.find_all('a', 'thumbnail') # fin_all 方法:'a'为标签,'thumbnail'为class属性
car_info2 = soup.select('li.span6.list-item.car-item a.thumbnail') # select 方法:'li'为'a'的父节点,'span6.list-item.car-item'为'li'的class属性,'thumbnail'为'a'的class属性
课程里(http://sp.lovedata.cn/course/141/learn#lesson/2004)获取基础信息的示范,是将基础信息框架中包含的具体信息内容,在for循环语句前就提取出来(注:for循环语句之前得i到各车辆信息的结果列表,for循环语句则将结果列表依次输出),窃以为,这样可能会造成依次输出的结果并非对应匹配。
即,原始信息:车辆信息A: [a1, a2, a3],车辆信息B: [b1, b2, b3],车辆信息C: [c1, c2, c3]
for循环语句前抓取的结果列表:O: [a1, b1, c1], P: [a2, b2, c2], Q: [a3, b3, c3]
for循环输出的结果:[a1, a2, a3],[b1, b2, b3],[c1, c2, c3],也就是得到了原始信息。
但,若因某种原因,车辆信息A之前,出现了一个x3,
则for循环语句前抓取的结果列表:O': [a1, b1, c1], P': [a2, b2, c2], Q': [x3, a3, b3]
for循环输出的结果:[a1, a2, x3],[b1, b2, a3],[c1, c2, b3]
——现不知道会不会有这种情况出现,若出现,则后期要再查找或剔除错误项,会比较困难(标号为3的字段皆不能用,a, b, c的数据皆受影响)
窃以为,有一种方式可以对应上述错误匹配情形的出现:基础信息框架中包含的具体信息内容,在for循环语句之中提取出来,只要获取到a, b, c所在的信息框架,那么a, b, c的信息分别都是独立的,不会互相影响(即便c的字段与a, b不同,也不会干扰a和b);后续倘若要剔除错误项,删除单一项或若干项(如c)即可,不会出现影响整一个字段的情况。
service_fee = soup.select('p.box-service')[0].strong.text # BeautifulSoup的写法,后面可直接跟前部结果里面的一个标签
service_fee = soup.select('p.box-service strong')[0].text
以上两行代码的结果是一样的,都是获取p标签下的strong标签内容。
遇到的错误/警告:
(1) This code is unreachable.
return abc
print abc
后来知道return 语句之后,是再不执行的,所以print 语句就无效了。需要执行的话,放在return 语句之前就好了
(2) Exceeded 30 redirects.
错误在循环中的个别处出现。
网上搜索到这句意思是重定向次数太多,为防止耗尽CPU而被强制终止了(链接);既然是浏览器问题,而我又设置了在每次循环中将user agent信息在user agent列表中随机获取一个,结合“错误在循环中的个别处出现”这一情况,猜测问题可能出在user agent列表中。
-->将随机获取user agent信息,改为固定某一user agent信息,挨个排查,果然发现,原来是
'Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50' 这个信息有问题。删去后便不再出现该错误信息。
快捷键:
光标变粗:按insert变回来
批量修改变量名:选中后shift+F6
备忘:
课程建议将错误处理放在最后,会比较简单