摘要:流程作為上述過程的一個演示,我們使用的網址為頁面如下在表單中輸入德國,跳轉后的頁面如下我們可以發(fā)現,在搜索的結果中,會出現德國這個搜索結果。點擊該搜索結果,跳轉后的頁面如下在這個頁面中有我們需要的德國的國旗。
介紹
??本篇博客將會介紹一個Python爬蟲,用來爬取各個國家的國旗,主要的目標是為了展示如何在Python的requests模塊中使用POST方法來爬取網頁內容。
??為了知道POST方法所需要傳遞的HTTP請求頭部和請求體,我們可以使用Fiddler來進行抓包,抓取上網過程中HTTP請求中的POST方法。為了驗證Fiddler抓取到的POST請求,可以使用Postman進行測試驗證。在Postman中完成測試后,我們就可以用Python的request.POST()方法來寫我們的爬蟲了。
??作為上述過程的一個演示,我們使用的網址為: http://country.911cha.com/ , 頁面如下:
在表單中輸入德國,跳轉后的頁面如下:
我們可以發(fā)現,在搜索的結果中,會出現德國這個搜索結果。點擊該搜索結果,跳轉后的頁面如下:
在這個頁面中有我們需要的德國的國旗。但是,怎么知道該網頁的具體網址呢?換句話說,就是怎樣得到http://country.911cha.com/GER... ?別擔心,在剛才出來的德國這個搜索結果中,我們查看其源代碼,不難發(fā)現,在HTML源代碼中,有我們想要的東西:
在源代碼中我們能看到“GER.html”,這就意味著,只要得到搜索的結果,我們可以分析HTML源碼來得到這個搜索結果的連接網址,然后在該連接網址中獲取該國的國旗。所以,在這個爬蟲中,最困難的地方在于,如何獲取搜索結果?即,得到提交表單后的結果,也就是POST方法提交后的響應結果。我們利用Fiddler來抓取該POST方法。
??我們打開Fiddler, 同時重復上面的操作,可以得到該過程的HTTP請求,如下圖:
Fiddler幫助我們找到了剛才提交表單過程中的一個POST請求,具體分析該POST請求,其請求頭部如下:
其請求體如下:
??為了驗證Fiddler抓取的POST請求,我們需要要Postman來進行測試。在用Postman進行測試前,我們需要問:是否所有請求頭部中的數據都需要呢?答案是否定的,實際上,我們只需要User-Agent和Content-Type即可。在Postman中,先輸入請求頭部,如下:
再輸入請求體,如下:
點擊"SEND"按鈕,得到響應后的結果,如下:
OK,這樣我們就完成了Postman的測試。
爬蟲??于是,借助這些信息來完成request.post()的提交,同時,借助BeautifulSoup來解析網頁,得到國家的國旗下載地址并完成下載。具體的Python代碼如下:
# -*- coding: utf-8 -*- import urllib.request import requests from bs4 import BeautifulSoup # 函數:下載指定國家的國旗 # 參數: country: 國家 def download_flag(country): # 請求頭部 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } # POST數據 data = {"q": country} # 網址 url = "http://country.911cha.com/" # 提交POST請求 r = requests.post(url=url, data=data, headers=headers) # 利用BeautifulSoup解析網頁 content = BeautifulSoup(r.text, "lxml") # 得到搜索結果(國家)所在網頁地址 country = content.find_all("div", class_="mcon")[1]("ul")[0]("li")[0]("a")[0] link = country["href"] #利用GET方法得到搜索國家的網頁 r2 = requests.get(url="%s/%s"%(url, link)) # 利用BeautifulSoup解析網頁 content = BeautifulSoup(r2.text, "lxml") # 獲取網頁中的圖片 images = content.find_all("img") # 獲取指定國家的國旗名稱及下載地址 for image in images: if "alt" in image.attrs: if "國旗" in image["alt"]: name = image["alt"].replace("國旗", "") link = image["src"] # 下載國旗圖片 urllib.request.urlretrieve("%s/%s"%(url, link), "E://flag/%s.gif"%name) def main(): # countries.txt儲存各個國家的名稱 file = "E://flag/countries.txt" with open(file, "r") as f: counties = [_.strip() for _ in f.readlines()] # 遍歷各個國家,下載國旗 for country in counties: try: download_flag(country) print("%s國旗下載成功!"%country) except: print("%s國旗下載失敗~"%country) main()
其中countries.txt的部分內容如下:
運行上述Python代碼,我們發(fā)現在E盤的flag文件夾下,已經下載了各個國家的國旗,如下:
這樣我們就完成了本次爬蟲的任務!
總結??本次爬蟲利用Python的requests模塊的POST方法,來模擬網頁中的表單提交。為了得到表單提交過程中的HTTP請求,即請求頭部和請求體,我們利用了抓包工具Fiddler,而Postman的作用是為了幫助我們驗證Fiddler抓取的POST請求是否正是我們需要的POST請求,同時也能驗證請求頭部及請求體。
??雖然整個爬蟲的過程寫的不免麻煩,但是操作的思路應該是清晰的,再說,熟能生巧,多用幾次,也就能熟悉整個流程了。本次爬蟲只是作為整個流程的一個簡單展示,讀者可以在此基礎上,去實現更為復雜的爬蟲,希望本次的分享能夠幫助到讀者。謝謝大家能讀到這兒,也歡迎大家交流~~
注意:本人現已開通兩個微信公眾號: 因為Python(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關注哦~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41918.html
摘要:介紹本篇博客將繼續(xù)上一篇博客爬蟲之使用的模塊爬取各國國旗的內容,將用來實現這個爬蟲,下載全世界國家的國旗圖片。 介紹 ??本篇博客將繼續(xù)上一篇博客:Python爬蟲之使用Fiddler+Postman+Python的requests模塊爬取各國國旗 的內容,將用Java來實現這個爬蟲,下載全世界國家的國旗圖片。項目不再過多介紹,具體可以參考上一篇博客。??我們將全世界國家的名稱放在一個...
摘要:想辦法區(qū)分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態(tài)圈完善,是最大對手。最要命的是爬蟲需要經常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當做蜘...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:爬蟲架構架構組成管理器管理待爬取的集合和已爬取的集合,傳送待爬取的給網頁下載器。網頁下載器爬取對應的網頁,存儲成字符串,傳送給網頁解析器。從文檔中獲取所有文字內容正則匹配后記爬蟲基礎知識,至此足夠,接下來,在實戰(zhàn)中學習更高級的知識。 前言 Python非常適合用來開發(fā)網頁爬蟲,理由如下:1、抓取網頁本身的接口相比與其他靜態(tài)編程語言,如java,c#,c++,python抓取網頁文檔的接...
摘要:通過本文的學習,可以快速掌握網絡爬蟲基礎,結合實戰(zhàn)練習,寫出一些簡單的爬蟲項目。從技術手段來說,網絡爬蟲有多種實現方案,如。二網絡爬蟲技術基礎在本次課中,將使用技術手段進行項目的編寫。 摘要:本文詳細講解了python網絡爬蟲,并介紹抓包分析等技術,實戰(zhàn)訓練三個網絡爬蟲案例,并簡單補充了常見的反爬策略與反爬攻克手段。通過本文的學習,可以快速掌握網絡爬蟲基礎,結合實戰(zhàn)練習,寫出一些簡單的...
閱讀 2404·2021-11-24 09:39
閱讀 3223·2021-10-09 09:53
閱讀 1130·2021-09-22 16:06
閱讀 4441·2021-09-02 10:18
閱讀 799·2021-08-23 09:42
閱讀 1760·2021-08-17 10:11
閱讀 2685·2019-08-30 13:02
閱讀 2120·2019-08-30 12:49