java爬虫抓取动态网页(谷歌浏览器的检查功能分析(图)为什么呢?)
优采云 发布时间: 2021-11-04 16:12java爬虫抓取动态网页(谷歌浏览器的检查功能分析(图)为什么呢?)
目标网址网址:
%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=
使用谷歌浏览器的检查功能分析网站,发现需要抓取的内容在'movie-list-item playable unwatched'类下。
好了,我们按照之前的方式爬一下,看看。
url='https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action='
res=requests.get(url)
res.encoding= 'utf-8'#该网页是以utf-8的编码形式显示的
soup=BeautifulSoup(res.text, 'html.parser')#使用美丽汤解析网页内容
print(soup)
查看打印结果,发现get信息中没有电影的相关信息。为什么是这样?因为这个页面上的所有电影信息都是动态加载的。
转动鼠标滚轮下拉页面,你会发现加载的内容越来越多,查看显示器,'movie-list-item playable unwatched'类的列数增加了。看来静态的网站 集对动态加载的网站 不起作用,那么如何解决呢?
点击显示器的网络--->XHR。继续向下滑动滚轮,你会发现Name下的文件增加了!
点击文件末尾的start=0&limit=20和start=20&limit=20的文件,对比查看,发现这正是我们要找的信息。
通过对比,我们现在可以大胆猜想,start指的是起始电影序列号,limit是每个请求显示的电影数量,信息以json格式存储。我们再次点击Headers,发现如下:
发现获取的内容是通过GET url获取的:';interval_id=100%3A90&action=&start=0&limit=20'。
好的,现在我们知道如何获取数据了。经过测试,我们其实可以直接start=0 limit=256直接得到所有的top10数据。但是我们还是按照网站的要求,一次拿到20份。代码显示如下:
import requests
import json
#爬取豆瓣电影分类排行榜 - 动作片top10%的电影名、评分和豆瓣链接
url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start={}&limit=20'
filminfolist=[]#存放结果
for i in range(0,300,20):
aimurl=url.format(i)
res=requests.get(aimurl)
jd=json.loads(res.text)#改成json格式方便读取数据
for j in jd:
filminfo={}#以字典存储单条数据
filminfo['title']=j['title']
filminfo['score'] = j['score']
filminfo['url'] = j['url']
filminfolist.append(filminfo)
打印filminfolist的结果如下:
{'title':'这个杀手不太冷','score':'9.4','url':''}
{'title':'七武士','score':'9.2','url':''}
{'title':'蝙蝠侠:黑暗骑士','score':'9.1','url':''}
{'title':'指环王3:无敌之王','score':'9.1','url':''}
{'title':'Fight Club','score':'9.0','url':''}
{'title':'指环王2:两塔','score':'9.0','url':''}
{'title':'General title','score':'9.0','url':''}
{'title':'魔戒1:魔戒再现','score':'8.9','url':''}
......
稍微展开一下:
初识DataFrame
使用Data Frame格式将刚才的数据保存到excel中,这是通过使用包pandas实现的。
代码显示如下:
import pandas
df=pandas.DataFrame(filminfolist)
df.to_excel('D:\\douban.xlsx')
总结:对于动态加载的网页,需要多观察监视器,分析实际爬取的页面。美利堂解析html格式,json解析json格式。当然,也可以使用正则表达式进行分析。