Python爬蟲之使用Fiddler+Postman+Python的requests模塊爬取各國國旗

介紹

  本篇博客將會介紹一個Python爬蟲,用來爬取各個國家的國旗,主要的目標是爲了展現如何在Python的requests模塊中使用POST方法來爬取網頁內容。
  爲了知道POST方法所須要傳遞的HTTP請求頭部和請求體,咱們可使用Fiddler來進行抓包,抓取上網過程當中HTTP請求中的POST方法。爲了驗證Fiddler抓取到的POST請求,可使用Postman進行測試驗證。在Postman中完成測試後,咱們就能夠用Python的request.POST()方法來寫咱們的爬蟲了。html

流程

  做爲上述過程的一個演示,咱們使用的網址爲: http://country.911cha.com/ , 頁面以下:python

在表單中輸入德國,跳轉後的頁面以下:web

咱們能夠發現,在搜索的結果中,會出現德國這個搜索結果。點擊該搜索結果,跳轉後的頁面以下:微信

在這個頁面中有咱們須要的德國的國旗。可是,怎麼知道該網頁的具體網址呢?換句話說,就是怎樣獲得http://country.911cha.com/GER... ?別擔憂,在剛纔出來的德國這個搜索結果中,咱們查看其源代碼,不難發現,在HTML源代碼中,有咱們想要的東西:app

在源代碼中咱們能看到「GER.html」,這就意味着,只要獲得搜索的結果,咱們能夠分析HTML源碼來獲得這個搜索結果的鏈接網址,而後在該鏈接網址中獲取該國的國旗。因此,在這個爬蟲中,最困難的地方在於,如何獲取搜索結果?即,獲得提交表單後的結果,也就是POST方法提交後的響應結果。咱們利用Fiddler來抓取該POST方法。
  咱們打開Fiddler, 同時重複上面的操做,能夠獲得該過程的HTTP請求,以下圖:函數

Fiddler幫助咱們找到了剛纔提交表單過程當中的一個POST請求,具體分析該POST請求,其請求頭部以下:工具

其請求體以下:post

  爲了驗證Fiddler抓取的POST請求,咱們須要要Postman來進行測試。在用Postman進行測試前,咱們須要問:是否全部請求頭部中的數據都須要呢?答案是否認的,實際上,咱們只須要User-Agent和Content-Type便可。在Postman中,先輸入請求頭部,以下:測試

再輸入請求體,以下:url

點擊"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代碼,咱們發如今E盤的flag文件夾下,已經下載了各個國家的國旗,以下:

這樣咱們就完成了本次爬蟲的任務!

總結

  本次爬蟲利用Python的requests模塊的POST方法,來模擬網頁中的表單提交。爲了獲得表單提交過程當中的HTTP請求,即請求頭部和請求體,咱們利用了抓包工具Fiddler,而Postman的做用是爲了幫助咱們驗證Fiddler抓取的POST請求是否正是咱們須要的POST請求,同時也能驗證請求頭部及請求體。
  雖然整個爬蟲的過程寫的難免麻煩,可是操做的思路應該是清晰的,再說,熟能生巧,多用幾回,也就能熟悉整個流程了。本次爬蟲只是做爲整個流程的一個簡單展現,讀者能夠在此基礎上,去實現更爲複雜的爬蟲,但願本次的分享可以幫助到讀者。謝謝你們能讀到這兒,也歡迎你們交流~~

注意:本人現已開通兩個微信公衆號: 由於Python(微信號爲:python_math)以及輕鬆學會Python爬蟲(微信號爲:easy_web_scrape), 歡迎你們關注哦~~

相關文章
相關標籤/搜索