本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于騰訊云 作者:Python進階者
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料, )
/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[@]/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、可以選擇自己喜歡的分類,獲取自己喜歡的菜譜,每個人都是廚師,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235232.html
標籤:Python
