爬虫系列之requests的使用

requests是一个很常用的python库。它有GET、POST、PUT、DELETE等方法。

安装

1
$ pip install requests

方法

GET

常用方式
HTTP中最常见的请求之一就是GET请求,下面我们详细了解一下requests构建GET请求。回应的请求信息:

1
2
3
4
5
6
import requests
r = requests.get("http://httpbin.org/get")
print(r.text)
print(type(r.text))
print(r.json())
print(type(r.json()))

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1"
},
"origin": "104.222.246.242, 104.222.246.242",
"url": "https://httpbin.org/get"
}

<class 'str'>
{'args': {}, 'url': 'https://httpbin.org/get', 'headers': {'Host': 'httpbin.org', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.19.1'}, 'origin': '104.222.246.242, 104.222.246.242'}
<class 'dict'>

可以发现,我们成功发起了GET请求,返回结果包含请求头、URL、IP等信息。并且可以看到r.text(),r.json()的类型。

抓取网页
上面的请求链接返回的是 JSON 形式的字符串, 那么如果请求普通 的网页,则 肯定能获得相应的 内容了。 下面以“知乎”→“发现”页面为例来看一下:

1
2
3
4
5
6
7
8
headers = {
'User-Agent':"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"
}

r = requests.get('https://www.zhihu.com/explore', headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re.S)
titles = re.findall(pattern, r.text)
print(titles)

运行结果

1
2
$ ['\n癌症是怎样被检查出来的,普通体检能查出癌症吗?\n', '\n如何看待主播余小 C 打到峡谷之巅最强王者 900 点?\n', '\n如何评价90年代幻想娱乐小说(以富士见Fantasia文库为代表)在轻小说发展史中的位置?乐于见到《流浪地球》票房大卖?\n', '\n郭德纲对张云雷是怎样的态度?\n', '\n你最讨厌什么梗?\n', '\n说下你使用后大爱恨不得安利全世界的护肤品/化妆品?\n', '\n高中作文如何得到 50 以上的分数?\n']

发现这里添加了heades,不然爬虫知乎发现页会报错。

POST

常用方式

1
2
3
4
data ={'name':'germey', 'age':'22'}

r = requests.post("http://httpbin.org/post", data=data)
print(r.text)

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "22",
"name": "germey"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "18",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1"
},
"json": null,
"origin": "104.222.246.242, 104.222.246.242",
"url": "https://httpbin.org/post"
}

可以发现,我们成功获得了返回结果,其中 form 部分就是提交的数据,这就证明POST请求成功发送了 。
**相应
在这里我们看下常用的相应方式
r = requests.get(‘http://www.jianshu.com‘)
print(r.status_code)
print(r.headers)
print(r.cookies)
print(r.text)
print(r.content)
print(r.history)
print(r.json())
其他的方法和这类似,大家可以相继试一下