• Python爬虫基础(四):使用更方便的requests库


    系列文章索引

    Python爬虫基础(一):urllib库的使用详解
    Python爬虫基础(二):使用xpath与jsonpath解析爬取的数据
    Python爬虫基础(三):使用Selenium动态加载网页
    Python爬虫基础(四):使用更方便的requests库
    Python爬虫基础(五):使用scrapy框架

    一、requests库的使用

    requests 库是用Python语言编写,用于访问网络资源的第三方库,它基于urllib,但比 urllib更加简单、方便和人性化。通过requests库可以帮助实现自动爬取HTML网页页面以及模拟人类访问服务器自动提交网络请求。

    使用起来注意与urllib进行比对。

    1、官方文档

    官方文档:
    https://requests.readthedocs.io/projects/cn/zh_CN/latest/
    快速上手:
    https://requests.readthedocs.io/projects/cn/zh_CN/latest/user/quickstart.html

    2、安装requests库

    # 进入到python安装目录的Scripts目录
    d:
    cd D:\python\Scripts
    # 安装
    pip install requests -i https://pypi.douban.com/simple
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、简单使用

    import requests
    
    url = 'http://www.baidu.com'
    
    response = requests.get(url=url)
    
    # 一个类型和六个属性
    # Response类型:
    print(type(response))
    
    # 设置响应的编码格式
    response.encoding = 'utf-8'
    
    # 以字符串的形式来返回了网页的源码
    print(response.text)
    
    # 返回一个url地址
    print(response.url)
    
    # 返回的是二进制的数据
    print(response.content)
    
    # 返回响应的状态码
    print(response.status_code)
    
    # 返回的是响应头
    print(response.headers)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    4、使用get请求

    总结:
    (1)参数使用params传递
    (2)参数无需urlencode编码
    (3)不需要请求对象的定制
    (4)请求资源路径中的问号?可以加也可以不加

    import requests
    
    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/92.0.4515.159 Safari/537.36'
    }
    
    data = {
        'wd':'北京'
    }
    
    
    # url  请求资源路径
    # params 参数
    # kwargs 字典
    response = requests.get(url=url,params=data,headers=headers)
    
    content = response.text
    
    print(content)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    5、使用post请求

    总结:
    (1)post请求 是不需要编解码
    (2)post请求的参数是data
    (3)不需要请求对象的定制

    import requests
    
    url = 'https://fanyi.baidu.com/sug'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    data = {
        'kw': 'eye'
    }
    
    # url 请求地址
    # data 请求参数
    # kwargs 字典
    response = requests.post(url=url,data=data,headers=headers)
    
    content =response.text
    
    print(content)
    
    import json
    
    obj = json.loads(content)
    print(obj)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    6、使用代理

    import requests
    
    url = 'http://www.baidu.com/s?'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
    }
    
    data = {
        'wd':'ip'
    }
    
    
    proxy = {
        'http':'212.129.251.55:16816'
    }
    
    response = requests.get(url = url,params=data,headers = headers,proxies = proxy)
    
    content = response.text
    
    with open('daili.html','w',encoding='utf-8')as fp:
        fp.write(content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    二、实战

    1、实战:实现古诗文网的登录

    (1)找到登录页面

    进入古诗文网:https://www.gushiwen.cn/
    点击【我的】,就进入了登录页面https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
    在这里插入图片描述

    # 获取登录页的源码
    import requests
    
    # 这是登陆页面的url地址
    url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    # 获取页面的源码
    response = requests.get(url = url,headers = headers)
    content = response.text
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    我们接下来需要做的就是,看这个网站进行登录操作,需要什么数据。

    (2)登录操作需要的数据

    我们输入错误的验证码,来判断调用登录接口需要的数据:

    在这里插入图片描述
    用户名密码和验证码我们都知道,这是登录必备的东西。
    除此之外的from和denglu表单字段,看着也像是固定写死的。

    但是,__VIEWSTATE 和__VIEWSTATEGENERATOR ,看着像是动态生成的,我们如何获取呢?

    (3)获取隐藏域中的数据

    我们右键->查看网页源代码,全局搜索,发现__VIEWSTATE 和__VIEWSTATEGENERATOR 是保存在页面隐藏域中的数据,一般情况看不到的数据 都是在页面的源码中,所以我们需要获取页面的源码 然后进行解析就可以获取了。
    在这里插入图片描述

    # 解析页面源码  然后获取_VIEWSTATE   __VIEWSTATEGENERATOR
    # 我们此处用bs4进行解析
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(content,'lxml')
    
    # 获取_VIEWSTATE的值
    viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
    print('获取__VIEWSTATE:' + viewstate)
    
    # 获取__VIEWSTATEGENERATOR的值
    viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
    print('获取__VIEWSTATEGENERATOR:' + viewstategenerator)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (4)获取验证码图片

    在这里插入图片描述
    我们发现,该图片的地址就是:https://so.gushiwen.cn/RandCode.ashx,每次刷新都是不同的验证码图片。

    此处我们获取验证码图片,不能通过request直接获取,因为要确保每次请求的session是相通的,所以我们需要通过session来获取验证码图片。

    # 获取验证码图片
    code = soup.select('#imgCode')[0].attrs.get('src')
    code_url = 'https://so.gushiwen.cn' + code
    
    # 有坑,需要使用session进行验证码的获取
    # import urllib.request
    # urllib.request.urlretrieve(url=code_url,filename='code.jpg')
    # requests里面有一个方法 session()  通过session的返回值 就能使用请求变成一个对象
    
    session = requests.session()
    # 验证码的url的内容
    response_code = session.get(code_url)
    # 注意此时要使用二进制数据  因为我们要使用的是图片的下载
    content_code = response_code.content
    # wb的模式就是将二进制数据写入到文件
    with open('code.jpg','wb')as fp:
        fp.write(content_code)
    
    # 获取了验证码的图片之后 下载到本地 然后观察验证码  观察之后 然后在控制台输入这个验证码 就可以将这个值给
    # code的参数 就可以登陆
    
    code_name = input('请输入你的验证码')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    将验证码保存到本地,登录的时候看一下验证码,然后进行输入。

    (5)登录操作

    获取到所有数据之后,拼装数据,调用登录接口post请求:

    # 点击登陆
    url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
    
    data_post = {
        '__VIEWSTATE': viewstate,
        '__VIEWSTATEGENERATOR': viewstategenerator,
        'from': 'http://so.gushiwen.cn/user/collect.aspx',
        'email': '', # 用户名
        'pwd': '', # 密码
        'code': code_name,
        'denglu': '登录',
    }
    
    response_post = session.post(url = url, headers = headers, data = data_post)
    
    content_post = response_post.text
    
    with open('gushiwen.html','w',encoding= ' utf-8')as fp:
        fp.write(content_post)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    (6)获取我的收藏

    登录完毕之后,只需要使用同一个session,就可以获取到我的全部信息了。

    # 获取我的收藏
    collect_url = 'https://so.gushiwen.cn/user/collect.aspx?sort=t'
    collect_info = session.get(url = collect_url)
    collect_context = collect_info.text
    with open('collect.html','w',encoding= ' utf-8')as fp:
        fp.write(content_post)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、实战:使用超级鹰验证码自动识别

    (1)超级鹰官网

    http://www.chaojiying.com/

    价格:http://www.chaojiying.com/price.html

    (2)下载

    点击【开发文档】:http://www.chaojiying.com/api-14.html
    在这里插入图片描述
    下载完成之后,会有一个实例,只需要使用其API即可实现图像自动识别:
    在这里插入图片描述

  • 相关阅读:
    快速将excel/word表格转换为web页面(html)的方法
    前端基础之《Bootstrap(8)—CSS组件_导航条》
    安装typescript环境并开启VSCode自动监视编译ts文件为js文件
    【代码】Android|获取存储权限并创建、存储文件
    Java中获取异常栈中的底层异常信息-分析Java异常栈
    区块链的两个核心概念之一签名, 另一个是共识.
    学习新知识时的几个技巧
    WEB开发技能树-CSS-height 100%
    Three.js 性能监视器 Stats
    微积分 - 隐函数求导的应用
  • 原文地址:https://blog.csdn.net/A_art_xiang/article/details/132803169