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
原文地址:https://www.cnblogs.com/bky20061005/p/12134574.html