• anacanda


    爬虫 第一天

    课程简介

    • 什么是anacanda

      • 基于数据分析+ML(机器学习)的一个集成环境
    • 什么是jupyter

      • 就是anacanda提供的一个编辑环境(基于浏览器)
    • cell有两种模式

      • code
      • markdown

    快捷键

    • 插入cell:a,b

    • 删除cell:x

    • 执行cell:shift+enter

    • 切换cell的模式:m,y

    • tab:自动补全

    • shift+tab:打开帮助文档

    • 学习方法

      • 总结结论
        • user-agent:请求载体的身份标识
      • 重复

    爬虫

    • requeests
    • 数据解析
    • 如何提升爬取数据的效率
      • 线程池
      • 多任务的异步携程
    • scrapy
      • 分布式
    • 基于移动端数据的爬取
    • selenium

    数据分析:

    • 将数据的价值最大化

    ML

    • 特征工程
    • 机器学习的基础
    • 回归模型
    • 分类模型
      • 集成学习

    算法+数据结构

    • stack
    • 队列
    • 链表
    • 二叉树
    • 二分查找
    • 选择,冒泡
    • 插入
    • 希尔
    • 快速

    1.爬虫概述

    • 什么是爬虫
      • 通过编写程序模拟浏览器发请求,让其去互联网中爬取数据的过程。
    • 爬虫分类
      • 通用爬虫:抓取一整张页面源码的数据
      • 聚焦爬虫:抓取一张页面中局部的数据
        • 通用爬虫和聚焦爬虫之间的关联:
          • 聚焦需要建立在通用爬虫的基础之上
      • 增量式:监测网站数据更新的情况。以便将最新更新出来的数据进行爬取。
    • 爬虫的合法性探究
      • 爬虫所带来风险主要体现在以下2个方面:
        • 爬虫干扰了被访问网站的正常运营;
        • 爬虫抓取了受到法律保护的特定类型的数据或信息。
      • 那么作为爬虫开发者,如何在使用爬虫时避免进局子的厄运呢?
        • 严格遵守网站设置的robots协议;
        • 在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
        • 在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。
    • 反爬机制
      • robots协议:纯文本的协议。
        • User-Agent:请求载体的身份标识
        • 不遵从
    • 反反爬策略

    2.requests基本介绍

    • 作用:实现爬虫。模拟浏览器上网。

    • 编码流程:

      • 指定url
      • 发起请求
      • 获取响应数据
      • 持久化存储
    • 环境的安装:pip install reqeusts

    • 将搜狗首页的页面源码数据进行爬取

    In [4]:

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

    In [5]:

    #请求参数动态化
    wd = input('enter a key word:')
    params = {
        #url携带的请求参数
        'query':wd
    }
    url = 'https://www.sogou.com/web'
    #params参数:实现参数动态化
    response = requests.get(url=url,params=params)
    
    page_text = response.text
    
    fileName = wd+'.html'
    with open(fileName,'w',encoding='utf-8') as fp:
        fp.write(page_text)
    print(fileName,'下载成功!!!')
    enter a key word:jay
    jay.html 下载成功!!!
    
    • 上述程序出问题:
      • 出现了乱码
      • 数据量级不吻合

    In [6]:

    #处理乱码问题
    wd = input('enter a key word:')
    params = {
        #url携带的请求参数
        'query':wd
    }
    url = 'https://www.sogou.com/web'
    #params参数:实现参数动态化
    response = requests.get(url=url,params=params)
    #手动修改响应数据的编码格式
    response.encoding = 'utf-8'
    page_text = response.text
    
    fileName = wd+'.html'
    with open(fileName,'w',encoding='utf-8') as fp:
        fp.write(page_text)
    print(fileName,'下载成功!!!')
    enter a key word:波晓张
    波晓张.html 下载成功!!!
    
    • 解决乱码问题发现了问题的所在:
      • 我们发起的请求被搜狗识别成了一个异常的请求
        • 异常的请求:不是浏览器发送的请求都是异常请求
    • 反爬机制:UA检测
    • 反反爬策略:UA伪装

    In [8]:

    #UA检测
    wd = input('enter a key word:')
    params = {
        #url携带的请求参数
        'query':wd
    }
    headers = {
        #需要修改的请求头信息
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }
    url = 'https://www.sogou.com/web'
    #params参数:实现参数动态化
    response = requests.get(url=url,params=params,headers=headers)#UA伪装进行的请求发送
    #手动修改响应数据的编码格式
    response.encoding = 'utf-8'
    page_text = response.text
    
    fileName = wd+'.html'
    with open(fileName,'w',encoding='utf-8') as fp:
        fp.write(page_text)
    print(fileName,'下载成功!!!')
    enter a key word:tom
    tom.html 下载成功!!!
    
    • 需求:爬取豆瓣电影中爱情类型中的电影详情数据
      • 动态加载的数据:通过另一个请求单独请求到的数据
      • 如何检测爬取的数据是否为动态加载的数据?
        • 基于抓包工具进行局部搜索
          • 抓包工具捕获到所有的数据包,然后找到浏览器地址栏url对应的数据包,response这个选项卡中进行局部搜索(搜到,搜不到)。
            • 搜不到:数据为动态加载
              • 基于抓包工具进行全局搜索
            • 搜到:数据不是动态加载
              • 直接对浏览器地址栏的url发起请求获取数据即可

    In [6]:

    import requests
    #UA检测会被应用在绝大数的网站中
    headers = {
        #需要修改的请求头信息
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }
    params = {
        "type": "13",
        "interval_id": "100:90",
        "action": "",
        "start": "10",
        "limit": "200",
    }
    url = 'https://movie.douban.com/j/chart/top_list'
    response = requests.get(url=url,headers=headers,params=params)
    data_list = response.json()
    for dic in data_list:
        name = dic['title']
        score = dic['score']
        print(name,score)
    

    . . .

    In [9]:

    #捕获到了第一页对应的位置信息
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    city = input('enter a city name:')
    data = {
        "cname": '',
        "pid": '',
        "keyword": city,
        "pageIndex": "1",
        "pageSize": "10",
    }
    pos_list = requests.post(url=url,headers=headers,data=data).json()['Table1']#data参数是用来实现参数动态化
    for dic in pos_list:
        pos = dic['addressDetail']
        print(pos)
    enter a city name:北京
    小营东路3号北京凯基伦购物中心一层西侧
    朝阳路杨闸环岛西北京通苑30号楼一层南侧
    黄寺大街15号北京城乡黄寺商厦
    西四环北路117号北京欧尚超市F1、B1
    北京经济开发区西环北路18号F1+F2
    通顺路石园西区南侧北京顺义西单商场石园分店一层、二层部分
    北京站一层
    北京南站候车大厅B岛201号
    北京北清路1号146区
    海户屯北京新世纪服装商贸城一层南侧
    

    In [10]:

    #捕获所有页码对应的位置信息
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    city = input('enter a city name:')
    #全站数据的爬取
    for pageNum in range(1,9):
        data = {
            "cname": '',
            "pid": '',
            "keyword": city,
            "pageIndex": str(pageNum),
            "pageSize": "10",
        }
        pos_list = requests.post(url=url,headers=headers,data=data).json()['Table1']#data参数是用来实现参数动态化
        for dic in pos_list:
            pos = dic['addressDetail']
            print(pos)
    

    . . .

    • 需求:所有企业的企业详情数据

    • 分析:

      • 1.每一家企业对应的详情数据是动态加载出来的
      • 2.通过抓包工具进行了全局搜索,定位到了动态加载数据对应的数据包
        • 提取出url:每一家企业对应的url都一样
        • 请求方式:都一样
        • 请求参数:都为id但是参数值不同
          • id就是每一家企业的唯一标识
          • 如果可以将每一家企业的唯一标识id值捕获到,最终需求就可以完成
      • 对企业id值的捕获
        • 在首页中进行分析,使用抓包工具进行了企业名称的全局搜索,定位到的数据包的数据中就包含了企业名称和对应的id值

    In [11]:

    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    data = {
        'id':'3718324df7b94fb782f7e9bb5d185552'
    }
    requests.post(url=url,headers=headers,data=data).json()
    

    . . .

    In [16]:

    #捕获企业id
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    ids = []
    for pageNum in range(1,6):
        data = {
            "on": 'true',
            'page': str(pageNum),
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': '',
        }
        company_list = requests.post(url=url,headers=headers,data=data).json()['list']
        for dic in company_list:
            _id = dic['ID']
            ids.append(_id)
    
    
    

    . . .

    In [17]:

    #完整实现
    #1.捕获到所有企业的id
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    ids = []
    for pageNum in range(1,6):
        data = {
            "on": 'true',
            'page': str(pageNum),
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': '',
        }
        company_list = requests.post(url=url,headers=headers,data=data).json()['list']
        for dic in company_list:
            _id = dic['ID']
            ids.append(_id)
    
    #2.基于存储id的列表ids进行循环的请求发送
    detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    for _id in ids:
        data = {
            'id':_id
        }
        company_data = requests.post(url=detail_url,headers=headers,data=data).json()
        legalPerson = company_data['legalPerson']
        address = company_data['epsProductAddress']
        print(legalPerson,address)
    
    

    . . .

    python
  • 相关阅读:
    Work harder, smarter 工作需要努力和智慧
    且慢下手(转)
    .net 打包中的参数传递
    sql语句编写技巧
    在安装文件中解压sfx压缩文件
    vs.net编程技巧
    統制勘定(reconciliationaccounts)とは
    ExtJs页面布局总结(转载)
    ext自定义form表单参数为JSON格式getJsonValue:(同时提交多个表单时需要用到)
    oracle截取日期函数
  • 原文地址:https://www.cnblogs.com/bky20061005/p/12134574.html
Copyright © 2020-2023  润新知