马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 陶远航 于 2023-10-6 18:37 编辑
requests爬虫详细教学(中期)
各位,实在对不起大家,打算国庆出的下期没有机会出完了,下周六继续,一定出完(拖更)
一.抓包是什么?如何抓包?
在解释抓包之前,我们先来看一下这个网站:https://spa1.scrape.center/
我们使用传统的方法试一下,我们复习一下传统的方法。
先 Ctrl+U 查看源代码,看一下整个网页的结构。
我们看到,源代码中并没有各个电影的字样。那么它们去哪了呢?这就要通过我们的抓包找到了。
我们先按 F12,这时会跳出一个窗口,这是开发人员工具,我们切换到”网络“选项卡,如图所示:
目前还什么都没有,我们点击刷新。
这时,右侧就会出现很多的网络请求,这个网站上的所有信息都在这里了。我们如何快速定位到这个请求呢?
我们可以看到下面有很多选项卡,我们切换到 XHR 选项卡。
这样我们就可以轻松定位到这个请求了
但是为什么我们不能通过源代码得到呢?
随着科技的发展,我们对于互联网的需求越来越大,服务器如果直接渲染网页给到我们浏览器的话,就会压力很大。
这种请求方式做到了在页面不被刷新的情况下动态加载网页,减少了服务器的压力。
这种请求方式我们叫做 Ajax 请求。
所以,抓包,简单来说,就是抓取 Ajax 请求的过程。
那么,抓到请求了,我们就可以在程序中模拟发送请求了。这个跟上期帖子里所讲到的方法是一样的,我们看一下。
我们点开标头,会发现大部分的请求信息都在这里了。
很明显,这个请求是 get 请求。注意,我们现在只学过 get 请求,post请求在下一小节展开讲解。
回归正题,我们可以看到请求的网址,是 https://spa1.scrape.center/api/movie/?limit=10&offset=0
我们使用上个帖子说的方法,可以写出代码如下:
import requests
response=requests.get("https://spa1.scrape.center/api/movie/?limit=10&offset=0")
print(response.text)
这是程序的部分输出:{"count":102,"results":[{"id":1,"name":"霸王别姬","alias":"Farewell My Concubine","cover":"https://p0.meituan.net/movie/ce4da3e03e655b5b88ed31b5cd7896cf62472.jpg@464w_644h_1e_1c","categories":["剧情","爱情"],"published_at":"1993-07-26","minute":171,"score":9.5,"regions":["中国内地","中国香港"]},{"id":2,"nam......(篇幅原因,不再展示完整response)
那么我们就成功获取到了第一页的内容。
同样的方法,第二页的请求网址我们也可以获取到: https://spa1.scrape.center/api/movie/?limit=10&offset=10
我们分析一下这些参数。把第一页中的网址和第二页对比一下:
https://spa1.scrape.center/api/movie/?limit=10&offset=0
https://spa1.scrape.center/api/movie/?limit=10&offset=10
可以发现offset参数不同,而每页的内容都是10条,也就是limit。
我们可以大胆的推断:
limit:条数
offset:从哪一条开始
那么这样我们就可以写代码来获取完整的电影信息了,代码如下:
import requests
response=requests.get("https://spa1.scrape.center/api/movie/?limit=100&offset=0")
print(response.text)
二.POST 请求详细讲解
我们已经学习了 get 请求,那么我们继续来看一个同样非常常见的 post 请求。
我们看一下这个案例:http://httpbin.org/post
这个网站必须要 post 请求才可以访问到,我们先构造一个 post 请求。
post 请求 其实也很简单,就是在 get 请求的基础上增加了一个 data。这个 data 其实就是表单数据,用来传一些数据的。
因为如果都是 get 请求,那么网址后面的参数就会一览无遗,这很大的降低了安全性。
我们通过这样的案例引入:
import requests
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("http://httpbin.org/post", data=data)
print(response.text)
可以发现,post请求其实就是给 get 请求加上了一个 data。
响应就是:{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.31.0",
"X-Amzn-Trace-Id": "Root=1-651e5a6c-66dc51796e6b53661a2aab34"
},
"json": null,
"origin": "39.184.**.**",
"url": "http://httpbin.org/post"
}
其实,post请求也可以通过抓包得到。
我们下期继续......
下期预告:
1.requests 的高级方法
2.通过 curl 自动写代码
|