本文讲的是不使用selenium插件模拟浏览器,如何获得网页上的动态加载数据。步骤如下: 一、找到正确的URL。二、填写URL对应的参数。三、参数转化为urllib可识别的字符串data。四、初始化Request对象。五、urlopen这个Request对象,获得数据。
url='http://www.*****.*****/*********'
formdata = {'year': year,
'month': month,
'day': day
}
data = urllib.urlencode(formdata)
request=urllib2.Request(url,data = data) #如果URL不带参数就是request=urllib2.Request(url)
r = urllib2.urlopen(request)
html=r.read() # html就是你要的数据,可能是html格式,也可能是json,或去他格式
后面步骤都是相同的,关键在于如何获得URL和参数。我们以新冠肺炎的疫情统计网页为例(https://news.qq.com/zt2020/page/feiyan.htm#/)。
如果直接抓浏览器的网址,你会看见一个没有数据内容的html,里面只有标题、栏目名称之类的,没有累计确诊、累计死亡等等的数据。因为这个页面的数据是动态加载上去的,不是静态的html页面。需要按照我上面写的步骤来获取数据,关键是获得URL和对应参数formdata。下面以火狐浏览器讲讲如何获得这两个数据。
肺炎页面右键,出现的菜单选择检查元素。
点击上图红色箭头网络选项,然后刷新页面。如下,
这里会出现很多网络传输记录,观察最右侧红框“大小”那列,这列表示这个http请求传输的数据量大小,动态加载的数据一般数据量会比其它页面元素的传输大,119kb相比其它按字节计算的算是很大的数据了,当然网页的装饰图片有的也很大,这个需要按照文件类型那列来甄别。
然后点击域名列对应那行,如下
可以在消息头中看见请求网址,这个就是url,点击参数可以看见url对应的参数
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery341004532487105727312_1584498763134&_=1584498763135
可以看到url的尾部?后面已经把参数写上了。
我们如果使用带参数的URL,那么就
request=urllib2.Request(url),不加data参数。
如果使用request=urllib2.Request(url,data = data)
那么url="https://view.inews.qq.com/g2/getOnsInfo"
formdata = {'name': 'disease_h5',
'callback': '',
'_': 当前时间戳
}
name是disease_h5,callback是页面回调函数,我们不需要有回调动作,所以设置为空,_对应的是时间戳(Python很容易获得时间戳的),因为查询肺炎患者数量和时间是紧密相关的。
如果都写在一个url中是下面形式的
url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(stamp*1000)
按照这个思路就可以获得疫情数据了。两种方案任你选择。
找url和参数是一项需要耐心,需要一定的分析能力的,才能正确甄别url和参数的含义,进行正确的编程实现。参数是否可以空,是否可以硬编码写死,是否有特殊要求,其实是一个很考验经验的事情。
有的url很简单,返回一个.dat文件,里面直接就是json格式的数据,这种是最友好的了。有的需要你设置大量参数,才能获得,而且获得的是html格式的,需要解析才能提取数据。解析部分请参考我之前写的BeautifulSoup解析html