二、爬虫requests库

二、爬虫requests库

1.发送简单的请求

# 访问指定网址
response = requests.get(url)

# response的常用方法:
response.text
response.content
response.status_code
response.request.headers
response.headers

2.判断请求是否成功

# 判断请求是否成功
assert response.status_code == 200

3.发送带header的请求

为什么请求需要带上header?

因此需要模拟浏览器,欺骗服务器,获取和浏览器一致的内容

  • header的形式:字典
  • headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36”}
  • 用法:requests.get(url, headers=headers)

什么叫做请求参数?

例1:http://www.webkaka.com/tutorial/server/2015/021013

例2:https://www.baidu.com./s?wd=python&c=b

  • 参数的形式:字典
  • kw={“wd” : “python”}
  • 用法:requests.get(url, params=kw)

4.发送post请求

哪些地方我们会用到post请求:

  • 登录注册(post比get更安全)
  • 需要传输大文本内容的时候(psot请求对数据长度没有要求)

所以,我们的爬虫也需要在这两个地方回去模拟浏览器发送post请求

用法:

response = request.post(“http://www.baidu.com/”, data = data, headers=headers)

data的形式:字典

5.使用代理

用法:requests.get(“http://www.baidu.com”, proxies=proxies)

proxies的形式:字典

proxies={

​ “http:” “http://12.34.56.79:9527”,

​ “https:” “http://12.34.56.79:9527”,

}

使用代理ip前,需要检查ip的可用性

  • 准备大量的ip地址,组成ip池,随机选择一个ip来用

  • 如何随机选择代理ip,目的是让使用次数较少的ip地址,有更大的可能性被用到

    • 将每个ip地址转化成字典,如{“ip”:ip, “times”:0}
    • [{}, {}, {}, {}],对这个ip的列表进行排序,按照使用次数进行排序
    • 选择使用次数较少的10个ip,从中随机选择一个
  • 可以使用requests添加超时参数,判断ip地址的质量;

  • 在线代理ip质量检测的网站;

6.cookie和session的区别

  • cookie数据存放在客户的浏览器上,session数据存放在服务器上;
  • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗;
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能;
  • 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookies;

带上cookie、session的好处:

能够请求到登录之后的页面;

带上cookie、session的弊端:

一套cookie和session往往和一个用户对应,请求太快,请求次数太多,容易被服务器识别为爬虫;

因此,不要cookie的时候尽量不去使用cookie,但为了获取登录之后的页面,我们必须发送带有cookies的请求。

携带cookie请求

  • 携带一堆cookie进行请求,把cookie组成cookie池;

7.处理cookies、session请求

requests提供了一个叫做session类,来实现客户端和服务端的会话保持(session能够保证客户端存在本地的cookie)

  • 使用方法:
    • 1.实例话一个session对象
      • session = requests.session()
    • 2.让session发送get或者post请求
      • response = session.get(url,headers)

使用requests提供的session类来请求登录之后的网站的思路

  • 实例化session;
  • 先使用session发送请求,登录对网站,把cookie保存在session中;
  • 再使用session请求登录之后才能访问的网站,session能够自动的携带登录成功的时保存在其中的cookie,进行请求;
# 方式一:实例化session,使用session发送post请求,在使用他获取登录后的页面
session = requests.session()

post_url = "http://www.renren.com/SysHome.do"
post_data = {"email": "gaokaoenglish150@sina.com", "password": "*******"}

headers = {
    "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Mobile Safari/537.36"}

# 使用session发送post请求,cookie保存在其中
session.post(post_url, data=post_data, headers=headers)

# 再使用session进行请求登录之后才能访问的地址
r = session.get("http://www.renren.com/239835519/newsfeed/photo", headers=headers)

# 保存页面
with open("05.renren.html", mode="w", encoding="utf-8") as f:
    f.write(r.content.decode())
# 方式二:headers中添加cookie键,值为cookie字符串
post_url = "http://www.renren.com/239835519/profile"

headers = {
    "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Mobile Safari/537.36",
    "Cookie": "anonymid=kc7jw6xa8tig6d; depovince=ZGQT; _r01_=1; JSESSIONID=abcHfs-EegOYk4zqKRRsx; taihe_bi_sdk_uid=3fc202011b1d380a3967c595de815f9e; taihe_bi_sdk_session=669440f8e13e6d063fc46ee65e17b425; ick_login=fdcab00f-eb6a-4458-a10d-a2c737ab0f85; first_login_flag=1; ln_uact=gaokaoenglish150@sina.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn301/20081231/14/15/main_o7qe_10709k204096.jpg; wp_fold=0; jebecookies=35667259-2fce-4b7e-b9a0-ec4fc7ad7cb4|||||; _de=15F0BF98A509B5DBE4B3DE76E4D44457270E2E3B4A0CA0A66DEBB8C2103DE356; p=633d5bfbf82fa4ba51e0ea7584b725ba9; t=807a936192f54fa3dfe515d65ec3f2b99; societyguester=807a936192f54fa3dfe515d65ec3f2b99; id=********; xnsid=5442fbef; ver=7.0; loginfrom=null"
}

r = requests.get("http://www.renren.com/239835519/newsfeed/photo", headers=headers)

# 保存页面
with open("05.renren.html", mode="w", encoding="utf-8") as f:
    f.write(r.content.decode())
# 方式三:在请求方法中添加cookies参数,接受字典形式的cookie。字典形式的cookies中的键是cookie的name,值是cookie的value
headers = {
    "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Mobile Safari/537.36"}

url = "http://www.renren.com/239835519/profile"

cookies = "anonymid=kc7jw6xa8tig6d; depovince=ZGQT; _r01_=1; JSESSIONID=abcHfs-EegOYk4zqKRRsx; taihe_bi_sdk_uid=3fc202011b1d380a3967c595de815f9e; taihe_bi_sdk_session=669440f8e13e6d063fc46ee65e17b425; ick_login=fdcab00f-eb6a-4458-a10d-a2c737ab0f85; first_login_flag=1; ln_uact=gaokaoenglish150@sina.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn301/20081231/14/15/main_o7qe_10709k204096.jpg; wp_fold=0; jebecookies=35667259-2fce-4b7e-b9a0-ec4fc7ad7cb4|||||; _de=15F0BF98A509B5DBE4B3DE76E4D44457270E2E3B4A0CA0A66DEBB8C2103DE356; p=633d5bfbf82fa4ba51e0ea7584b725ba9; t=807a936192f54fa3dfe515d65ec3f2b99; societyguester=807a936192f54fa3dfe515d65ec3f2b99; id=********; xnsid=5442fbef; ver=7.0; loginfrom=null"

# 字典推导式
cookies = {i.split("=")[0]: i.split("=")[1] for i in cookies.split("; ")}

r = requests.get(url, headers=headers, cookies=cookies)

# 保存页面
with open("05.renren.html", mode="w", encoding="utf-8") as f:
    f.write(r.content.decode())

不发送post请求,使用cookie获取登录后的页面

  • cookie过期时间很长的网站,如政府网站,学校网站等;
  • 在cookie过期之前能够拿到所有的数据,比较麻烦;
  • 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面;

8.requests中解决编码的方法

response.text

  • 类型:str
  • 解码类型:根据HTTP头部对响应的编码做出有根据的推测,推测的文本编码
  • 如何修改编码方式:response.encoding=“gbk”

response.content

  • 类型:bytes

  • 解码类型:没有指定

  • 如何修改编码方式:response.content.decode(“utf-8”)

    • response.content.decode();
    • response.content.decode(“gbk”);

9.贴吧爬虫练习

import requests


class TiebaSpider:
    def __init__(self, tieba_name):
        self.tieba_name = tieba_name
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"}
        self.url_temp = "https://tieba.baidu.com/f?kw=" + tieba_name + "&ie=utf-8&pn={}"

    # 1.构造url列表
    def get_url_list(self):
        # url_list = []
        # for i in range(1000):
        #     url_list.append(self.url_temp.format(i * 50))
        # return url_list
        return [self.url_temp.format(i * 50) for i in range(1000)]

    # 2.发送请求,获取响应
    def parse_url(self, url):
        print(url)
        reponse = requests.get(url, headers=self.headers)
        return reponse.content.decode()

    # 3.保存html字符串
    def save_html(self, html_str, page_num):
        file_path = "{}-第{}页.html".format(self.tieba_name, page_num)
        with open(file_path, mode="w", encoding="utf-8") as f:
            f.write(html_str)

    # 实现主要逻辑:不写具体的实现,只调用方法
    def run(self):
        # 1.构造url列表
        url_list = self.get_url_list()
        # 2.遍历,发送请求,获取响应
        for url in url_list:
            html_str = self.parse_url(url)
            # 3.保存
            page_num = url_list.index(url) + 1
            self.save_html(html_str, page_num)


if __name__ == "__main__":
    tieba_spider = TiebaSpider("恐怖漫画")
    tieba_spider.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值