一木.溪桥学爬虫-04:requests模块

一木.溪桥 在Logic Education跟Jerry学爬虫

07期:Python 爬虫
一木.溪桥学爬虫-04:requests模块、cookie、session
日期:2021年1月31日

学习目标:

  • requests模块

  • cookie

  • session


学习内容:

requests安装

  • pip install requests
  • pip install requests -i https://pypi.douban.com/simple

requests快速入门(重点)

  • requests.get(网址)

  • requests.content

    是直接从网站上抓取的数据,没有做任何的处理,也就是没有做任何的编码。返回字节流数据(二进制)

  • requests.text

    requests 模块将response.content 解码后得到的字符串requests模块它会猜一个解码方式 所以你在使用 response.text来查询响应结果的时候就会出现乱码:返回unicode格式的数据(str)

  • encode 编码

  • decode 解码

  • response.content.decode(‘utf-8’) 手动进行解码

  • response.url 返回url

  • response.encode() = ‘编码’

import requests
# 添加heasers
# 问题一 数据不对
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
# 携带参数
kw = {'wd': '中国'}
# 发起请求
response = requests.get('https://www.baidu.com/s?', params=kw, headers=headers)
# 响应对象
print(response.text)  # 获取网页源码
print(response.url)  # 获取请求的url
import requests


# 问题二 数据乱码
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}

# 发起请求
response = requests.get('https://qq.yh31.com/zjbq/2920180.html', headers=headers)
# print(response.text) 返回的是 str
# print(response.content) # 返回的是 bytes
# print(response.content.decode('utf-8')) # 推荐用这种方式 它返回的也是str类型的数据

response.encoding = 'utf-8'
print(response.text)

requests 小技巧

设置代理

  • 解决的是什么问题?

    • 解决的是一种封IP的反爬机制。
  • 设置代理

    • 代理服务器的IP

    • import requests
      url = 'http://httpbin.org/ip'
      # 设置代理
      proxy = {
          'http': '124.205.155.154:9090'
      }
      res = requests.get(url, proxies=proxy)
      print(res.text)
      
  • 代理IP的作用

    • 隐藏真实IP
    • 反反爬
  • 如何找代理IP

    • 免费的IP(几乎用不了)
    • 付费的IP
    • 快代理
  • 匿名度

    • 透明:它知道你真实的IP,也知道你使用了代理
    • 匿名:它知道你使用了代理,但是不知道你真实的IP
    • 高匿:不知道你使用了代理,也不知道你真实的IP

处理不信任的SSL证书

  • SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。

  • 测试网站 https://inv-veri.chinatax.gov.cn/

    res = requests.get(url, verify=False)
    
    import requests
    
    
    url = 'https://inv-veri.chinatax.gov.cn/'
    res = requests.get(url, verify=False)       # verify=False处理不信任的SSL证书的方法
    print(res.text)
    

cookie

  • cookie :通过在客户端记录的信息确定用户身份。

    HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。

cookie在爬虫当中有什么作用?

  • 反反爬(分情况)有的情况需要加上cookie,而有的情况加上cookie反而不好。

    import requests
    url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2021-01-31&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=BXP&purpose_codes=ADULT'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
        'Cookie':'_uab_collina=159490169403897938828076; JSESSIONID=059E6A956317A6C29612191B80756EAE; _jc_save_wfdc_flag=dc; _jc_save_fromStation=%u957F%u6C99%2CCSQ; _jc_save_toStation=%u5317%u4EAC%2CBXP; BIGipServerotn=770703882.38945.0000; BIGipServerpool_passport=82051594.50215.0000; RAIL_EXPIRATION=1612306095523; RAIL_DEVICEID=MUbHpgONO-X61Z236wAlH9EJl5tTVqhKDGL0CK19twFmu4Q2DzVSkR6Vzo5JmksTSutFybiXbqLCiq58Ogotzy4h_80GW4xL9sywrvxTIbthUTAS_qAPqjJ9doueJxATHNiptXa4jZrfnbXeQ07idJRMe5vs2NAo; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromDate=2021-01-31; _jc_save_toDate=2021-01-30'
    
    }
    res = requests.get(url, headers=headers)
    print(res.content.decode('utf-8'))
    
  • 模拟登录

    # 人人网模拟登录
    import requests
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
        'Cookie':'anonymid=kc1mze9joexboe; _r01_=1; taihe_bi_sdk_uid=c5ab893b13e43548f001c993d2154595; '
                 'jebe_key=5337f110-24a5-48d0-9393-8a1a4cc620c5%7Cbd5a1aba8e897ca35d9faabeb72dc675%7C1593503968723%7C1%7C1593503971085; jebe_key=5337f110-24a5-48d0-9393-8a1a4cc620c5%7Cbd5a1aba8e897ca35d9faabeb72dc675%7C1593503968723%7C1%7C1593503971087; depovince=HUN; JSESSIONID=abclfrdcXF9NbbatAOIDx; taihe_bi_sdk_session=65324970426d3a0861752a5ee25f5daa; ick_login=95400701-ce98-4eef-8120-5aeb3cb0dd9e; t=3b767095c882e7b11e76f06b0f1ca7584; societyguester=3b767095c882e7b11e76f06b0f1ca7584; id=974676254; xnsid=9d5e007a; jebecookies=498dd881-4b83-45e3-bcde-e57009790821|||||; ver=7.0; loginfrom=null; wp_fold=0'
    }
    url = 'http://www.renren.com/974676254/profile'
    req = requests.get(url, headers=headers)
    # print(req.text)
    with open('rr2.html', 'w', encoding='utf-8') as file_obj:
        file_obj.write(req.text)
    
  • 补充 遇到ajax加载的数据 动态网页的数据(不在源码当中)
    解决方式一 可以在NetWork中分析它的数据接口(看12306的案例)
    解决方式二 可以通过selenium来获取数据 (以后在说)
    
    
    

requests.session()(拓展)

  • session:通过在服务端记录的信息确定用户身份

  • 在这里我们主要说的是requests模块中的session 指的就是一个会话。

    • requests.session() # 保持会话
  • 例:需求:突破12306图片验证码 {result_message: “验证码校验成功”, result_code: “4”}

    • 第一种 账号正确 密码错误 验证码错误 {result_message: “验证码校验失败”, result_code: “5”}
    • 第二种 账号正确 密码错误 验证码正确 {result_message: “验证码校验成功”, result_code: “4”} login
    • 第三种 账号正确 密码正确 验证码正确
  • 步骤

    • 第一步 明确目标url https://kyfw.12306.cn/passport/captcha/captcha-check
      第二步 采用post 请求携带数据 response
      第三步 要获取验证码的图片
      第四步 找到正确的验证码
    补充
    注意 data:image/jpg;base64 需要删掉
    ​
    https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1612270067237&callback=jQuery19103867502059860666_1612270057099&_=1612270057100
    ​
    ​
    https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1612268610660&callback=jQuery19107815595372326347_1612268556807&_=1612268556812
    二者相同的内容
    https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand
    ​
    它就是一个12306图片验证码的链接
    需要删除 64
    https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand
    ​
    分析总结
    我们由正常的方式发现这个代码比较臃肿。所以就采用另外的方式来获取验证码的图片链接。
    第一次 打开登录页面的时候就有这个图片那就证明 肯定是有一个地址的存在 然后经过尝试和对比 得出了一个12306图片验证码的url
    
    import requests
    req = requests.session()  # 保持会话
    # 主机是win10  python 3.6.5
    #  win7 python 3.6.4
    def login():
    
        # 获取图片,对比https,删除-image64中的64
        pic_response = req.get('https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand')
        codeImage = pic_response.content
        fn = open('code2.png', 'wb')
        fn.write(codeImage)
        fn.close()
    
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
        }
        # 投机行为
        codeStr = input('请输入验证码坐标:')
        data = {
            'answer': codeStr,
            'rand': 'sjrand',
            'login_site': 'E',
        }
    
        response = req.post('https://kyfw.12306.cn/passport/captcha/captcha-check', data=data, headers=headers)
    
        print(response.text)
    
    login()
    
    
requests源码分析(拓展)

为什么要进行源码分析呢?

  • 1 提供思路 提供解决方案
  • 2 了解优秀代码的编写逻辑
  • 3 程序员基本的素养 企业的要求
  • 4 下载源码位置:https://github.com/
  • 5 Pycharm: File–>All close–>Check out from Version Control–>Git–>URL:…–>Test–>Clone–> 得到requests源码

End !
Best wishes for you!

<think>好的,我现在需要帮助用户解决在Linux上安装python-geohash时由于缺少wheel包而不得不使用legacy setup.py install的问题。用户希望避免这种情况,转而使用wheel包来安装。 首先,我得回忆下用户之前的对话历史。用户之前询问过如何在Linux安装python-geohash,我给出了步骤,包括安装依赖、使用pip安装,处理导入错误等。现在用户遇到了新的问题,涉及wheel包的缺失,导致pip回退到旧的安装方法。这可能是因为python-geohash没有提供预编译的wheel,或者用户的环境中没有安装wheel包,导致pip无法生成wheel,只能使用setup.py。 根据用户提供的引用内容,特别是引用[2]和[3],问题通常出现在项目缺少pyproject.toml且没有安装wheel包时,pip会使用旧的setup.py方式。解决方法可能包括安装wheel包,强制使用PEP 517标准,或者手动构建wheel。 首先,用户需要确保系统中已经安装了wheel包。根据引用[3],安装wheel可以避免使用legacy方法。所以在步骤里,应该先让用户安装wheel。命令是pip install wheel,如果用户使用Python3,可能需要用pip3。 然后,可能需要强制pip使用PEP 517模式,这可以通过--use-pep517选项实现,如引用[2]提到的。所以安装命令应该是pip install --use-pep517 python-geohash。不过,我需要确认这个选项是否适用于当前的情况,或者是否需要其他参数。 另外,用户可能遇到的情况是,即使安装了wheel,但python-geohash本身可能没有提供合适的配置,导致pip仍然无法生成wheel。这时候可能需要用户手动构建wheel。步骤包括下载源码包,使用python setup.py bdist_wheel生成wheel文件,然后安装。但这种方法需要用户先获取源码,可能稍微复杂,但可以作为备选方案。 另外,用户可能需要升级pip本身,因为旧版本的pip可能存在兼容性问题。所以建议用户先升级pip:pip install --upgrade pip。 此外,引用[4]提到另种安装方法是用python setup.py install,但用户想避免这个,所以重点应该放在如何让pip使用wheel。 可能的步骤总结: 1. 安装wheel包。 2. 升级pip到最新版本。 3. 使用--use-pep517选项安装。 4. 如果仍然失败,手动构建wheel。 另外,需要考虑Linux环境下可能的依赖问题,比如是否安装了编译所需的工具,如gcc、python-dev等,这些在之前的回答中已经提到,用户可能已经安装过了,但可能需要再次确认,避免编译时出错。 还要检查python-geohash的PyPI页面,看看它是否提供了wheel分发。如果官方没有提供wheel,那么用户可能需要从源码构建wheel,或者等待维护者提供。但根据用户的情况,可能需要手动处理。 最后,验证安装是否成功,用import geohash测试,如之前的步骤所示。 综上,分步骤的解决方案应包括安装wheel、升级pip、使用PEP 517,以及备选的手动构建方法,并确保系统依赖已安装。</think>### 分步解决方案 #### 步骤1: 安装或更新`wheel`包 Wheel是Python的二进制包格式,可避免使用`setup.py install`的旧安装方式。 ```bash pip install --upgrade wheel # 确保已安装最新版wheel # 若使用Python3且默认命令为pip3: pip3 install --upgrade wheel ``` #### 步骤2: 强制启用PEP 517模式 通过添加`--use-pep517`参数,强制pip使用现代构建系统(避免回退到`setup.py`)[^2]: ```bash pip install python-geohash --use-pep517 ``` #### 步骤3: 安装编译依赖(备用) 若仍提示构建失败,需确保系统已安装编译工具链: ```bash sudo apt-get update sudo apt-get install python3-dev gcc # 提供Python头文件和C编译器[^1] ``` #### 步骤4: 手动构建Wheel并安装(终极方案) 如果上述方法无效,可手动下载源码并构建Wheel: ```bash # 下载源码包 pip download python-geohash --no-binary :all: tar -xzf python-geohash-*.tar.gz # 解压源码 cd python-geohash-*/ # 生成Wheel文件 python setup.py bdist_wheel # 生成.whl文件 # 安装生成的Wheel pip install dist/*.whl # 自动使用二进制包 ``` #### 验证安装 ```python import geohash print(geohash.encode(39.9, 116.4)) # 预期输出类似'wx4g' ``` --- ### 关键问题解析 1. **为何强制使用PEP 517?** PEP 517定义了无需`setup.py`的构建标准,通过`pyproject.toml`声明构建依赖,避免传统安装方式的不稳定性。 2. **手动构建Wheel的作用** 当PyPI未提供预编译Wheel时(如某些库未适配Linux平台),手动构建可生成适配当前系统的二进制包,后续安装无需重复编译[^3]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值