爬虫02 /jupyter、爬虫概述、requests基本使用

1. jupyter的基本使用

  • 什么是anaconda

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

    • 是anaconda中的一个基于浏览器可视化的编码工具
  • 在指定目录下启动终端:录入jupyter notebook指令开启指定的服务。

  • cell的两种模式:cell必须要经过执行才可看到效果

    • MarkDown:编写笔记。兼容markdown的语法和html标签

    • Code:编写代码。

  • 快捷键

    • 插入cell:a,b

    • 删除cell:x

    • 执行cell:shift+enter

    • tab:自动补全

    • 切换cell的模式:y,m

    • 打开帮助文档:shift+tab

    • 在cell和输出结果间切换 : Esc + O

2. 爬虫概述

  • 什么是爬虫

    • 就是通过编写程序模拟浏览器上网,让其去互联网中抓取数据的过程。
  • 爬虫的分类:

    • 通用爬虫:爬取一整张页面源码数据。
    • 聚焦爬虫:爬取页面中局部的数据。一定是在通用爬虫的基础上实现。
      • 数据解析
    • 增量式爬虫:用来监测网站数据更新的情况。以便于爬取最新更新出来的数据!
  • 爬虫合法性探究:

    • 爬虫的风险体现:

      • 爬虫干扰了被访问网站的正常运营;
      • 爬虫抓取了受到法律保护的特定类型的数据或信息。
    • 如何规避风险:
      • 严格遵守网站设置的robots协议;
      • 在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
      • 在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。
  • 反爬机制

    • robots协议:存在于服务器端的一个纯文本的协议;域名后加/robots.txt即可查看该网站robots协议

      • User-Agent:就是请求载体的身份标识。
      • 特点:防君子不放小人
  • 反反爬策略

  • http的头信息

    • User-Agent
    • Connection:'close'/'keep-alive'
    • content-type

3. requests模块的基本使用

  • 基于网络请求的模块。

  • 环境的安装:pip install requests

  • 作用:模拟浏览器发起请求

  • 分析requests的编码流程:

    • 1.指定url
    • 2.发起了请求
    • 3.获取响应数据
    • 4.持久化存储
  • 参数动态化

    • 设置一个字典,键值就是请求携带的请求参数,需要作用到data/params
  • 动态加载数据

    • ajax,js
  • 需求:爬取搜狗首页的页面源码数据

    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)
  • 需求:简易的网页采集器

    url = 'https://www.sogou.com/web?query=人民币'
    response = requests.get(url)
    page_text = response.text
    with open('./人民币.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
    • 上述代码出现的问题:

      • 出现了乱码
      • 数据的量级不够
    • 处理乱码

      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)
    • 处理数据量级的问题:

      • 遇到了对应的反爬机制
      • 反爬机制:UA检测
      • 反反爬策略:UA伪装
      • UA伪装的实现:
        • 1.定义一个字典
        • 2.在字典中进行相关请求头信息的伪装
        • 3.将该字典作用到get方法的headers参数中即可
      • UA检测被作用到了大量的网站中,因此日后,爬虫程序编写中一定要直接加上UA的操作
      url = 'https://www.sogou.com/web?query=人民币'
      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'
      }
      response = requests.get(url,headers=headers) # UA伪装 # 修改响应数据的编码格式
      response.encoding = 'utf-8' page_text = response.text
      with open('./人民币.html','w',encoding='utf-8') as fp:
      fp.write(page_text)
    • 最终实现

      • 请求参数的动态化
      • 实现:
        • 1.定义一个字典
        • 2.字典中的键值就是url携带的参数
        • 3.将字典作用到get方法的params参数中
      url = 'https://www.sogou.com/web'
      
      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'
      } # 参数动态化
      wd = input('enter a key word:')
      param = {
      'query':wd
      }
      response = requests.get(url,headers=headers,params=param) # 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,'爬取成功!!!')
  • 需求:爬取豆瓣电影的详情数据

  • 分析:

    • 更多的电影数据是通过将滚轮滑动到底部后发起了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+'\n')
      print('第{}页数据爬取成功!'.format(i))
      fp.close()
  • 需求:肯德基餐厅查询http://www.kfc.com.cn/kfccda/storelist/index.aspx

  • 分析:

  • 动态加载数据

  • 动态加载数据

    • 概念:通过其他/另一个请求请求到的数据

    • 特性:可见非可得

    • 判定相关的页面数据是否为动态加载的数据?

      • 基于抓包工具定位到浏览器地址栏url对应的请求数据包,进行局部搜索:

        • 搜索到:这组被搜索的数据不是动态加载的,可以直接爬取
        • 没有搜到:这组数据是动态加载的,不可以直接爬取。
    • 如何捕获动态加载的数据?

      基于抓包工具进行全局搜索,最终可以定位到动态加载数据对应的数据包。

      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
  • 药监总局数据爬取,爬取的是每一家企业的详情数据

  • 分析:

    • 打开了某一家企业的详情页面,看到了企业的详情数据

    • 判定改家企业的详情数据是否为动态加载的?

      • 进行局部搜索

        • 没有搜索到,说明数据是动态加载出来的
      • 捕获动态加载的数据?
        • 全局搜索,定位到了动态加载数据对应的数据包,提取出了url和请求参数
    • 成功的捕获到了一家企业对应的详情数据

    • 通过上述方式继续分析第二家企业,发现:

    • 捕获每一家企业的id

      # 获取企业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'])

总结:

  1. 很多网站都会设置UA反爬,一般爬取数据的时候都要加上UA伪造
  2. requests模块post请求与get请求的区别:
    • 请求数据:post放在data的字典中,get放在params的字典中

爬虫01 /jupyter、爬虫概述、requests基本使用的更多相关文章

  1. Python爬虫-01:爬虫的概念及分类

    目录 # 1. 为什么要爬虫? 2. 什么是爬虫? 3. 爬虫如何抓取网页数据? # 4. Python爬虫的优势? 5. 学习路线 6. 爬虫的分类 6.1 通用爬虫: 6.2 聚焦爬虫: # 1. ...

  2. python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题

    python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述       通过编写程序'模拟浏览器'上网,然后通 ...

  3. 爬虫介绍+Jupyter Notebook

    什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫    1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆 ...

  4. Python爬虫实例(五) requests+flask构建自己的电影库

    目标任务:使用requests抓取电影网站信息和下载链接保存到数据库中,然后使用flask做数据展示. 爬取的网站在这里 最终效果如下: 主页: 可以进行搜索:输入水形物语 点击标题进入详情页: 爬虫 ...

  5. 小白学 Python 爬虫(18):Requests 进阶操作

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. python爬虫:爬虫的简单介绍及requests模块的简单使用

    python爬虫:爬虫的简单介绍及requests模块的简单使用 一点点的建议: (学习爬虫前建议先去了解一下前端的知识,不要求很熟悉,差不多入门即可学习爬虫,如果有不了解的,我也会补充个一些小知识. ...

  7. Python 开发轻量级爬虫01

    Python 开发轻量级爬虫 (imooc总结01--课程目标) 课程目标:掌握开发轻量级爬虫 为什么说是轻量级的呢?因为一个复杂的爬虫需要考虑的问题场景非常多,比如有些网页需要用户登录了以后才能够访 ...

  8. (Python爬虫01)-本想给随笔加个序号才发现这么不方便

    本想给随机加个序号,才发现还得去返回看看文章的序号.好在cnblog能断点自动保存. 作为一个小程序员,点赞的同时还在想,谁知道咋实现这种实时保存呢?有知道的给个参考文档呗.太感激了! 重点在这里 有 ...

  9. 爬虫学习(二)requests模块的使用

    一.requests的概述 requests模块是用于发送网络请求,返回响应数据.底层实现是urllib,而且简单易用,在python2.python3中通用,能够自动帮助我们解压(gzip压缩的等) ...

随机推荐

  1. OKR-Periods of Words【KMP最小前后缀】

    OKR-Periods of Words 传送门:链接    来源:UPC 8180 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得 ...

  2. Flask URL构建

    Flask URL构建 url_for()函数对于动态构建特定函数的URL非常有用.该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分. 以下脚本演示了如何使 ...

  3. Andrew Ng - 深度学习工程师 - Part 1. 神经网络和深度学习(Week 3. 浅层神经网络)

     =================第3周 浅层神经网络=============== ===3..1  神经网络概览=== ===3.2  神经网络表示=== ===3.3  计算神经网络的输出== ...

  4. WebBrowser禁用触摸缩放

    最近做一个WPF触屏的项目,引用到WebBrowser控件,由于是触屏的所以控件里的网页可以缩放,客户提出要求,屏蔽这缩放功能. 于是网上找了很多资料,也换过控件,WebView2 控件使用Micro ...

  5. 并发编程-CPU执行volatile原理探讨-可见性与原子性的深入理解

    volatile的定义 Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量.Jav ...

  6. vue 深度拷贝 除去空的参数

    // 去除数组里面为空的属性及子数组 export function deepCopy (source) { var result = [] //var result = {} for (var ke ...

  7. 弹性配置为构建提速 - CODING & 腾讯云 CVM 最佳实践

    CODING 中提供了内置云主机用来执行持续集成(CI)中的构建计划,能够胜任大部分构建任务.但如果碰上了大型项目的构建,或者需要在本地服务器生成构建成果,单个计算资源就显得有点捉急了.针对这一部分需 ...

  8. coderfoces#414 div.2

    第一次打cf 感觉很奇妙 开始看到题目感觉极其怪异 然后忽然发现第一题一堆数中的因数出现最多的不是2么 然后过了5分钟就被一个专门攻击的人hack掉了 不得不说题并不难甚至很水(都是几行的入门题) 但 ...

  9. 入门大数据---Hbase搭建

    环境介绍 tuge1 tuge2 tuge3 tuge4 NameNode NameNode DataNode DataNode ZooKeeper ZooKeeper ZooKeeper ZooKe ...

  10. openstack Rocky 社区版部署1.3 安装OpenStack packages

    1 installing the Rocky release on all nodes. yum install centos-release-openstack-rocky 安装之后,会在/etc/ ...