Python网络爬虫基本 之 requests库

之前学习了urllib库来获取网页内容,但是跟requests库相比,urllib实在是弱爆了,requests提供了许多使用起来十分方便的模块,而不用向urllib那样调用好几个模块才能实现。

requests库不是Python自带的库,也就是说使用之前徐要先安装Python库,反正pip一下就安装好了,所以还是强烈推荐requests库来获取网页内容。

1.GET请求

GET请求是requests中最常用的请求。先看一个实例:

import requests

r = requests.get("http://httpbin.org/get")
print(r.text)

|#以下为输出内容:
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.4", 
    "X-Amzn-Trace-Id": "Root=1-5e7b817a-642ede6f41b26bdf583d312d"
  }, 
  "origin": "120.229.19.26", 
  "url": "http://httpbin.org/get"
}

以上就是一个简单的GET请求,返回结果中包括请求头、URL、IP等信息。

如果想要在请求中添加参数信息怎么实现呢?可以用params参数,将要添加的参数以字典形式存储起来,然后传入params即可,如下例子所示:

import requests

data = {
    "name" : "Marty",
    "age" : 18
}
r = requests.get("http://httpbin.org/get", params=data)
print(r.text)

\#以下为输出结果:
{
  "args": {
    "age": "18", 
    "name": "Marty"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.4", 
    "X-Amzn-Trace-Id": "Root=1-5e7b877e-a8afd42005f62ca0e4ef7f20"
  }, 
  "origin": "120.229.19.26", 
  "url": "http://httpbin.org/get?name=Marty&age=18"
}

我们将参数传入请求中,可以看到,返回的结果中,请求链接自动被构造了,URL变为了“http://httpbin.org/get?name=Marty&age=18

另外,我们看到,网页的返回类型是str类型,也就是字符串,但是它是Json格式的。所以我们可以用调用json()方法将其解析得到一个字典格式。也就是说,json()方法可以将返回结果是Json格式的字符串转化为字典。

print(type(r.text))
print(r.json())
print(type(r.json()))
\#以下为输出结果:
<class 'str'>
{'args': {'age': '18', 'name': 'Marty'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4', 'X-Amzn-Trace-Id': 'Root=1-5e7b877e-a8afd42005f62ca0e4ef7f20'}, 'origin': '120.229.19.26', 'url': 'http://httpbin.org/get?name=Marty&age=18'}
<class 'dict'>
  • 抓取网页

以知乎内‘发现’页面为例:

import requests
import re

header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
r = requests.get("http://www.zhihu.com/explore", headers = header)
pattern = re.compile("ExploreRoundtableCard-questionTitle.*?>(.*?)</a>", re.S)
titles = re.findall(pattern, r.text)
print(titles)
\#以下为输出结果:
['有没有萝莉控福音的gal呢?', '如何看待galgame中男主的平行性格?', 'Steam 上有什么优秀的Galgame?', '读完《攀岩人生》,你有什么感想?', '攀岩有何魅力?为什么近两年攀岩运动开始在国内悄悄兴起?', '如果2020年发生了经济危机你会如何应对?', '为什么这么多人想转行做产品经理?', '疫情过后会滋生出新的行业吗?什么产品会火爆?', '为什么找个产品助理的职位都这么难?', '东京奥运会推迟至 2021 年将在多大程度上影响日本经济?会给日本带来多大的经济损失?', '如何看待日本奥委会被曝购买慕尼黑再保险公司的「奥运取消保险」?', '东京奥运会推迟至 2021 年夏天,会给后续产生什么影响?']

我们在GET请求中加入了一个headers的参数,该参数的引入可以把我们的程序伪装成一个浏览器,不加这个,会被禁止抓取。

这个user-Agent在哪里看呢,随便打开一个网页,检查元素,然后选择Network,可以看到下面有很多条目,这代表了加载该网页一共向服务器发送了这么多的请求。随便点开一个条目,在最下面就是user-agent所在位置,里面包含你使用的硬件(手机还是电脑)、品牌、哪种系统、哪个浏览器等信息。当然该参数不一定要选择自己电脑上浏览器的user-agent,这种标识内容网上很多。

  • 抓取二进制数据

      import requests
    
      r = requests.get("https://github.com/favicon.ico")
      print(r.text)
      print(r.content)
      #以下为输出:
      $$ �������������� +++G��������G+++
      b'\x00\x00\x01\x00\x02\x00\x10\x10\x00\x00\x01\x00 \x00(\x05\x00\x00&\x00\x00\x00  \x00\x00\x01\x00 \x00(\x14\x00\x00N\x05\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
    

以上是请求一个图片(站点标签上的小图标),图片音频和视频文件本质都是用二进制编码组成的,有特定的保存和对应解析方式。所以想要住区他们就要拿到他们的二进制码。

打印r的属性可以看到,r.text结果是乱码,而content是二进制码(句前带一个b字样)。由于图片是二进制,所以在打印是转化为str类型,会出错。

这里顺便提一句text和content的区别。content是返回的其本来的源数据。而text返回的是经过编码后的数据。

可用下面代码将其存储起来:

import requests
r = requests.get("https://github.com/favicon.ico")
with open("favicon.ico", 'wb') as f:
    f.write(r.content)

同理,音频、视频也可以用这种方法获取。





太困了,写不动了,睡了。

猜你喜欢

转载自www.cnblogs.com/shuai3290/p/12571921.html