點擊上方“Python爬蟲與數據挖掘”,進行關注
回覆“書籍”即可獲贈Python從入門到進階共10本電子書
今
日
雞
湯
一腔熱血勤珍重,灑去猶能化碧濤。
/1 前言/
在放假時 ,經常想嘗試一下自己做飯,下廚房這個網址是個不錯的選擇。
下廚房是必選的網址之一,主要提供各種美食做法以及烹飪技巧。包含種類很多。
今天教大家去爬取下廚房的菜譜 ,保存在world文檔,方便日後製作自己的小菜譜。
/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。導入需要的庫和網址,代碼如下所示。
import requests
from lxml import etree
from fake_useragent import UserAgent
import time
class kitchen(object):
def __init__(self):
self.url = "https://www.xiachufang.com/explore/?page={}"
def main(self):
pass
if __name__ == '__main__':
imageSpider = kitchen()
imageSpider.main()
2、隨機產生UserAgent。
for i in range(1, 50):
self.headers = {
'User-Agent': ua.random,
}
3、發送請求 獲取響應, 頁面回調,方便下次請求。
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
return html
4、xpath解析一級頁面數據,獲取二級頁面網址。
def parse_page(self, html):
parse_html = etree.HTML(html)
image_src_list = parse_html.xpath('//li/div/a/@href')
5、for遍歷,定義一個變量food_info保存,獲取到二級頁面對應的菜 名、 原 料 、下 載 鏈 接。
for i in image_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 = 0
self.u += 1;
/6 效果展示/
1、點擊綠色小三角運行輸入起始頁,終止頁。
2、運行程序後,結果顯示在控制檯,如下圖所示。
3、將運行結果保存在world文檔中,如下圖所示。
4、雙擊文件,內容如下圖所示。
/7 小結/
1、本文章基於Python網絡爬蟲,獲取下廚房網站菜譜信息,在應用中出現的難點和重點,以及如何防止反爬,做出了相對於的解決方案。
2、介紹瞭如何去拼接字符串,以及列表如何進行類型的轉換。
3、代碼很簡單,希望能夠幫到你。
4、歡迎大家積極嘗試,有時候看到別人實現起來很簡單,但是到自己動手實現的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,纔可以理解的更加深刻。
5、可以選擇自己喜歡的分類,獲取自己喜歡的菜譜,每個人都是廚師。
6、如果需要本文源碼的話,請在公衆號後臺回覆“廚房”兩個字進行獲取,覺得不錯,記得給個star噢。
------------------- End -------------------
往期精彩文章推薦:
歡迎大家點贊,留言,轉發,轉載,感謝大家的相伴與支持
想加入Python學習羣請在後臺回覆【入羣】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩個您使用過的Python庫~~