王优秀 手把手教你使用Python网络爬虫获取菜谱信息

在放假时 , 经常想尝试一下自己做饭 , 下厨房这个网址是个不错的选择 。
【王优秀 手把手教你使用Python网络爬虫获取菜谱信息】下厨房是必选的网址之一 , 主要提供各种美食做法以及烹饪技巧 。 包含种类很多 。
今天教大家去爬取下厨房的菜谱 , 保存在world文档 , 方便日后制作自己的小菜谱 。
王优秀 手把手教你使用Python网络爬虫获取菜谱信息
文章图片
/2项目目标/
获取菜谱 , 并批量把菜名、原料、下载链接、下载保存在world文档 。
/3项目准备/
软件:PyCharm
需要的库:requests、lxml、fake_useragent、time
网站如下:
https://www.xiachufang.com/explore/?page={}
点击下一页时 , 每增加一页page自增加1 , 用{}代替变换的变量 , 再用for循环遍历这网址 , 实现多个网址请求 。
/4反爬措施的处理/
主要有两个点需要注意:
1、直接使用requests库 , 在不设置任何header的情况下 , 网站直接不返回数据
2、同一个ip连续访问多次 , 直接封掉ip , 起初我的ip就是这样被封掉的 。
为了解决这两个问题 , 最后经过研究 , 使用以下方法 , 可以有效解决 。
1)获取正常的http请求头 , 并在requests请求时设置这些常规的http请求头 。
2)使用fake_useragent , 产生随机的UserAgent进行访问 。
/5项目实现/
1、定义一个class类继承object , 定义init方法继承self , 主函数main继承self 。 导入需要的库和网址 , 代码如下所示 。
importrequestsfromlxmlimportetreefromfake_useragentimportUserAgentimporttimeclasskitchen(object):def__init__(self):self.url=''https://www.xiachufang.com/explore/?page={}''defmain(self):passif__name__=='__main__':imageSpider=kitchen()imageSpider.main()
2、随机产生UserAgent 。
foriinrange(1,50):self.headers={'User-Agent':ua.random,}
3、发送请求获取响应,页面回调 , 方便下次请求 。
defget_page(self,url):res=requests.get(url=url,headers=self.headers)html=res.content.decode(''utf-8'')returnhtml
4、xpath解析一级页面数据,获取二级页面网址 。
defparse_page(self,html):parse_html=etree.HTML(html)image_ src_list=parse_html.xpath('//li/div/a/@href')
5、for遍历 , 定义一个变量food_info保存 , 获取到二级页面对应的菜名、原料、下载链接 。
foriinimage_ src_list: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()')food_info='''第%s种菜名:%s原料:%s下载链接:%s,================================================================='''%(str(self.u),num,ingredients,url)
6、保存在world文档 。
f=open('下厨房/菜谱.doc','a',encoding='utf-8')#以'w'方式打开文件f.write(str(food_info))f.close()
7、调用方法 , 实现功能 。
html=self.get_page(url)self.parse_page(html)
8、项目优化
1)方法一:设置时间延时 。
time.sleep(1.4)
2)方法二:定义一个变量u,for遍历 , 表示爬取的是第几种食物 。 (更清晰可观) 。
u=0self.u+=1;
/6效果展示/
1、点击绿色小三角运行输入起始页 , 终止页 。
王优秀 手把手教你使用Python网络爬虫获取菜谱信息
文章图片
2、运行程序后 , 结果显示在控制台 , 如下图所示 。


推荐阅读