盘点一个网络爬虫中常见的一个错误
回复“书籍”即可获赠Python从入门到进阶共10本电子书
今
日
鸡
汤
圣朝无阙事,自觉谏书稀。大家好,我是皮皮。
一、前言前几天在Python白银交流群有个叫【雨就是雨】的粉丝问了一个Python网络爬虫的问题,这里拿出来给大家分享下,一起学习下。
问题如下:
二、解决过程这里很容易的一个怀疑点是原网页上的网页结构变化了,使用xpath选择器进行提取的话,会出现不匹配的情况,列表索引不在范围内,引起报错。
【Python进阶者】给出了一个思路,确实可以使用try异常处理来避开,不过始终拿不到数据,确实有点让人头大。
后来下午的时候【Python进阶者】跑他代码的时候发现了原因,如下图所示。
他的url这里,构造有问题,多了一个/,导致网页访问出错。
修改下,就可以跑了,另外,网页详情页里边也有多次请求,记得稍微sleep下,就可以了。下面是详细代码,感兴趣的小伙伴们,可以拿去跑下。
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)returnhtmldefparse_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["名称:"]+":")#da=tuple(house_dict["材料:"])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("xpath没获取到内容!")defmain(self):startPage=int(input("起始页:"))endPage=int(input("终止页:"))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,将第二个参数中缺的部分用第一个参数的补齐,如果第二个有完整的路径,则以第二个为主。
三、总结大家好,我是皮皮。这篇文章主要盘点一个网络爬虫中常见的一个错误问题,文中针对该问题给出了具体的解析和代码演示,帮助粉丝顺利解决了问题。最后给大家安利了一个url拼接的方法,在网络爬虫中还是非常常用的。
最后感谢粉丝【雨就是雨】提问,感谢【Python进阶者】给出的具体解析和代码演示,感谢粉丝【꯭】、【艾希·觉罗】、【月神】、【dcpeng】、【瑜亮老师】等人参与学习交流。
小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何Python问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。
-------------------End-------------------
往期精彩文章推荐:
盘点Python内置函数sorted()高级用法实战
手把手教你进行Python网络爬虫中的Charles+Postern抓包
Python网络爬虫之数美滑块的加密及轨迹~~动态js参数分析
盘点Python集合中一个“坑”
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...