当前位置: 首页 > 科技观察

网络爬虫常见错误盘点

时间:2023-03-21 10:10:55 科技观察

大家好,我是皮皮。一、前言前几天在Python白银交流群里,一个叫【RainisRain】的粉丝问了一个关于Python网络爬虫的问题。在此分享给大家,共同学习。问题如下:2.求解过程。这里最容易产生的疑问之一是原来网页的结构发生了变化。如果使用xpath选择器提取,会出现不匹配,列表索引不在范围内,导致错误。[Python进阶]给了个思路,可以用try异常处理来避免,但是还是获取不到数据,确实有点迷惑。下午晚些时候【Python进阶】在跑他的代码的时候找到了原因,如下图。他这里的url结构有问题,多了一个/,导致网页访问出错。修改后即可运行。另外,在网页详情页有很多请求。记得睡一会儿,就没事了。下面是详细的代码,有兴趣的朋友可以拿来运行一下。importrequestsfromlxmlimportetreefromfake_useragentimportUserAgentimporttimeclasskitchen(object):u=0def__init__(self):self.url="https://www.xiachufang.com/category/40076/"ua=UserAgent(verify_ssl=False)foriinrange(1,50):self.headers={'User-Agent':ua.random,}'''发送请求获取响应'''defget_page(self,url):res=requests.get(url=url,headers=self.headers)html=res.content.decode("utf-8")time.sleep(2)返回htmldefparse_page(self,html):parse_html=etree.HTML(html)image_src_list=parse_html.xpath('//li/div/a/@href')foriinimage_src_list:try:url="https://www.xiachufang.com"+i#print(url)html1=self.get_page(url)#第二个生成请求parse_html1=etree.HTML(html1)#print(parse_html1)num=parse_html1.xpath('.//h2[@id="steps"]/text()')[0].strip()name=parse_html1.xpath('.//li[@class="container"]/p/text()')ingredients=parse_html1.xpath('.//td//a/text()')self.u+=1#print(self.u)#print(str(self.u)+"."+house_dict["Name:"]+":")#da=tuple(house_dict["Material:"])food_info='''%s蔬菜名称:%s成分:%s下载链接:%s,====================================================================='''%(str(self.u),num,ingredients,url)#print(food_info)f=open('打开厨房食谱.txt','a',encoding='utf-8')f.write(str(food_info))print(str(food_info))f.close()except:print('xpathdidnotget内容!')defmain(self):startPage=int(input("Startpage:"))endPage=int(input("Endpage:"))forpageinrange(startPage,endPage+1):url=self.url.format(page)html=self.get_page(url)self.parse_page(html)time.sleep(2.4)print("======================================页面%s已成功抓取====================================="%page)if__name__=='__main__':imageSpider=kitchen()imageSpider.main()的结果将被保存到一个txt文件里面,如下图所示:遇到这种url拼接问题,推荐使用urljoin。示例代码如下:fromurllib.parseimporturljoinsource_url='https://www.baidu.com/'child_url1='/robots.txt'child_url2='robots.txt'final_url1=urljoin(source_url,child_url1)final_url2=urljoin(source_url,child_url2)print(final_url1)print(final_url2)运行结果如下图所示:urljoin的作用是连接两个参数url,用第一个参数补上第二个参数缺失的部分范围。如果第二个参数有一个完整的路径,第二个将是主要的。3.总结大家好,我是皮皮。本文主要盘点一个网络爬虫中常见的错误问题。文章针对该问题给出了具体的分析和代码演示,帮助爱好者顺利解决问题。最后给大家介绍一个url拼接的方法,在网络爬虫中还是很常用的。最后感谢粉丝[RainisRain]的提问,感谢[Python进阶]的具体分析和代码演示,感谢粉丝[?]、[艾希·觉罗]、[Luna]、[dcpeng]、【余亮老师】等人参与了学习交流。小伙伴们赶紧练起来吧!如果你在学习过程中遇到什么问题,欢迎加我为好友,我会拉你进Python学习交流群一起讨论学习。