zoukankan      html  css  js  c++  java
  • pathon爬虫之request模块的使用

    1.request

    1.基于网络请求的模块。
    2.环境的安装:pip install requests
    3.作用:模拟浏览器发起请求
    4.分析requests的编码流程:
        1.指定url
        2.发起了请求
        3.获取响应数据
        4.持久化存储
    

    2.需求:爬取搜狗首页的页面源码数据

    import requests
    #1.指定url
    url = 'https://www.sogou.com/'
    
    #2.发起请求,get的返回值是一个响应对象
    response = requests.get(url)
    
    #3.获取响应数据,text属性返回的是字符串形式的响应数据
    page_text = response.text
    
    #4,持久化存储
    with open('./sogou.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    

    3.需求:简易的网页采集器

    url = 'https://www.sogou.com/web?query=人民币'
    response = requests.get(url)
    #修改响应数据的编码格式
    response.encoding = 'utf-8'
    page_text = response.text
    with open('./人民币.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    

    4.处理数据量级的问题:

    1.遇到了对应的反爬机制
    2.反爬机制:UA检测
    3.反反爬策略:UA伪装
    4.UA伪装的实现:
        1.定义一个字典
        2.在字典中进行相关请求头信息的伪装
        3.将该字典作用到get方法的headers参数中即可
        UA检测被作用到了大量的网站中,因此日后,爬虫程序编写中一定要直接加上UA的操作
    5.请求参数的动态化
        实现:
        1.定义一个字典
        2.字典中的键值就是url携带的参数
        3..将字典作用到get方法的params参数中
    

    5.需求:爬取豆瓣电影的详情数据

    • 分析:
      更多的电影数据是通过将滚轮滑动到底部后发起了ajax请求请求到的电影数据
      对ajax请求的url进行捕获
      对ajax请求的url进行请求发送
    url = 'https://movie.douban.com/j/chart/top_list'
    fp = open('./movieData.txt','a+',encoding='utf-8')
    for i in range(0,10):
        param = {
            'type': '13',
            'interval_id': '100:90',
            'action': '',
            'start': str(i*20),
            'limit': '20',
        }
        response = requests.get(url=url,params=param,headers=headers)
        #json()将json串进行序列化
        movie_list = response.json()
        for dic in movie_list:
            name = dic['title']
            score = dic['score']
            fp.write(name+':'+score+'
    ')
        print('第{}页数据爬取成功!'.format(i))
    fp.close()
    

    6.肯德基餐厅查询http://www.kfc.com.cn/kfccda/storelist/index.aspx

    • 分析:
      1.动态加载数据
      概念:通过其他/另一个请求请求到的数据
      特性:可见非可得
      2.判定相关的页面数据是否为动态加载的数据?
      基于抓包工具定位到浏览器地址栏url对应的请求数据包,进行局部搜索:
      - 搜索到:这组被搜索的数据不是动态加载的,可以直接爬取
      - 没有搜到:这组数据是动态加载的,不可以直接爬取。
      3.如何捕获动态加载的数据?
      基于抓包工具进行全局搜索,最终可以定位到动态加载数据对应的数据包。
    import requests
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    }
    data = {
        'cname': '',
        'pid': '',
        'keyword': '广州',
        'pageIndex': '1',
        'pageSize': '10',
    }
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    response = requests.post(url=url,headers=headers,data=data)
    pos_data = response.json()
    pos_data
    

    7.药监总局数据爬取,爬取的是每一家企业的详情数据

    #获取企业id
    ids = [] #存储所有企业的id
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    for page in range(1,6):
        data = {
            'on': 'true',
            'page': str(page),
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': '',
        }
        company_datas_json = requests.post(url=url,headers=headers,data=data).json()
        for dic in company_datas_json['list']:
            _id = dic['ID']
            ids.append(_id)
            
    detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'       
    for _id in ids:
        data = {
        'id':_id
        }
        company_json = requests.post(url=detail_url,headers=headers,data=data).json()
        print(company_json['epsName'],company_json['epsProductAddress'])
    
  • 相关阅读:
    Dart回顾——单线程模型
    Dart回顾——var 、dynamic 、Object 区分及final、const、static关键字
    java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/camera/core/CameraFactory
    iOS10以上打包只有arm64 clang: error: invalid iOS deployment version '--target=armv7-apple-ios11.0', iOS 10 is the maximum deployment target for 32-bit targets [-Winvalid-ios-deployment-target]
    Mac flutter env: bash : No such file or directory
    Mac 设置默认 Shell
    flutter Operation not permitted
    读取本地json文件,并转换为dictionary
    UITextField只能输入数字NSCharacterSet实现
    rangeOfString 和 containsString 兼容iOS7处理
  • 原文地址:https://www.cnblogs.com/lvtaohome/p/12654023.html
Copyright © 2011-2022 走看看