[置顶] python爬虫实践——零基础快速入门(六)解决动态页面爬取问题
2018-01-31 14:22
1351 查看
前面我们已经学过爬取豆瓣电影、豆瓣图书TOP250,小猪租房等信息。
相信你现在都能轻易上手爬取其他网站了。
通过前面的例子我,我们知道,爬取大量数据的重点在于通过循环翻页提取重要的信息。
但是你会遇到,爬取其他网页的时候,有时候没有翻译这个按钮,这就尴尬了。
比如我们之前爬过的豆瓣电影,去到那个分类页面,发现下面只有“加载跟多”,并没有什么翻页,所以我们只能点击“加载更多”来获取更多电影信息。
又比如说知乎“关注的人”页面列表,我复制了几个xpath信息,
这居然需要的ID来获取,再一次验证了我们前面的规律是失效的,哎~~捉急啊,咋搞呢?
而这一现象,早就应该解决它。
我们以豆瓣电影“分类”为例https://movie.douban.com/tag/#/
首先要告诉你的是,这种动态加载的页面,一般数据会在JS或者XHR类目里,我们右击“检查”,看这一页的XHR里没有任何文件,然后点“加载更多”按钮,看它给我们返回什么信息。
这是我点击“加载更多”按钮后 XHR 出现的一条数据:
注意:有些网站返回的JS等XHR条数比较多,大家要注意筛选有用信息。
我们右击这一条数据,选择“open in new tab”
点击“open in new tab”后发现有一页数据产生,哼哼,用 json 工具解析一下,发现这不就是我们加载出来的数据吗?
再点击一下“加载更多”,又出现一条XHR:
继续“open in new tab”,和网页显示的数据一毛一样。哈哈~~
观察这几个加载项,发现URL如下规律:
哈哈,每加载一次,显示一页,只有最后 start= 的值不一样,并且步长为20 ,并且20正好是加载出来的电影个数。
于是我们可以轻松的写出爬取代码:
按照之前例子的套路,我们来完善一下代码:
结果展示:
看到这里,是不是有些不明白了?怎么代码跟之前不一样了?
这里我来解释一下:
当然你也可以把爬取的数据存到本地,跟之前一样,我们修改代码:
你现在可以去试着爬取一些其他网站了,当然你可能会遇到很多问题,比如IP限制,异步加载,验证码等……
前方仍然充满荆棘,同志们还需努力。
相信你现在都能轻易上手爬取其他网站了。
通过前面的例子我,我们知道,爬取大量数据的重点在于通过循环翻页提取重要的信息。
但是你会遇到,爬取其他网页的时候,有时候没有翻译这个按钮,这就尴尬了。
比如我们之前爬过的豆瓣电影,去到那个分类页面,发现下面只有“加载跟多”,并没有什么翻页,所以我们只能点击“加载更多”来获取更多电影信息。
又比如说知乎“关注的人”页面列表,我复制了几个xpath信息,
//*[@id="Popover-30509-47597-toggle"]/a //*[@id="Popover-30511-18811-toggle"]/a
这居然需要的ID来获取,再一次验证了我们前面的规律是失效的,哎~~捉急啊,咋搞呢?
而这一现象,早就应该解决它。
我们以豆瓣电影“分类”为例https://movie.douban.com/tag/#/
首先要告诉你的是,这种动态加载的页面,一般数据会在JS或者XHR类目里,我们右击“检查”,看这一页的XHR里没有任何文件,然后点“加载更多”按钮,看它给我们返回什么信息。
这是我点击“加载更多”按钮后 XHR 出现的一条数据:
注意:有些网站返回的JS等XHR条数比较多,大家要注意筛选有用信息。
我们右击这一条数据,选择“open in new tab”
点击“open in new tab”后发现有一页数据产生,哼哼,用 json 工具解析一下,发现这不就是我们加载出来的数据吗?
再点击一下“加载更多”,又出现一条XHR:
继续“open in new tab”,和网页显示的数据一毛一样。哈哈~~
观察这几个加载项,发现URL如下规律:
https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=20 #第二页 https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=40 #第三页 https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=60 #第四页
哈哈,每加载一次,显示一页,只有最后 start= 的值不一样,并且步长为20 ,并且20正好是加载出来的电影个数。
于是我们可以轻松的写出爬取代码:
for i in range(3): url = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(i*20) #用i*20表示每个页面按20的步长增长,这里只举例三个页面,看你需求
按照之前例子的套路,我们来完善一下代码:
#-*- coding:utf-8 -*- import requests from lxml import etree import time for i in range(3): url = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(i*20) file = requests.get(url).json() #这里返回json格式的页面,所以用json来解析,而不是用text time.sleep(2) for j in range(20): dict = file['data'][j] #分别取出文件中‘data’ 下对应的第[j]部电影的信息 urlname = dict['url'] title = dict['title'] rate = dict['rate'] cast = dict['casts'] print('{}-->{}-->{}-->{}\n'.format(title,rate,' '.join(cast),urlname))
结果展示:
看到这里,是不是有些不明白了?怎么代码跟之前不一样了?
这里我来解释一下:
file = requests.get(url).json() #之前我们用的.text 是需要网页返回文本的信息,而这里返回的是json文件,所以用 json()函数 dict = file['data'][j] urlname = dict['url'] #取出字典中的值,需要在方括号中指明值对应的键. #有python基础的都知道字典是有键-值对组成的,所以这里 不懂的赶快去充电吧。 ' '.join(cast) #因为有很多演员,这里用 json()函数 #在字符串中间用空格隔开
当然你也可以把爬取的数据存到本地,跟之前一样,我们修改代码:
#-*- coding:utf-8 -*- import requests from lxml import etree import time with open('C:/Users/nicker/Desktop/ss.txt','w',encoding='utf-8') as F: for i in range(3): url = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(i*20) file = requests.get(url).json() time.sleep(2) for j in range(20): dict = file['data'][j] urlname = dict['url'] title = dict['title'] rate = dict['rate'] cast = dict['casts'] #print('{}-->{}-->{}-->{}\n'.format(title,rate,' '.join(cast),urlname)) F.write('{}-->{}-->{}-->{}\n'.format(title,rate,' '.join(cast),urlname))
你现在可以去试着爬取一些其他网站了,当然你可能会遇到很多问题,比如IP限制,异步加载,验证码等……
前方仍然充满荆棘,同志们还需努力。
相关文章推荐
- [置顶] python爬虫实践——零基础快速入门(四)爬取小猪租房信息
- [置顶] python爬虫实践——零基础快速入门(二)爬取豆瓣电影
- [置顶] python爬虫实践——零基础快速入门(一)
- [置顶] python爬虫实践——零基础快速入门(五)将爬取的数据存到本地
- [置顶] python爬虫实践——零基础快速入门(三)爬取豆瓣图书
- Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题
- java-基础入门-泛型数组列表-解决运行时动态更改数组的问题
- 【python爬虫】动态加载页面的解决办法(以ins为例)
- java-基础入门-泛型数组列表-解决运行时动态更改数组的问题
- python3 [入门基础实战] 爬虫入门之爬取豆瓣读书随笔页面
- 快速解决js动态改变dom元素属性后页面及时渲染的问题
- 快速解决js动态改变dom元素属性后页面及时渲染的问题
- java-基础入门-泛型数组列表-解决运行时动态更改数组的问题
- 基础入门_Python-模块和包.运维开发中__import__动态导入最佳实践?
- Python初学者(零基础学习Python、Python入门)常见问题:书籍推荐、资料、社区
- ASP.NET MVC3 快速入门中学MvcMovie项目遇到的问题解决办法
- Python初学者(零基础学习Python、Python入门)常见问题:书籍推荐、资料、社区
- Python抓取页面乱码问题的解决
- 【实践】从eclipse集成快速上手到IDEA14集成开发环境最可能出现的问题与解决办法
- python MySQLdb在windows环境下的快速安装、问题解决方式