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), 欢迎你们关注哦~~

相关文章
相关标签/搜索