首页 > 其他分享 >爬虫系统学习2——爬虫requests库

爬虫系统学习2——爬虫requests库

时间:2024-12-01 22:58:15浏览次数:4  
标签:url self 爬虫 学习 headers session cookie requests

目录

  • 1、发送带headers的请求——模仿浏览器获取和浏览器一致的数据
    • (1)什么是参数
      • 注意:
  • 2、练习——贴吧爬虫
    • (1)回忆面向对象
    • (2)回忆快速生成列表
    • (3)代码及运行结果
  • 3、requests模块发送post请求
    • (1)回忆哪些地方会用到 POST 请求
    • (2)用法
    • (3)通过百度翻译的例子来看 post 请求如何使用
      • 代码
      • 结果
      • 自定义输入
  • 4、requests模块使用代理
    • (1)为什么爬虫需要使用代理?
    • (2)区别
    • (3)用法:
    • (4)分类
    • (5)代码
    • (6)注意
  • 5、requests模拟登录的三种方式
    • (1)cookie和session的区别
    • (2)爬虫处理 cookie 和 session
    • (3)处理 cookies session 请求
    • (4)使用session来登录easy-mock(仅需账号密码就能登录而不需要拖动进度条或者图形验证码的网站)
      • 使用 cookie 来登录easy-mock
    • (5)不发送 post 请求,直接使用 cookie 获取登陆后的网站
    • (6)cookie 作为 requests.get(cookies=) 的参数是字典——将字符串转化为字典 字典推导式
    • (7)总结:获取登录后页面的三种方式
  • 6、requests模块发送请求和获取网页字符串
    • 1) requests 中解决编解码问题
    • 2)response.content 和 response.text 的对比
  • 7、requests 保存图片——二进制文件的保存

引入:

# 判断状态码
assert response.status_code==200 
# 一些命令
response=requests.get(url,headers=headers)
response.headers
response.request.url
response.url
response.request.headers

在这里插入图片描述

1、发送带headers的请求——模仿浏览器获取和浏览器一致的数据

(1)什么是参数

在这里插入图片描述

eg http://www.baidu.com/s?wd=python&c=d
参数的形式:字典
kw={‘wd’:‘长城’}
用法 requesr.get(url,params=kw)

import requests

headers={'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36'}
p={'wd':'python'}

r = requests.get('http://www.baidu.com/s?',headers=headers,params=p)
print(r.status_code)
print(r.request.url)

在这里插入图片描述

注意:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、练习——贴吧爬虫

(1)回忆面向对象

在这里插入图片描述

(2)回忆快速生成列表

[i for i in range(3)]
[i+3 for i in range(3)]

在这里插入图片描述

(3)代码及运行结果

对比以下两端代码,应用面向对象思想的代码明显可读性要高很多

import requests
class TiebaSpider:
    def __init__(self,tiebaname):#初始化
        self.tiebaname=tiebaname
        self.url_temp='http://tieba.baidu.com/f?kw='+tiebaname+'&ie=utf-8&pn={}'
        self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}
    def run(self):#主程序执行
        # 1、制造 url 列表
        url_list=[self.url_temp.format(i*50) for i in range(50)]
        # 2、遍历、发送请求、获取响应
        for url in url_list:
            print(url)
            r = requests.get(url,headers=self.headers)
            c = r.content.decode()
            # 3、保存
            filepath = '{}-第{}页'.format(self.tiebaname,url_list.index(url)+1)# 李毅-第1页......
            with open(filepath,'w',encoding='utf-8') as f:
                f.write(c)

if __name__=='__main__':
    tieba = TiebaSpider('李毅')
    tieba.run()
import requests

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

    def get_url_list(self):# 构造 Url 列表
        return [self.url_temp.format(50*i) for i in range(10)]

    def parse_url(self,url):# 发起请求,返回响应
        r = requests.get(url,headers=self.headers)
        return r.content.decode()

    def save(self,html_str,page_num):
        filepath='{}吧-第{}页.html'.format(self.tiebaname,page_num)# lol吧-第1页。html
        with open(filepath,"w",encoding='utf-8') as f:
            f.write(html_str)

    def run(self):
        # 1、构造 Url 列表
        url_lists=self.get_url_list()
        # 2、遍历、发起请求、获得响应
        for url in url_lists:
            html_str = self.parse_url(url)
            # 3、保存
            page_num = url_lists.index(url)+1
            self.save(html_str,page_num)

if __name__=='__main__':
    tieba = TiebaSpider('lol')
    tieba.run()

这里仅展示部分:
在这里插入图片描述
在这里插入图片描述
爬取的html中有大量被注释掉的部分——原因:网页的源代码也被注释掉了在这里插入图片描述
为什么源代码被注释掉,在原网页依然正常显示:利用js将注释符号去掉

列表推导式
[self.url_temp.format(50*i) for i in range(10)]

3、requests模块发送post请求

requests 深入
发送 post 请求
使用代理
处理 cookies session

(1)回忆哪些地方会用到 POST 请求

  • 登陆注册
  • 需要传输大文本

(2)用法

r = requests.post('url',data=data,headers=headers)

data的形式:字典

(3)通过百度翻译的例子来看 post 请求如何使用

参考文档:链接: 百度翻译开发者文档
1
在这里插入图片描述
2
在这里插入图片描述
3
在这里插入图片描述

  • 使用 pycharm 小技巧——重新格式化代码来美化代码,提高代码的可读性
    在这里插入图片描述
  • 使用 pycharm 小技巧 光标跳到行首或者行尾快捷键:
    Ctrl + 左方括号 快速跳到代码开头
    Ctrl + 右方括号 快速跳到代码末尾

代码

# -*- coding: utf-8 -*-

# This code shows an example of text translation from English to Simplified-Chinese.
# This code runs on Python 2.7.x and Python 3.x.
# You may install `requests` to run this code: pip install requests
# Please refer to `https://api.fanyi.baidu.com/doc/21` for complete api document

import requests
import random
import json
from hashlib import md5

# Set your own appid/appkey.
appid = '20240604002069765'
appkey = 'FYj6ztBmjGCjXlfQ8FdM'


from_lang = 'auto'
to_lang =  'zh'

endpoint = 'http://api.fanyi.baidu.com'
path = '/api/trans/vip/translate'
url = endpoint + path

query = 'Hello World! This is 1st paragraph.\nThis is 2nd paragraph.'

# Generate salt and sign-----salt:随机数	可为字母或数字的字符串--------sign:签名	appid+q+salt+密钥的MD5值
def make_md5(s, encoding='utf-8'):
    return md5(s.encode(encoding)).hexdigest()

salt = random.randint(32768, 65536)
sign = make_md5(appid + query + str(salt) + appkey)

# Build request
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}

# Send request
r = requests.post(url, params=payload, headers=headers)
result = r.json()

# Show response
print(json.dumps(result, indent=4, ensure_ascii=False))

#json.dumps():这是 Python json 模块中的一个函数,用于将 Python 对象(通常是字典或列表)转换为 JSON 格式的字符串

res=[i['dst'] for i in result["trans_result"]]
print(res)

结果

在这里插入图片描述
在这里插入图片描述

自定义输入

query=input()
from_lang = ‘auto’
to_lang = ‘en’
在这里插入图片描述

4、requests模块使用代理

(1)为什么爬虫需要使用代理?

  • 让服务器以为不是同一个客户端在请求
  • 防止我们的真实地址被泄露,防止被追究

(2)区别

浏览器知道服务器的信息:正向代理(vpn访问google服务器)
不知道服务器的信息:反向代理(django nginx)
在这里插入图片描述

(3)用法:

requests.get("http://www.baidu.com", proxies = proxies)
#proxies的形式:字典

(4)分类

透明、高匿、普匿

(5)代码

# https://www.kuaidaili.com/free/intr
import requests
proxies={'http':'http://8.220.204.215:8008'}
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}
r = requests.get('http://www.baidu.com',proxies=proxies,headers=headers)
print(r.status_code) #200

(6)注意

  • 准备一堆ip地址,组成ip池,随机选择一个ip来使用
  • 如何随机选择代理ip,让使用次数较少的Ip地址有更大的可能性被用到
    (1){“ip”:ip,“times” :0}
    (2)[{},{},{},{},{}}],对这个ip的列表进行排序,按照使用次数进行排序
    (3)选择使用次数较少的10个ip,从中随机选择一
  • 检查ip的可用性
    (1)可以使用requests添加超时参数,判断ip地址的质量
    (2)在线代理ip质量检测的网站

5、requests模拟登录的三种方式

(1)cookie和session的区别

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

(2)爬虫处理 cookie 和 session

  • 带上cookie、session的好处
    能够请求到登录之后的页面
  • 带上cookie、session的弊端
    一套cookie和session往往和一个用户对应请求太快,请求次数太多,容易被服务器识别为爬虫
  • 不需要cookie的时候尽量不去使用cookie
    但是为了获取登录之后的页面,我们必须发送带有cookies的请求

(3)处理 cookies session 请求

requests 提供了一个叫做session类,来实现客户端和服务端的会话保持
使用方法:
1.实例化一个session对象
2让session发送get或者post请求
session=requests.session()
response=session.get(url,headers

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

  • 实例化session
  • 先使用session发送请求,登录网站,把cookie保存在session中
  • 再使用session请求登陆之后才能访问的网站,session能够自动的携带登录成功时保存在其中的cookie,进行请求

(4)使用session来登录easy-mock(仅需账号密码就能登录而不需要拖动进度条或者图形验证码的网站)

import requests
s = requests.session()
post_url='https://mock.presstime.cn/login'
post_data={'name':'damon','password':'wy062600'}
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}
# 使用session发送post请求,cookie保存在其中
s.post(post_url,data=post_data,headers=headers)
#在使用session进行请求登录后才能访问的地址
r=s.get('https://mock.presstime.cn/',headers=headers)
#保存页面
with open('1.html','w',encoding='utf-8') as f:
    f.write(r.content.decode())

说明:post_data查看方式:
在这里插入图片描述
代码运行结果:保存文件结果和个人主页源代码一致
在这里插入图片描述
在这里插入图片描述

使用 cookie 来登录easy-mock

import requests
# 将 cookie 放在 headers 中
headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
    'cookie':'easy-mock_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3NDllNDRkODNlZTAxMTEzMmJjMjQzYyIsImlhdCI6MTczMjg5NTgyMSwiZXhwIjoxNzM0MTA1NDIxfQ.WaO8C8Hl2bQ1ISSQFqiVBu-C0T1k1vNI_b_qigBJ-6o',
}
# 利用requests.get 获取主页内容
r=requests.get('https://mock.presstime.cn/',headers=headers)
#保存页面
with open('2.html','w',encoding='utf-8') as f:
    f.write(r.content.decode())

运行结果同上
在这里插入图片描述

  • 直接带 cookie 可以使得代码更简洁

(5)不发送 post 请求,直接使用 cookie 获取登陆后的网站

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

(6)cookie 作为 requests.get(cookies=) 的参数是字典——将字符串转化为字典 字典推导式

cookies='a=1; b=2; c=3'
cookies={i.split('=')[0]:i.split('=')[1] for i in cookies.split('; ')}
print(cookies)

在这里插入图片描述

(7)总结:获取登录后页面的三种方式

  • 实例化session,使用session发送post请求,再使用他获取登陆后的页面
  • headers中添加cookie键,值为cookie字符串
  • 在请求方法中添加cookies参数,接收字典形式的cookie。字典形式的cookie中的键是cookie的name对应的值,值是cookie的value对应的值

6、requests模块发送请求和获取网页字符串

import requests

r = requests.get('http://www.baidu.com')
print(r.status_code)
print(r.encoding) # utf-8
print(r.text) # response属性一般是名词,方法一般是动词
print(r.content) # bytes类型通过decode()进行解码
print(r.content.decode()) # 默认 utf-8 进行解码

1) requests 中解决编解码问题

response.content.decode()  # 推荐
response.content.decode('gbk')
response.text

2)response.content 和 response.text 的对比

response.text

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

response.content

  • 类型:bytes
  • 解码类型: 没有指定
  • 如何修改编码方式:response.content.deocde(“utf8”)

推荐 response.content.decode() : 因为用 response.text 修改编解码要些两行代码

7、requests 保存图片——二进制文件的保存

import requests

r = requests.get('https://requests.readthedocs.io/en/latest/_static/requests-sidebar.png')

with open('a.png','wb') as f:
    f.write(r.content)
  • 保存方式是 wb 的原因:wb 表示以 bytes 二进制类型保存,而 w 表示以 str 字符串的类型保存,图片(视频等二进制文件)只有以二进制的方式保存才能显示出来
  • r.content 是二进制内容

在这里插入图片描述

标签:url,self,爬虫,学习,headers,session,cookie,requests
From: https://blog.csdn.net/2301_78696436/article/details/144007699

相关文章

  • 2024-2025-1 20241406 刘书含《计算机基础与程序设计》第十周学习总结
    一·教材内容学习《计算机科学概论》第14章1.模拟与离散事件模拟:使用计算机模型来模拟现实世界的过程或系统。离散事件模拟:详细阐述离散事件模拟的原理和方法,包括如何定义事件、时间推进、状态更新等关键步骤,关注于模拟随时间发生的离散事件,如排队系统中顾客的到达和服务。2.......
  • 单片机学习笔记 14. 定时/计数器_中断
    更多单片机学习笔记:单片机学习笔记1.点亮一个LED灯单片机学习笔记2.LED灯闪烁单片机学习笔记3.LED灯流水灯单片机学习笔记4.蜂鸣器滴~滴~滴~单片机学习笔记5.数码管静态显示单片机学习笔记6.数码管动态显示单片机学习笔记7.独立键盘单片机学习笔记8.矩阵键盘按......
  • D85【python 接口自动化学习】- pytest基础用法
    day85pytest指定目录或文件执行测试用例学习日期:20241201学习目标:pytest基础用法--pytest指定目录,文件执行测试用例学习笔记:pytest指定目录或文件执行测试用例终端执行用例pytest不跟目标目录或文件,执行根目录下所有符合规则的测试用例终端执行用例pytest指定......
  • 单片机学习笔记 15. 串口通信(理论)
    更多单片机学习笔记:单片机学习笔记1.点亮一个LED灯单片机学习笔记2.LED灯闪烁单片机学习笔记3.LED灯流水灯单片机学习笔记4.蜂鸣器滴~滴~滴~单片机学习笔记5.数码管静态显示单片机学习笔记6.数码管动态显示单片机学习笔记7.独立键盘单片机学习笔记8.矩阵键盘按......
  • 【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分
    本文由RTOS专家JeanJ.Labrosse撰写。基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。什么是堆栈溢出?为了让我们在......
  • 学习计划:第一阶段(第二周)
    目录第一阶段第二周内容细化第一天-第二天:丰富学生类的属性和方法属性扩展:方法添加:第三天-第四天:对象间的交互与关联(以班级和学生为例)创建班级类:建立关联:第五天:代码整合与优化整合代码:代码优化:第一天:丰富学生类的属性和方法第二天:丰富学生类的属性和方法第......
  • Task03&Task04学习笔记
    Task03数据类型和操作常用内置类型整数Integer(int)浮点数Float布尔值Boolean(bool)类型Type(“类型”也是种类型!)example:print(type(12.1)输出结果为:<class'float'>print(type(2))输出结果为:<class'int'>print(type(2<2.2))输出结果为:<class'bool&#......
  • python基础学习6和7
    模块类与对象模块内置模块time,random,os,json第三方模块requests,pandas,numpy,....自定义模块xxx.py常见的内置模块hashlib模块该模块主要是进行数据加密的作用。常见的加密方式:sha256()【可逆】md5()【不可逆】importhashlibinfo='123456'#......
  • [Python学习笔记4]——函数
    目录 1.函数的定义2.传递实参2.1位置实参2.2关键字实参2.3给形参指定默认值3.返回值3.1返回简单值3.2将形参的默认值指定为空字符串以实现实参可选3.3返回字典或列表4.传递列表4.1向函数传递列表4.2在函数中修改列表4.3禁止函数修改列表(使用列表切......
  • 【NLP 3、深度学习简介】
    列夫托尔斯泰写:“如果你能感受到痛苦,那么你还活着;如果你能感受到他人的痛苦,那么你才是人”                                                         ......