爬虫二:使用requests库发送get请求

学习爬虫,需要了解requests这个简单的库.下面都是我对这方面的理解及简单的介绍,使用的环境是ubuntu16.04+python3.5.2+requests2.9.1+pycharm如有错误欢迎补充.

什么是requests

requests是python实现的简单易用的HTTP库,你可以使用它,把自己的爬虫包装的让web服务器看的时候像一个正常的浏览器.从而实现发送请求获取数据的目的.简单来说,就是__发送网络请求,获取返回的相应数据__使用起来也比urllib简洁很多.
最常见的网络请求库就是urllib和requests.以前用urlib的人比较多,所以很容易在网上搜到一些关于urllib的疑问和解答,但requests的相对来说就少一点.
那么requests相对于urllib有什么区别?

  1. requests的底层还是urllib
  2. requests在python2中和3中是一样的用法.但urllib在python2中和python3的名称是不同的等
  3. requests简单易用,能自动帮助我们解压gzip等内容.urllib需要手动解压

requests的简单使用

安装

pip快速安装
pip3 install requests

发送一个GET请求

我们先来发送一个get请求,需求是:通过requests向百度首页发送请求,获取百度首页的数据.
打开PyCharm:

import requests
# 目标网站的url
url = 'http://www.tjnk.gov.cn/xwzx/'
# 使用requests发送请求,接收响应
response = requests.get(url)
# 打印响应
print(response)

运行结果是一个对象:

<Response [200]>

认识响应对象

我们可以使用print(dir(response)),来查看response响应对象都有哪些使用方法:

['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']

其中我们比较常用的有:
response.status_code # 获取响应状态码
response.headers # 获取响应头
response.request # 获取响应对应的请求
response.text # 获取被转成str类型后的响应
response.content # 获取被转成bytes类型后的响应
response.url # 获取响应对应的url
response.request.headers # 获取响应对应的请求的请求体
response.encoding # 获取响应体的编码方式
response.content.decode() # 获取被转成bytes类型后的响应再经过decode解码后的响应
response.cookies # 获取响应的cookie

大家可以在自己的pycharm中一一尝试,这里我们不再进行效果展示

发送一个带headers的GET请求

  1. 带上headers(请求头)是为了模拟浏览器更加真实,欺骗服务器.
  2. headers的格式是一个字典{key:value}
  3. 使用方法: requests.get(url, headers=headres)
import requests
url = 'http://www.tjnk.gov.cn/xwzx/'
headers = {
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
}
response = requests.get(url, headers=headers)
print(response)
print(response.status_code)

运行结果:

<Response [200]>
200

发送一个带参数的GET请求

发送带参数的get请求有两种方法:

  1. 直接在请求的url中写上参数,如:
# 该url中包含两个参数,一个是值为'wwwt'的fr,一个是值为'hello'的kw,写在url后的?之后,相互之间以&符隔开
url = 'http://tieba.baidu.com/f?fr=wwwt&kw=hello'
  1. 使用params参数发送参数数据,格式也是一个字典,使用方法如下:
import requests
url = 'http://www.tjnk.gov.cn/xwzx/'
headers = {
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
}
params = {
    'fr':'wwwt',
    'kw':'hello'
}
response = requests.get(url, headers=headers, params=params)
print(response)
print(response.status_code)

运行结果:

<Response [200]>
200

案例:使用requests方法来爬取某度贴吧的任意吧的前10页并保存

import requests

# 目标站点的url
url = "https://tieba.baidu.com/f?kw=漫威"
# 创建请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
# 要发送给目标站点的参数(通过观察目标站点的url的变化发现,当pn值为0时,返回的时该贴吧的第一页.pn值为50时是第二页,以此类推)
pn = 0
# 通过变量i来决定循环的次数(也就是目标贴吧要获取前多少页)
i = 1
while i <= 10:
    
    params = {"pn": pn}
    # 发送请求并获取该站点的响应
    response = requests.get(url, headers=headers, params=params)
    # 将响应写入文件,名为'tieba' + str(i) + ".html"
    with open('tieba' + str(i) + ".html", "w") as f:
        f.write(response.content.decode())
    i +=1
    pn += 50

运行结束后在该py文件的同级目录中会依次出现tieba1.html ~tieba10.html文件.
或者还可以使用面向对象的方式进行请求,详细代码如下:

import requests

# 面向对象的方法:创建Tieba类
class Tieba(object):

    def __init__(self, name, n):
    	# 初始化贴吧名称
        self.name = name
        # 初始化请求的url
        self.base_url = "https://tieba.baidu.com/f?kw={}&pn=".format(name)
        # 构建url列表
        self.url_list = [self.base_url + str(i*50) for i in range(n)]
        # 构建请求头
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}

    def get_data(self,url):
        # 发送请求,获取数据
        data = requests.get(url, headers=self.headers)
        # 将数据转成二进制bytes类型返回
        return data.content

    def save_data(self,i,data):
        # 保存数据
        with open("tieba_" + str(self.name) + "_" + str(i) + ".html", "w") as f:
            f.write(data.decode())

    def run(self):
        i = 1
        # 遍历url列表,循环向每个url发送请求
        for url in self.url_list:
        	# 调用Tieba类的 self.get_data()方法并把结果赋值给data变量
            data = self.get_data(url)
            # 调用Tieba类的 self.save_data()方法
            self.save_data(i,data)
            i += 1

if __name__ == '__main__':
	# 初始化一个tieba对象,并写好参数
    tieba = Tieba("漫威",10)
    # 运行
    tieba.run()

程序运行完毕后,在该py文件的同级目录中,会依次出现tieba_漫威_1.html~tieba_漫威_10.html文件.

下一篇再讲解使用requests库发送post请求.

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值