陶远航 发表于 2023-10-6 18:35:17

requests爬虫详细教学(中)

本帖最后由 陶远航 于 2023-10-6 18:37 编辑

requests爬虫详细教学(中期)

各位,实在对不起大家,打算国庆出的下期没有机会出完了,下周六继续,一定出完(拖更){:10_256:}

一.抓包是什么?如何抓包?

在解释抓包之前,我们先来看一下这个网站: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 自动写代码

歌者文明清理员 发表于 2023-10-6 19:10:53

来了

陶远航 发表于 2023-10-6 19:11:35

歌者文明清理员 发表于 2023-10-6 19:10
来了

不申精{:10_256:}

歌者文明清理员 发表于 2023-10-6 19:12:39

学习完毕

陶远航 发表于 2023-10-6 19:16:02

歌者文明清理员 发表于 2023-10-6 19:12
学习完毕

谁用狗仔卡攻击我{:10_244:}

学习编程中的Ben 发表于 2023-10-6 19:17:31

支持!

歌者文明清理员 发表于 2023-10-6 19:20:23

陶远航 发表于 2023-10-6 19:16
谁用狗仔卡攻击我

not me

琅琊王朝 发表于 2023-10-6 19:28:48

{:5_106:}

liuhongrun2022 发表于 2023-10-6 20:04:24

针不戳

小甲鱼 发表于 2023-10-6 21:17:04

【中】和【下】凑成一篇吧~

陶远航 发表于 2023-10-6 21:17:41

小甲鱼 发表于 2023-10-6 21:17
【中】和【下】凑成一篇吧~

下个星期六/日{:10_266:}

Jtrump156 发表于 2023-10-6 22:54:47

{:7_146:}

cjjJasonchen 发表于 2023-10-7 07:27:30

来喽!

wk012233 发表于 2023-10-7 08:44:03

学习

360341024 发表于 2023-10-7 09:22:23

先打卡再学习{:10_279:}

kerln888 发表于 2023-10-7 09:49:09

{:10_279:}{:10_279:}{:10_279:}学习

kerln888 发表于 2023-10-7 09:49:25

{:10_279:}{:10_279:}{:10_279:}

陌生人il 发表于 2023-10-7 21:38:01

nice

foxiangzun 发表于 2023-10-8 09:15:23

{:5_106:}{:9_232:}{:7_146:}

Still1 发表于 2023-10-8 16:55:20

非常好
页: [1] 2
查看完整版本: requests爬虫详细教学(中)