zoukankan      html  css  js  c++  java
  • 爬虫 requests 模块

    简单介绍requests 模块

     Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作。

    简单的使用例如:

    # 爬取指定的网页
    url = "https://philips-reporting.livecom.cn/admin/index.jsp"
    
    respones = requests.get(url) # 发送请求
    respones.encoding = "UTF-8" #爬取内容编码防止乱码
    page_text = respones.text
    
    with open("./live.html", "w", encoding="utf-8") as f: #持续性存储
        f.write(page_text) 
    

    上面这段代码,将爬取下来的网页进行了保存。

    那么我们 进行数据量级处理:

    1. 遇到对应的反爬机制,
    2. 反爬机制有:UA检测
      应对: 反反爬策略:UA伪装
      UA伪装:(1.定义一个字典 2.在字典中进行相关请求头的伪装 3.将伪装作用到get方法的headers参数中间即可)
    3. UA检测被作用到大量的网站当中,因此在爬取时一定要加上UA操作
    import requests
    
    url = "https://movie.douban.com/j/search_subjects"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
    param = {
        "type": "movie",
        "tag": "爱情",
        "sort": "recommend",
        "page_limit": 200,
        "page_start": 0,
    }
    response = requests.get(url, params=param, headers=headers)
    move_list = response.json()
    
    print(move_list)
    dict = {}
    for i in move_list.values():
        for j in i:
           print(f'{j["title"].replace(" ","")} {j["rate"]} 观看地址: {j["url"]}')
    

    请求参数动态化:

    最终实现请求参数动态化;

    1. 定义一个字典
    2. 字典中的键值对就是url 携带的参数
    3. 将字典作用到get 方法的params 方法中

    来实现一个简单的需求;
    爬取豆瓣电影的详情数据我们取电影名称,评分,以及电影地址:
    分析可以得出:
    1. 更多的数据请求是滚轮到达底部进行的ajax 请求。
    2. 请求的url 进行捕获
    3. url 的请求进行发送

    
    url = "https://movie.douban.com/j/search_subjects"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
    param = {
       "type": "movie",
       "tag": "爱情",
       "sort": "recommend",
       "page_limit": 200, #取多少步 这里可以设置为可变
       "page_start": 0, 从哪一部开始
    }
    response = requests.get(url, params=param, headers=headers)
    move_list = response.json() #数据转换
    
    print(move_list)
    dict = {}
    for i in move_list.values():
       for j in i:
          print(f'{j["title"].replace(" ","")} {j["rate"]} 观看地址: {j["url"]}')
    

    动态加载案例分析

    概念:通过其他或另一个请求得到的数据
    特性:非见非可见
    判断相关数据是否是动态加载数据;
    -基于抓包工具定位到浏览器地址栏url 对应的请求数据包,进行同步搜索,这组数据不是动态加载的可以直接爬取,没有搜取到这组数据是动态加载的,不介意直接爬取。
    如何捕获动态加载数据
    -基于抓包工具进行全局搜索,最终可以动态加载数据对应的数据包
    实例:非动态加载

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
    params = {
        "cname": "上海",
        "pid": "",
        "keyword": "上海",
        "pageIndex": 1,
        "pageSize": 100,
    }
    url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
    response = requests.get(url,headers=headers,params=params)
    
    kfc_store_address = response.json()
    # print(kfc_store_address)
    
    for i in kfc_store_address["Table1"]:
        # for j in i.items():
        print(f"店名:{i['storeName']} 地址: {i['provinceName']}{i['addressDetail']}")
    
    
    -------------------------------------------------------------------------------------------
    import requests
    ids = []
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}
    url = "http://125.35.6.84:81/xk/itownel/portalAction.do?method=getXkzsList"
    for page in range(1,6):
        data={
           'on':'ture',
            'page':str(page),
            'pageSize':"15",
            'praductName':'',
            'conditionType':'1',
            'applyname':'',
            'applyan':''
        }
        company_daya_json = requests.post(url=url,headers=headers,data=data).json()
        for dic in company_daya_json["list"]:
            _id=dic["ID"]
            ids.append(_id)
    detail_url = "http://125.35.6.84:81/xk/itownel/portalAction.do?method=getXkzsById"
    for _id in ids:
        data = {
            "id":_id
        }
        company_Json = requests.post(url=url,headers=headers,data=data).json()
        print(company_Json["epsName"],company_Json["epsProductAddress"])
    
  • 相关阅读:
    使用AntDesignBlazor的Notification等组件
    Blazor入门笔记(6)-组件间通信
    Blazor入门笔记(5)-数据绑定
    Blazor入门笔记(4)-组件的生命周期
    Blazor入门笔记(3)-C#与JS交互
    Blazor入门笔记(2)-分部类组件与组件的继承
    Blazor入门笔记(1)-从0构建一个组件
    添加右键上下文菜单后,点击后需要获取到源控件
    NPOI,给指定的excle创建个下拉框验证
    有的时候,给指定的控件,追加一个装饰器Adorner,备注下
  • 原文地址:https://www.cnblogs.com/wuzifan/p/14761000.html
Copyright © 2011-2022 走看看