Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗
介绍
本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容。
为了知道POST方法所需要传递的HTTP请求头部和请求体,我们可以使用Fiddler来进行抓包,抓取上网过程中HTTP请求中的POST方法。为了验证Fiddler抓取到的POST请求,可以使用Postman进行测试验证。在Postman中完成测试后,我们就可以用Python的request.POST()方法来写我们的爬虫了。
流程
作为上述过程的一个演示,我们使用的网址为: http://country.911cha.com/ , 页面如下:
在表单中输入德国,跳转后的页面如下:
我们可以发现,在搜索的结果中,会出现德国这个搜索结果。点击该搜索结果,跳转后的页面如下:
在这个页面中有我们需要的德国的国旗。但是,怎么知道该网页的具体网址呢?换句话说,就是怎样得到 http://country.911cha.com/GER.html ?别担心,在刚才出来的德国这个搜索结果中,我们查看其源代码,不难发现,在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代码,我们发现在E盘的flag文件夹下,已经下载了各个国家的国旗,如下:
这样我们就完成了本次爬虫的任务!
总结
本次爬虫利用Python的requests模块的POST方法,来模拟网页中的表单提交。为了得到表单提交过程中的HTTP请求,即请求头部和请求体,我们利用了抓包工具Fiddler,而Postman的作用是为了帮助我们验证Fiddler抓取的POST请求是否正是我们需要的POST请求,同时也能验证请求头部及请求体。
虽然整个爬虫的过程写的不免麻烦,但是操作的思路应该是清晰的,再说,熟能生巧,多用几次,也就能熟悉整个流程了。本次爬虫只是作为整个流程的一个简单展示,读者可以在此基础上,去实现更为复杂的爬虫,希望本次的分享能够帮助到读者。谢谢大家能读到这儿,也欢迎大家交流~~
注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
进化吧!我的C++!!
繁忙的日子似乎随着炎炎夏日渐渐远去,有人忙着放假,有人忙着旅游,有人忙着补觉……那么,你的选择呢?别急着告诉柳猫,请看完后面的内容再告诉我~~ 你有两个选择: 1)把所有夏季空闲时间都用来休整,适当放松一下没什么不可以。 2)或者你可以投入一部分空闲时间来提升你的技能,尤其是 C++ ,用 C++ 水平的提高(boost C++ )来开始新的一年。 如果你觉得选择1)更适合你,那么关掉手机和笔记本吧,真正地放松一下! 但是如果你倾向于选择2),那么这篇文章就是为你准备的。 有 7 种方法帮助你利用夏天真正提高 C++ 。之后我会给你一些小技巧来帮助你真正实现所选的目标。 1)开始一个项目 用 C++ 来建一个你自己的小项目是一个很好的试验方法,而且能通过这个项目真正理解程序的运行。另一个优点在于你可以完全自由地决定使用什么组件。这样你能够提升这一年没有权限/时间使用的语言特性和库组件。 在我去年的夏季项目中,我实现了一些区间适配器,这让我学到了超多东西。所以我会把这个项目的细节告诉你,这样你能够得到一些灵感来构建你自己的项目: 如果你不熟悉 C++ 中的区间(Ranges),请参考《R...
- 下一篇
Python全栈工程师
ParisGabriel Python 入门基础 print(“hello world”)变量 : 存储信息的,日后被调用、修改操作常量: 固定不变的量,字母大写命名规则:1. 字母数字下划线组成2. 不能以数字开头,不能含有特殊字符和空格3. 不能以保留字命名4. 不能以中文命名5. 定义的变量名应该有意义6. 驼峰式命、 下划线分割单词7. 变量名区分大小写a=1b=2if a<b: print("Yes") print("Yes") print("Yes") print("Yes")else: print("No")a=1b=2 if a>b: print("Yes") elif a==b: print("第三") else: print("any") if 条件1: 自拍elif 条件2: 蹦 else: 跳舞 # 单行注释'''多行注释'''""" 多行注释 """ input() "abc" + "qwe" file.py 文件的扩展名:.py : python的程序文件.txt : 文本文件pdf chm html doc xml xls ppt jp...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度