zoukankan      html  css  js  c++  java
  • 爬虫 1、用Anaconda的 jupyter notebook 写爬虫

    - Anaconda是一个集成环境(基于机器学习和数据分析的开发环境)
    - 基于浏览器的一种可视化开发工具:jupyter notebook
    - 可以在指定目录的终端中录入jupyter notebook指令,然后启动服务。
    - cell是分为不同模式的:
    - Code:编写python代码
    - markDown:编写笔记
    - 快捷键:
    - 添加cell:a,b
    - 删除cell:x
    - 执行:shift+enter
    - tab:
    - 切换cell的模式:
        - m   ==>markdowm模式
        - y   ==》代码模式
    - 打开帮助文档:shift+tab

     

     

    环境变量配置

     

     在某个文件夹下shift+右键  打开powershell  输入jupyter notebook打开 web ,即当前目录是web 的根目录

      • 规避风险:

        • 严格遵守网站设置的robots协议;

        • 在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;

        • 在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。

    • robots协议:文本协议

      • www.xx.com/robots.txt  查看
      • 特性:防君子不防小人的文本协议

    二、requtest 

    • 什么是requests模块?
      • Python中封装好的一个基于网络请求的模块。
    • requests模块的作用?
      • 用来模拟浏览器发请求
    • requests模块的环境安装:
      • pip install requests
    • requests模块的编码流程:
      • 1.指定url
      • 2.发起请求
      • 3.获取响应数据
      • 4.持久化存储
    import requests
    #1.指定url
    url = 'https://www.sogou.com/'
    #2.请求发送get:get返回值是一个响应对象
    response = requests.get(url=url)
    #3.获取响应数据
    page_text = response.text #返回的是字符串形式的响应数据
    #4.持久化存储
    with open('sogou.html','w',encoding='utf-8') as fp:
        fp.write(page_text)
    #爬取搜狗首页的页面源码数据
    #需要让url携带的参数动态化
    url = 'https://www.sogou.com/web'
    #实现参数动态化
    wd = input('enter a key:')
    params = {
        'query':wd
    }
    #在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
    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)
    #实现一个简易的网页采集器

    - 上述代码执行后发现:
    - 1.出现了乱码
    - 2.数据量级不对

    url = 'https://www.sogou.com/web'
    #实现参数动态化
    wd = input('enter a key:')
    params = {
        'query':wd
    }
    #在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
    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)
    #解决乱码
    • UA检测:门户网站通过检测请求载体的身份标识判定改请求是否为爬虫发起的请求
    • UA伪装:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
    • user-agent
    url = 'https://www.sogou.com/web'
    #实现参数动态化
    wd = input('enter a key:')
    params = {
        'query':wd
    }
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
    }
    #在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
    response = requests.get(url=url,params=params,headers=headers)
    response.encoding = 'utf-8' #修改响应数据的编码格式
    page_text = response.text
    fileName = wd+'.html'
    with open(fileName,'w',encoding='utf-8') as fp:
        fp.write(page_text)
    #解决UA检测

    三 ajax

    #爬取的是豆瓣电影中电影的详情数据

      https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=
        #分析:

        当滚动条被滑动到页面底部的时候,当前页面发生了局部刷新(ajax的请求)

    动态加载的页面数据

    • 是通过另一个单独的请求请求到的数据
    url = 'https://movie.douban.com/j/chart/top_list'
    start = input('您想从第几部电影开始获取:')
    limit = input('您想获取多少电影数据:')
    
    # url 中的参数
    dic = {
        'type': '13',
        'interval_id': '100:90',
        'action': '',
        'start': start,
        'limit': limit,
    }
    response = requests.get(url=url,params=dic,headers=headers)
    page_text = response.json() #json()返回的是序列化好的实例对象
    for dic in page_text:
        print(dic['title']+':'+dic['score'])
    View Code
    #肯德基餐厅查询http://www.kfc.com.cn/kfccda/storelist/index.aspx
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    for page in range(1,5):
        data = {
            'cname': '',
            'pid': '',
            'keyword': '西安',
            'pageIndex': str(page),
            'pageSize': '10',
        }
        response = requests.post(url=url,headers=headers,data=data)
        print(response.json())
    #肯德基餐厅查询

    如何检测页面中是否存在动态加载的数据?

    • 基于抓包工具实现
      • 先捕获网站请求后所有的数据包
      • 在数据包中定位到地址栏所对应请求的数据包,在response选项卡对应的数据中进行局部搜索(页面中的某一组内容)
        • 可以搜索到:爬取的数据不是动态加载的
        • 没有搜索到:爬取的数据是动态加载的
      • 如何定位动态加载的数据在哪个数据包中呢?
        • 进行全局搜索
  • 相关阅读:
    Manacher算法(一个字符串中找到最长回文子串)
    tomcat之负载均衡(apache反响代理tomcat)
    【转】Tomcat集群Cluster实现原理剖析
    负载均衡集群之LVS持久链接
    负载均衡集群之LVS的DR模型详解(Diretor Routing)
    负载均衡集群之LVS算法和模型
    负载均衡集群之LVS配置命令
    mysql之6备份恢复
    mysql之主从复制
    haproxy之配置文件解析
  • 原文地址:https://www.cnblogs.com/zhuangdd/p/13648140.html
Copyright © 2011-2022 走看看