1.1 什么是爬虫?

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

1.2 爬虫分类?

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

1.3 爬虫合法性探究

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

1.4 反爬机制

- robots
- UA伪装
- 动态变化的请求参数
- 验证码
- cookie
- 代理
- 动态加载的数据
- js加密
- js混淆
- 图片懒加载

1.5 判断是否为动态加载数据?

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

  • 特性:可见非可得

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

    • 基于抓包工具定位到浏览器地址栏url对应的请求数据包,进行局部搜索:
    - 搜索到:这组被搜索的数据不是动态加载的,可以直接爬取
    - 没有搜到:这组数据是动态加载的,不可以直接爬取。
    
  • 如何捕获动态加载的数据?

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

二.requests模块基本使用

2.1 简单使用

  • 基于网络请求的模块

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

  • 分析requests的请求流程

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

    简单使用

    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)
    

2.2 乱码解决

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)

2.3 反爬机制(UA检测)+反反爬策略(UA伪装)

  • UA伪装的实现:
    • 定义一个字典
    • 在字典中进行相关请求头信息的伪装
    • 将字典应用的get方法的headers参数中即可
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)

2.4 get/post请求

  • get请求(三个参数:url、params、headers)
url = 'https://movie.douban.com/j/chart/top_list'
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'
}
param = {
    'type': '13',
    'interval_id': '100:90',
    'action': '',
    'start': str(i*20),
    'limit': '20',
}
response = requests.get(url=url,params=param,headers=headers)

  • post请求(三个参数:url、headers、data)
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

2.5 返回值

  • response.text、response.json,response.content
1.要获取页面中的所有数据:response.text
2.如果页面请求到的数据为json格式:response.json
3.如果爬取是图片(二进制),要用到response.content,用来返回二进制类型的响应数据

三. urllib模块基本使用

在这里,我们对图片(二进制)数据进行爬取来区别requests和urllib模块的区别

3.1 requests

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'
}
url = 'http://duanziwang.com/usr/uploads/2019/02/3334500855.jpg'
pic_data = requests.get(url=url,headers=headers).content #content返回的是二进制类型的响应数据
with open('1.jpg','wb') as fp:
    fp.write(pic_data)

3.2 urllib

import urllib
url = 'http://duanziwang.com/usr/uploads/2019/02/3334500855.jpg'
urllib.request.urlretrieve(url=url,filename='./2.jpg')

3.3 区别

1.urllib就是一个低版本的requests
2.requests可以进行UA伪装,urllib不行

抓包工具中response中显示的页面源码和开发者工具的Element选项卡显示的页面源码的区别是什么?

  • Element:显示的页面源码内容是当前网页加载完毕后对应的所有数据(包含动态加载的数据)
  • response:显示的内容仅仅是当前一个请求请求到的数据(不包含动态加载的数据)