爬虫之requests模块相关
涂寐 Lv4

声明

本教程仅供学习参考,请勿用在非法途径上,违者后果自负,与笔者无关。 –涂寐

概念理解

  • python原生的基于网络请求的模块,用于模拟浏览器发起请求

    配置环境

    1
    2
    python -m pip install --upgrade pip	#更新pip
    pip install requests #安装request模块

    使用流程

  • 指定url
    • 伪造User-Agent
    • 处理请求参数
  • 发起请求
  • 获取响应数据
  • 持久化存储

    项目实战

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 目的:爬取本人博客首页

    # 导入requests模块
    import requests

    # “__name__”是Python的内置变量,用于指代当前模块
    if __name__ == "__main__":
    # 1、指定url
    url = 'https://0xtlu.me/'
    # 2、发起get请求,返回响应对象
    # 注意请求方式:post or get
    response = requests.get(url=url)
    # 3、获取响应数据-->.text:字符串形式源码数据
    page_text = response.text
    print(page_text)
    # 4、持久化存储
    with open('./0xtlu.html', 'w', encoding='utf-8') as fp:
    fp.write(page_text)
    print('博客爬取完毕!!')

    实战巩固

    • 目的:爬取搜狗指定词条页面
      • UA检测:门户网站使用User-Agent进行身份认证,实现反爬机制
      • UA伪装:爬虫伪造UA,实现反反爬机制
    • 目的:破解百度翻译
      • post请求:携带某些参数
      • 响应数据:json形式
    • 目的:爬取豆瓣电影分类排行榜
    • 目的:爬取肯德基各地餐厅查询
    • 目的:爬取药监局生产许可信息
      • 循环爬取多页面
      • 提取具体某个数据

        搜狗网页采集器

        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
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        #!/usr/bin/python
        # -*-coding:utf-8 -*-
        # 以上两行说明
        # 第一行,提示linux/Mac OS 此为python可执行程序,对Windows无效
        # 第二行,提示Python解释器 按照UTF-8编码读取源代码

        # 目标:爬取搜狗指定词条页面
        # 导入requests模块
        import requests

        # "__name"为python内置变量,指代当前模块
        if __name__ == "__main__":
        # 6、UA伪装
        # 将某个浏览器的User-Agent封装到字典中
        # 在发起请求中通过headers参数进行篡改UA
        # 字典键值对中值过长警告:PEP 8: E501 line too long (138 > 120 characters)
        headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
        }

        # 1、指定url
        # 删除非必要参数,缩短url
        # url中不需要参数写入部分
        url = 'https://www.sogou.com/web'

        # 2、使用字典存储url中参数,方便动态使用
        kw = input('Please enter the word:')
        params = {
        'query': kw
        }

        # 3、发起请求
        # 通过params写入动态参数query
        # 通过headers写入伪造UA
        # 发起带参数的get请求
        response = requests.get(url=url, params=params, headers=headers)

        # 4、获取数据
        page_text = response.text
        print(page_text)

        # 5、持久化存储
        fileName = kw + '.html'
        with open(fileName, 'w', encoding='utf-8') as fp:
        fp.write(page_text)
        print(fileName, '成功拉取')

        爬取百度翻译

        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
        28
        29
        30
        31
        32
        33
        34
        #!/usr/bin/python
        # -*-coding=utf-8-*-

        # 爬取百度翻译
        # 涉及网页局部刷新:ajax
        # 看从哪个响应包获得数据:F12-->Network-->Fetch/XHR-->Headers或Payload-->Preview

        # 需要的模块
        import json
        import requests

        if __name__ == "__main__":
        # 1、指定url
        post_url = 'https://fanyi.baidu.com/sug'
        # 2、ua伪装
        headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
        }
        # 3、url参数处理
        text = input('Please enter the word:')
        data = {
        'kw': text
        }
        # 4、发送post请求
        response = requests.post(url=post_url, data=data, headers=headers)
        # 5、获取数据-->json():响应类型需为json方可使用;返回类型为obj
        dic_obj = response.json()
        print(dic_obj)
        # 6、持久化存储
        # 不适用ascii编码(默认使用):ensure_ascii=False
        fp = open('./'+text+'.json', 'w', encoding='utf-8')
        json.dump(dic_obj, fp=fp, ensure_ascii=False)
        fp.close()
        print('成功翻译!!!')

        爬取豆瓣电影信息

        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
        28
        29
        30
        31
        32
        33
        34
        #!/usr/bin/python
        # -*-encoding=utf-8-*-
        # 爬取豆瓣信息
        # 持续加载界面(加载更多)
        import json

        import requests

        if __name__ == "__main__":
        # 1、指定URL
        # 不同链接,参数不一样
        url = 'https://movie.douban.com/j/chart/top_list'
        # 2、ua伪造
        headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
        }
        # 3、URL参数处理
        param = {
        'type': '11', # 分类
        'interval_id': '100:80', # 优良率
        'action': '',
        'start': '0', # 从何开始
        'limit': '20', # 是何范围
        }
        # 4、发起请求
        # 注意请求方式,需与 Netword 中一致
        response = requests.get(url=url, params=param, headers=headers)
        list_data = response.json()
        print(list_data)
        # 5、持久性存储
        fp = open('./douban.json', 'w', encoding='utf-8')
        json.dump(list_data, fp=fp, ensure_ascii=False)
        fp.close()
        print('影视产品爬取完毕!!!')

        爬取药监局生产许可信息

        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
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        #!/usr/bin/python
        # -*-encoding=utf-8-*-
        # 拉取国家药物管理局官网某化妆品许可证查公司
        # http://scxk.nmpa.gov.cn:81/xk/
        # 抓包发现 http://scxk.nmpa.gov.cn:81/xk/ 为ajax动态加载数据,罗列出各化妆品公司列表,内容涵括id属性
        # 查看某公司化妆品生产许可证信息发现,仍是使用ajax请求加载:http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=e0d91bbf627b45ca91051f70cef274ff
        # 多次观察URL,可判断为通过id绑定公司化妆品生产许可证详细信息
        # 现在问题,如何通过 http://scxk.nmpa.gov.cn:81/xk/ 中的公司列表,批量获取 http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById 中的详细信息
        import requests
        import json

        if __name__ == "__main__":
        # 拿个列表存储获取到的公司ID
        id_list = []
        # 拿个列表存储获取到的多个公司的详细信息
        all_data_list = []
        headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
        }

        # 循环爬取前5页id
        url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
        for page in range(1, 10):
        page = str(page)
        data = {
        'on': 'true',
        'page': page,
        'pageSize': '15',
        'productName': '',
        'conditionType': '1',
        'applyname': '',
        'applysn': ''
        }
        # page_json = (requests.post(url=url, headers=headers, data=data)).json()
        response = requests.post(url=url, headers=headers, data=data)
        page_json = response.json()
        # 为测试该界面获取到的信息 http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
        # print(page_json)
        # 根据返回包中list属性,取出list列表中每个字典ID属性对应的值(列表嵌套字典)
        for dic in page_json['list']:
        # append()方法用于在列表末尾添加新的对象
        id_list.append(dic['ID'])
        # 循环获取所有公司具体信息
        allUrl = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
        for allId in id_list:
        idData = {
        'id': allId
        }
        allResponse = requests.post(url=allUrl, headers=headers, data=idData)
        page_allJson = allResponse.json()
        # print(page_allJson)
        all_data_list.append(page_allJson)
        # print(all_data_list)
        fp = open('./allData.json', 'w', encoding='utf-8')
        json.dump(all_data_list, fp=fp, ensure_ascii=False)
        print('列表枚举成功!!!')
  • 本文标题:爬虫之requests模块相关
  • 本文作者:涂寐
  • 创建时间:2021-12-06 23:20:16
  • 本文链接:https://0xtlu.github.io/article/82b683e3.html
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论