我们要抓取下面这个网站上的所有图书列表:
https://www.epubit.com/books
1) 探索研究
创建一个新的python文件,写入如下代码:
import requests
url = 'https://www.epubit.com/books'
res = requests.get(url)
print(res.text)
运行发现打印结果如下:
这里面根本没有图书的信息。但使用浏览器检查器可以看到图书的信息:
我们碰到了一个基于前后端分离的网站,或者说一个用JavaScript获取数据的网站。这种网站的数据流程是这样的:
- 初次请求只返回了网页的基本框架,并没有数据。就是前面截图看到那样。
- 但网页的基本框架中包含JavaScript的代码,这段代码会再发起一次或者多次请求获取数据。我们称为后续请求。
为了抓取这样的网站,有两个办法:
- 分析出后续请求的地址和参数,写代码发起同样的后续请求。
- 使用模拟浏览器技术,比如selenium。这种技术可以自动发起后续请求获取数据。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:810735403
2) 分析后续请求
打开谷歌浏览器的检查器,按图中的指示操作:
- 点击Network,这里可以查看浏览器发送的所有网络请求。
- 选XHR,查看浏览器用JavaScript发送的请求。
- 下面可以看到很多请求。我们要一个个看过去找到包含商品列表的请求。
再来理解一下浏览器打开一个网页的过程,一般并不是一个请求返回了所有的内容,而是包含多个步骤:
- 第一个请求获得HTML文件,里面可能包含文字,数据,图片的地址,样式表地址等。HTML文件中并没有直接包含图片。
- 浏览器根据HTML中的链接,再次发送请求,读取图片,样式表,基于JavaScript的数据等。
所以我们看到有这么不同类型的请求:XHR, JS,CSS,Img,Font, Doc等。
我们爬取的网站发送了很多个XHR请求,分别用来请求图书列表,网页的菜单,广告信息,页脚信息等。我们要从这些请求中找出图书的请求。
具体操作步骤如图:
- 在左边选中请求
- 在右边选择Response
- 下面可以看到这个请求返回的数据,从数据可以判断是否包含图书信息。
Javascript请求返回的格式通常是JSON格式,这是一种JavaScript的数据格式,里面包含用冒号隔开的一对对数据,比较容易看懂。JSON很像Python中的字典。
在众多的请求中,可以根据请求的名字大致判断,提高效率。比如上图中getUBookList看起来就像是获取图书列表。点开查看,返回的果然是图书列表。
请记住这个链接的地址和格式,后面要用到:
https://www.epubit.com/pubcloud/content/front/portal/getUbookList?page=1&row=20&=&startPrice=&endPrice=&tagId= 分析一下,可以看到:
- 网址是:https://www.epubit.com/pubcloud/content/front/portal/getUbookList
- page=1表示第1页,我们可以依次传入2,3,4等等。
- row=20表示每一页有20本书
- startPrice和endPrice表示价格条件,他们的值都是空,表示不设定价格限制。
3) 使用postman测试猜想
为了验证这个设想打开谷歌浏览器,在地址栏中输入以下网址:
https://www.epubit.com/pubcloud/content/front/portal/getUbookList?page=1&row=20&=&startPrice=&endPrice=&tagId=
可是得到了如下的返回结果:
{
"code": "-7",
"data": null,
"msg": "系统临时开小差,请稍后再试~",
"success": false