S++

千线一眼

导航

python爬虫-requests模块

什么是requests模块

request模块是python原生的基于网络请求的模块,功能十分强大,简单便捷,效率极高。
你可以把它看作是模拟浏览器发起请求

request模块使用步骤

  • 指定url
    • UA伪装
    • 请求参数处理
  • 发起请求
  • 获取相应数据
  • 持久化存储

一些例子

练习1:实现一个简单的网页采集器
"""
练习1:实现一个简单的网页采集器
"""
import requests

# UA检测:门户网站的服务器会检测对应请求的身份标识(对不正常请求很有可能拒绝该次请求,所以UA伪装是必要的)
# UA: User-Agent(请求载体的身份标识)
# UA伪装:让爬虫对应请求载体身份标识伪装成某一款浏览器
if __name__ == "__main__":
    # UA伪装:将对应的User-Agent封装到一个字典中
    headers = {
        # 本机的谷歌浏览器
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/90.0.4430.212 Safari/537.36 "
        # 本机的Safari浏览器
        # "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
        #               "Version/14.1 Safari/605.1.15 "
    }
    url = "https://www.sogou.com/web"
    # 处理URL的参数
    # 搜索的词也应该是动态的
    kw = input("输入一个索引词:")
    param = {
        "query": kw
    }
    # 对指定的URL发起请求
    # 这个请求是携带参数的,并且在请求过程中处理了参数
    response = requests.get(url, params=param, headers=headers)
    page_text = response.text
    # 文件的名字也应该是动态的
    fileName = kw + ".html"
    with open("../data/" + fileName, 'w', encoding="utf-8") as fp:
        fp.write(page_text)
    print(fileName, "保存完毕")
练习2:破解百度翻译
"""
练习2:破解百度翻译
    - 对应的请求是一个post请求(携带了参数)
    - 响应数据是一组json数据
"""
import requests
import json

if __name__ == "__main__":
    # 1,指定url
    post_url = "https://fanyi.baidu.com/sug"
    # 2,进行UA伪装
    headers = {
        # 本机的谷歌浏览器
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/90.0.4430.212 Safari/537.36 "
        # 本机的Safari浏览器
        # "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
        #               "Version/14.1 Safari/605.1.15 "
    }
    # 3,post请求参数处理(同get请求一致)
    word = input("输入想要翻印的词:")
    data = {
        'kw': word
    }

    # 4,请求发送
    response = requests.post(url=post_url, data=data, headers=headers)
    # 5,获取响应数据,json对象返回的是一个对象(需要确定响应数据类型为json)
    dic_obj = response.json()
    print(dic_obj)
    # 6,持久化存储
    fileName = word + '.json'
    with open("../data/{}".format(word), 'w', encoding="utf-8") as fp:
        json.dump(dic_obj, fp=fp, ensure_ascii=False)  # 中文不能用ASC码编写
    print("结束!!!")
练习3:豆瓣电影评分前100信息
"""
练习3:豆瓣电影评分前100信息
"""
import requests
import json

if __name__ == "__main__":
    # 1,指定url
    url = "https://movie.douban.com/j/chart/top_list"

    # 2,进行UA伪装
    headers = {
        # 本机的谷歌浏览器
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/90.0.4430.212 Safari/537.36 "
        # 本机的Safari浏览器
        # "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
        #               "Version/14.1 Safari/605.1.15 "
    }
    # 3,从浏览器上复制的参数形成的字典
    param = {
        'type': '24',
        'interval_id': '100:90',
        'action': '',
        'start': '0',  # 从库中的第几部电影开始
        'limit': '20'   # 一次取出的电影个数
    }
    # 4,请求发送
    response = requests.get(url=url, params=param, headers=headers)
    # 5,获取响应数据,json对象返回的是一个对象(需要确定响应数据类型为json)
    list_data = response.json()
    print(list_data)
    # 6,持久化存储
    with open("../data/douban.json", 'w', encoding="utf-8") as fp:
        json.dump(list_data, fp=fp, ensure_ascii=False)  # 中文不能用ASC码编写
    print("结束!!!")
练习4:肯德基指定地点附近餐厅数目
"""
练习4:肯德基指定地点附近餐厅数目
url = http://www.kfc.com.cn/kfccda/index.aspx
"""
import requests


def get_place_text(headers, url, data, place):
    # 发起请求
    response = requests.post(url=url, data=data, headers=headers)
    # 获取数据
    page_text = response.text
    # 获取总的数据
    dic = eval(page_text)
    page_num = dic['Table'][0]['rowcount']
    for i in range(1, page_num // 10 + 2):
        data["pageIndex"] = str(i)
        # 发起请求
        response = requests.post(url=url, data=data, headers=headers)
        # 获取响应数据,是文本数据
        page_text += response.text + '\n'
        # 持久化存储
    filename = "肯德基_" + place + ".text"
    with open("../data/{}".format(filename), 'w', encoding="utf-8") as fp:
        fp.write(page_text)


if __name__ == "__main__":
    # 1,指定url,是一个post请求
    url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
    # 2,进行UA伪装
    headers = {
        # 本机的谷歌浏览器
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/90.0.4430.212 Safari/537.36 "
        # 本机的Safari浏览器
        # "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
        #               "Version/14.1 Safari/605.1.15 "
    }
    # 3,从浏览器上复制的参数形成的字典
    place = input("请输入一个地点:")
    data = {
        "cname": "",
        "pid": "",
        "keyword": place,  # 搜索的地点
        "pageIndex": "1",  # 第一个页面
        "pageSize": "10"  # 每个页面10个数据
    }
    get_place_text(headers, url, data, place)
综合案例:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
"""
综合案例:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
url = "http://scxk.nmpa.gov.cn:81/xk/"

动态加载数据:
    - 动态数据请求
    - 首页的信息是通过ajax请求来的
    - 每一条信息都有一个ID,通过ID可以访问到详细数据
    例:(浏览器上查看的信息)
        - http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=b3339d5c83244b7ebbb12e258353687a
        - http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=42c7c963b5dd4a758198f206242e0fad
    通过仔细观察可以发现:
        - url的域名都是一样的只有参数(id)不一样
        - id值可以通过首页对应的ajax请求到的json串中获得
        - 域名和id值拼接就可以获得一个企业的详情页数据了
    详情页数据也是动态加载出来的:(浏览器抓包工具获得)
        - http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
        - http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
    分析:
        - 携带的参数都是 各自的id
        - post请求来的url相同
        - 批量获取企业的id之后就可以批量的能获取到各企业详情页数据的url
"""
import requests
import json

if __name__ == "__main__":
    # 目的1:批量获取不同企业的id值
    # url是通过浏览器的抓包工具抓取的XHR中的文件得到的
    url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"

    # UA伪装
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) "
                      "Version/14.1 Safari/605.1.15 "
    }

    list_ids = []  # 用来存放id
    all_data_list = []  # 用来存放所有数据

    # 5个页面
    for page in range(1, 6):
        # 参数的封装
        data = {
            'on': 'true',
            'page': str(page),
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': ''
        }

        # post请求
        response = requests.post(url=url, headers=headers, data=data)
        # 这个json_id目前是字典的类型,id放在list参数中
        json_ids = response.json()
        # 拿出id
        for dic in json_ids['list']:
            list_ids.append(dic['ID'])

    # print(list_ids)

    # 目的2:获取企业详细数据
    url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
    for id in list_ids:
        data = {
            "id": id
        }
        response = requests.post(url=url, headers=headers, data=data)
        json_message = response.json()
        all_data_list.append(json_message)
        # print(json_message)
    # 持久化存储
    with open("../data/国家药局.json", 'w', encoding='utf-8') as fp:
        json.dump(all_data_list, fp=fp, ensure_ascii=False)

posted on 2022-03-02 20:08  S++  阅读(70)  评论(0)    收藏  举报