前言:期待已久的科研项目终于有眉目了,这是第一次去找研究生老师做项目,由于时间关系,老师没能给我安排上任务,叫我和一个研究生学长交接工作。第一个叫我解决的网站就是《贵州农经网》,由于有一个验证码,他也不得其解。后来发了一篇秀璋老师写的文章给我学习,这是秀璋老师在2017年写的爬虫,当时的网站还没有验证码,所以会简单很多,和如今的需求已经不一样了。
贵州农经网: 中国百强农业网站,贵州省优秀政府网站,是贵州省委、省政府为促进农业增效,促进农民增收而建立的省、地、县、乡四级农村综合经济信息网。
爬取网站: http://www.gznw.com/eportal/ui?pageId=595091
文章目录
1、分析网页
我认为学习网络爬虫的关键是分析网页数据的加载方式,然后再模拟客户端去请求数据。
1.1、分析数据加载的步骤
1. 先到搜索页面搜索某个商品,加载信息,如我以线椒为例:
经过测试,只有输入验证码,验证正确后才能拿到到数据,对于这种必须要验证码的网页,我们可以选择selenium来爬取,但是我们先再看看其他的方式,如获取到数据传输通道,直接实现查询功能,这样的话速度就比selenium快很多!
2. 分析URL
直接点击“下一页”,发现URL并没有什么变化,还是和以前是一样的,可以简单猜想这个数据是通过某种通道加载的,现在来检验一下。
3、寻找数据加载通道
这个方式也可以叫做数据抓包,找到这个通道后,就可以直接通过这个通道截取数据。
第一步:右击–>检查
第二步:打开Network,选择All
第三步:输入验证码,点击查询加载数据
第四步:寻找数据传输通道
从加载出来的结果来看,并不是很多,也便于寻找数据。
我们要寻找的数据是文本型,所以在Type中,直接把目标定在xhr就行了,
这样我们就找到了需要的数据,目前来看就只有价格和市场名称可见,添加时间,市场名称等内容不可见,先看看是否被加密了。
第五步:复制该路径到浏览器中打开试试
第六步:分析结果
从上面的结果来看,其他数据都出来了,就只有中文看不见,全是乱码的,这样就可以笑了,因为数据没有加密传输,只是它们的解码问题而已~
1.2、请求通道数据
import requests
result = requests.get('http://www.gznw.com/eportal/ui?moduleId=ab59857100d84dcca372ff4473198d88&struts.portlet.mode=view&struts.portlet.action=/portlet/priceFront!queryList.action&pageSize=20&pageNo=1&recruitType=1&categoryDetail=909&marketId=&startDate=2019-11-01&endDate=2020-01-06')
print (result.text)
请求结果:
现在完全可以确定这就是我们需要的数据了,先来把它美化一下吧!
import pprint
pprint.pprint(result.json())
呈现结果:
2、提取数据
2.1、核对需要爬取的信息
2.2、提取json数据
从上面可以看出这是json数据,可以直接根据目录查询到数据
import requests
json = requests.get('http://www.gznw.com/eportal/ui?moduleId=ab59857100d84dcca372ff4473198d88&struts.portlet.mode=view&struts.portlet.action=/portlet/priceFront!queryList.action&pageSize=20&pageNo=3&recruitType=1&categoryDetail=909&marketId=&startDate=2018-01-01&endDate=2019-12-03')
for result in json.json()['result']:
varietyName = result['varietyName']#商品名称
priceType = '批发价' if int(result['priceType']) == 1 else "零售价"#1为批发价,2为零售价
productPrice = result['productPrice']#产品价格
unit = resu