网络爬虫-requests模块

目录

requests模块

1、requests模块作用:发送HTTP请求,获取响应数据

2、安装:pip/pip3 install requests 或 在pycharm安装, File–>Setting–>Project:xx–>Python Interpreter–>Package–> “+” » 输入 requests 直接安装即可。

3、使用,发送get请求:(1)导入;(2)调用get方法,对目标URL发送请求

响应对象

分类:

源码 XX.text str字符串

二进制 .content bytes

例子:
# 导入
import requests

# 目标网址
url = 'http://www.baidu.com'

# 发出请求
response = requests.get(url)

# 设置(响应)解码格式
response.encoding = 'utf-8'

# 打印源码的str类型数据
print(response.text)

# print(response.encoding)

# response.content 是存储的bytes类型的响应源码,可以进行decode操作
print(response.content.decode()) #默认utf-8

发送带请求头headers的请求

requests.get(url, headers={})

例子:
import requests

url = 'http://www.baidu.com'
response = requests.get(url)

# 构建请求头字典
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}

# 发送带请求头的请求
response1 = requests.get(url, headers=headers)

print(len(response1.content.decode()))
print(response1.content.decode())

发送带参数的请求

1、url中直接带参数

2、使用params参数:

(1)构建参数字典

(2)发送请求的时候设置参数字典

# 知识点:掌握发送带参数的请求的方法

import requests

# 发送带参数的请求两种方法:(1)直接在url中加入参数

##############################################################################################
# # 第一种方法
# url = 'https://www.baidu.com/s?&wd=python'  # 通过删除法获得的url
#
# # 构建请求头字典
# headers = {
#     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
# }
#
# response = requests.get(url,headers=headers)
#
# # 验证
# with open('baidu.html','wb') as f:
#     f.write(response.content)

###############################################################################################
# 第二种方法:通过参数params携带参数字典
# 1、构建参数字典
# 2、发送请求的时候设置参数字典
url = 'https://www.baidu.com/s?'

# 构建请求头字典
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}

# 构建参数字典
data = {
    'wd':'python'
}

response = requests.get(url,headers=headers,params=data)

# 验证
with open('baidu1.html','wb') as f:
    f.write(response.content)

在headers中携带cookies

方法同ua

# 知识点:掌握headers中携带cookies
# 对于登录,需要cookies保持登录状态。

import requests

url = 'https://github.com/jinbao1chen'

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
    'cookie': '_octo=GH1.1.1844290650.1631717716; tz=Asia%2FShanghai; _device_id=85f612f7b15e03a1c45b200d88608722; has_recent_activity=1; user_session=46oFNc-72H_aOTyzPXbbWHoffxbh8W8THzEcFxIrQdzXKIs9; __Host-user_session_same_site=46oFNc-72H_aOTyzPXbbWHoffxbh8W8THzEcFxIrQdzXKIs9; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=jinbao1chen; _gh_sess=NgmBBHrLFMpZrWTqbdfIKFouWCUC77eL%2Fd5vmgL3SfOjrXPwnks8sKrgLfx%2FN%2Bu77Rqvv%2FZ6fdpP881nVG6ebFlBl2qnhv3vKWVhW8wNHhdee1JcjiIdCHlpVe9f%2B6m6U0pgA8a3NQYEalEkCw4mNePnAv2MNvpyQJasxhd4UTqPeiKcmNLffllvDIRRHpNmn9TE3qYCbTY8Z14jU39XH7qmcJ81uwZ6Z0juhOHwvfkLtpqoJybkSaUhEORCGpdULZX%2FaZBdkcRZXdnivgOJ5%2FxapuxiaM1gbzofGjfP%2FZKna2BZCTXy1%2BlnY21wcQkI4cT3JDS40O%2BAjEq%2FNEFlgQH3t6oAoPIdiukLvC0F27BC2HZehqmcUfLjLz%2BV%2FQ2G%2FJbLAJ%2F%2BpJjS0hmoHL%2Fmp7EjNLOF0oU%2FGyJoonIk0VW0NaA%2FS9LxunBCHVfej23wolzfh9KYbE37kCDY3nYz266NP0eK57Q4rfcCvlDsb2uClpmSJIuanx%2BZBI2Lr9LLyYbmidS25X8MfAEueTzQXSNOh02BMdbJbEd87%2BHPIOqmMvcGDJ3%2F%2BehOvbDJJgPsOS3QpLhhc5zxrE7L9GkTwOAfgRQi3OkhvRobrm1%2FSwhg24brVnVlf4Xn%2BxDivc5M%2FbXoDsAmeqjC77d210r%2BhN6KCsTrR5UnYQsnMD4V4QlvTtgpgxWIV1M27VeXHl0LGIoIJRdbWEKmDxX4IgoVZD7XRJov%2BOvZ52OV0xjoxMFFJfyf4vfKEEQTrB1BNM8v61foCFJLLGGwekrgW6Pn4vIOiF5lMYzYiWQyzO2a22%2BLAIoqxYk4wRBblNIB7v6v3Ro%2Fm%2FeR0HZMNTKGtG0aBJembSVF6ywH6EDqgn%2F%2F1EC7ICslk4vrGWlUig2b%2F%2FBIFx2fekfQZ3N0wkgwxtgG4f03LujVyLnDlPulLw%3D%3D--IvqopqaZJvu9dWfC--JlES5vUzbHS9Z34fitlTEg%3D%3D'
}

response = requests.get(url,headers=headers)

# 验证
with open('github.html','wb')as f:
    f.write(response.content)

使用cookies参数保持会话

1、构建cookies字典

2、在请求的时候将cookies字典赋值给cookies参数:requests.get(url, cookies)

# 知识点:掌握cookies参数的使用
# 使用cookies参数保持会话:构建cookies字典;在请求的时候将cookies字典赋值给cookies参数,requests.get(url,cookies)

import requests

url = 'https://github.com/jinbao1chen'

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}

# 构建cookies字典
temp = '_octo=GH1.1.1844290650.1631717716; tz=Asia%2FShanghai; _device_id=85f612f7b15e03a1c45b200d88608722; has_recent_activity=1; user_session=46oFNc-72H_aOTyzPXbbWHoffxbh8W8THzEcFxIrQdzXKIs9; __Host-user_session_same_site=46oFNc-72H_aOTyzPXbbWHoffxbh8W8THzEcFxIrQdzXKIs9; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=jinbao1chen; _gh_sess=NgmBBHrLFMpZrWTqbdfIKFouWCUC77eL%2Fd5vmgL3SfOjrXPwnks8sKrgLfx%2FN%2Bu77Rqvv%2FZ6fdpP881nVG6ebFlBl2qnhv3vKWVhW8wNHhdee1JcjiIdCHlpVe9f%2B6m6U0pgA8a3NQYEalEkCw4mNePnAv2MNvpyQJasxhd4UTqPeiKcmNLffllvDIRRHpNmn9TE3qYCbTY8Z14jU39XH7qmcJ81uwZ6Z0juhOHwvfkLtpqoJybkSaUhEORCGpdULZX%2FaZBdkcRZXdnivgOJ5%2FxapuxiaM1gbzofGjfP%2FZKna2BZCTXy1%2BlnY21wcQkI4cT3JDS40O%2BAjEq%2FNEFlgQH3t6oAoPIdiukLvC0F27BC2HZehqmcUfLjLz%2BV%2FQ2G%2FJbLAJ%2F%2BpJjS0hmoHL%2Fmp7EjNLOF0oU%2FGyJoonIk0VW0NaA%2FS9LxunBCHVfej23wolzfh9KYbE37kCDY3nYz266NP0eK57Q4rfcCvlDsb2uClpmSJIuanx%2BZBI2Lr9LLyYbmidS25X8MfAEueTzQXSNOh02BMdbJbEd87%2BHPIOqmMvcGDJ3%2F%2BehOvbDJJgPsOS3QpLhhc5zxrE7L9GkTwOAfgRQi3OkhvRobrm1%2FSwhg24brVnVlf4Xn%2BxDivc5M%2FbXoDsAmeqjC77d210r%2BhN6KCsTrR5UnYQsnMD4V4QlvTtgpgxWIV1M27VeXHl0LGIoIJRdbWEKmDxX4IgoVZD7XRJov%2BOvZ52OV0xjoxMFFJfyf4vfKEEQTrB1BNM8v61foCFJLLGGwekrgW6Pn4vIOiF5lMYzYiWQyzO2a22%2BLAIoqxYk4wRBblNIB7v6v3Ro%2Fm%2FeR0HZMNTKGtG0aBJembSVF6ywH6EDqgn%2F%2F1EC7ICslk4vrGWlUig2b%2F%2FBIFx2fekfQZ3N0wkgwxtgG4f03LujVyLnDlPulLw%3D%3D--IvqopqaZJvu9dWfC--JlES5vUzbHS9Z34fitlTEg%3D%3D'

# 切割成键值对
# 1、稳妥方案
# cookie_list = temp.split('; ')  #以 分号+空格 为标记分割
# cookies = {}   #创建一个cookies字典
#
# for cookie in cookie_list:
#     cookies[cookie.split('=')[0]] = cookie.split('=')[-1]  #获取等号右边的值

# 2、优化方案(字典推导式写得特别6)
cookie_list = temp.split('; ')
cookies = {cookie.split('=')[0]: cookie.split('=')[-1] for cookie in cookie_list}

print(cookies)

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

# 验证
with open('github_with_cookies.html','wb')as f:
    f.write(response.content)
# requests模块:cookiejar对象处理
# cookiejar对象转换为cookies字典的方法:1、转换方法 cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)
# 2、其中 response.cookies 返回的就是cookiejar类型的对象 3、requests.utils.dict_from_cookiejar 函数返回cookies字典
# 4、requests.utils.cookiejar_from_dict 函数返回字典的cookiejar类型的对象,但会丢失域名

import requests

url = 'http://www.baidu.com'

response = requests.get(url)
print(response.cookies)

dict_cookies = requests.utils.dict_from_cookiejar(response.cookies)
print(dict_cookies)

jar_cookies = requests.utils.cookiejar_from_dict(dict_cookies)
print(jar_cookies)

超时参数timeout的使用

requests.get(url, timeout=3)

# timeout 参数的使用

import requests

url = 'https://twitter.com'

response = requests.get(url,timeout=3) #3秒连接不成功即返回失败,防止程序阻塞

代理

1、什么是代理:代理IP是一个ip,指向的是一个代理服务器,通常用作应对网站反爬

2、分类:正向代理和反向代理,以知不知道最终服务器的地址为判断标准

3、代理IP的分类:(1)按匿名度,透明、匿名、高匿 (2)协议,http、https、socks

4、使用:requests.get(url, proxies=proxies)

代理使用成功不会有任何报错,能成功获取响应;如果失败,要么卡滞,要么报错

# 代理:是一个ip,指向的是一个代理服务器
# 正向代理和反向代理,以知不知道最终服务器的地址作为判断标准
# 代理分类:透明、匿名、高匿,服务器能否判断出代理为标准,使用高匿代理效果最好
# 协议分类:http、https、socks
# 用法:response = requests.get(url, proxies=proxies), proxies形式是字典,例如:
# proxies = { 'http' : 'http://12.34.56.79:9527',
#           'https' : 'http://12.34.56.79:9527' }
# 如果proxies字典中包含多个键值对,发送请求时将按照url地址的协议来选择使用响应的代理ip

# 代理使用成功不会有任何报错,能成功获取响应;如果失败,要么卡滞,要么报错

import requests

url = 'https://www.baidu.com/'

# 构建代理字典,代理从网上搜免费,但是需要甄别筛选
proxies = {
    'http': 'http://36.56.100.109:9999',
    # 'https': 'https://223.240.208.230:1133'
}

# response = requests.get(url)
response = requests.get(url, proxies=proxies)
print(response.text)

CA认证

# 爬虫过程遇到 网站的CA证书没有经过认证,会导致连接不是私密链接,无法进入。解决:无视忽略CA证书

import requests

url = 'https://sam.huat.edu.cn:8443/selfservice'

response = requests.get(url, verify=False) # 直接添加参数,有警告但无碍

print(response.content)

requests模块发送post请求

1、实现方法:requests.post(url, data), data是一个字典

2、post数据来源 «重点/难点»

(1)固定值: 抓包比较不变值

(2)输入值: 抓包比较根据自身变化值

(3)预设值-静态文件: 需要提前从静态html中获取

(4)预设值-发请求: 需要指定地址发送请求

(5)在客户端生成的: 分析js,模拟生成数据

# requests模块发送 post 请求
# 方法:response = requests.post(url,data), data 参数接收一个字典
# requests 模块发送post请求函数的其他参数和发送 get 请求的参数完全一致

import json
import sys
import requests

class King(object):

    def __init__(self,word):
        self.url = 'http://ifanyi.iciba.com/index.php?c=trans&m=fy&client=6&auth_user=key_ciba&sign=37218aa29f55fdcc'

        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
        }

        self.data = {
            'from': 'zh',
            'to': 'en',
            'q': word
        }

    def get_data(self):
        # 使用post发送一个请求
        reponse = requests.post(self.url, data=self.data, headers=self.headers)
        return reponse.content

    def data_param(self,data):
        # loads方法将json字符串转化成python字典
        dict_data = json.loads(data)
        print(dict_data['content']['out'])

    # 编写爬虫逻辑
    def run(self):
        # url
        # headers
        # data字典
            # post数据来源:(难点)
            # 1、固定值:        抓包比较不变值
            # 2、输入值:        抓包比较根据自身变化值
            # 3、预设值-静态文件: 需要提前从静态html中获取
            # 4、预设值-发请求:  需要对指定地址发送请求
            # 5、在客户端生成:   分析js,模拟生成数据
        # 发送请求获取响应
        reponse = self.get_data()
        # print(reponse)
        # 数据解析
        self.data_param(reponse)

if __name__=='__main__':
    # print(sys.argv)
    # word = input('请输入要翻译的单词或句子:')
    word = sys.argv[1]
    king = King(word)
    king.run()

requests.session 进行状态保持

1、作用:自动处理cookies

2、场景:连续的多次请求

3、使用方法:

session = requests.session                      #实例化session
response = session.get(url, headers=headers)    #调用session方法发送get请求
response = session.post(url, data, headers)
# 知识点:掌握 利用 requests.session 进行状态保持
# 作用:自动处理cookie
# 场景:连续的多次请求
# 使用方法:先利用requests创建session的类,然后借助session类调用get或者post发送请求

# 以 GitHub登陆 为例

import requests
import re

def login():
    # session,创建session对象
    session = requests.session()

    # headers
    session.headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
    }

    # url1-获取token
    url1 = 'https://github.com/login'
        # 发送请求获取响应
    res_1 = session.get(url1).content.decode()
        # 正则表达式提取token
    token = re.findall('name="authenticity_token" value="(.*?)" /> ', res_1)
          # 'name="authenticity_token" value="z/c5WeKPQcc9nQ0wECMnJGKtE3zPtzT85J3QQ/+54ejFtUQW0xkwuA3XA1GA85DTnN4VkXp4i0AYd2iboS4rXw==" /> '
    # print(token)

    # url2-登陆
    url2 = 'https://github.com/session'
        # 构建表单数据
    data = {
        "commit": "Sign in",
        "authenticity_token": token,
        "login": "ch_cjb@163.com",
        "password": "******",  #密码隐藏
        "webauthn-support": "supported",
        "webauthn-iuvpaa-support": "unsupported",
        "return_to": "https://github.com/login"
    }
    # print(data)
        # 发送请求登录
    session.post(url2, data=data)

    # url3-验证
    url3 = 'https://github.com/jinbao1chen'
    response = session.get(url3)
    with open('github_session.html','wb') as f:
        f.write(response.content)

if __name__ == '__main__':
    login()

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦