day01-requests库 一

  • http:
    • 概念:clinet和Server进行数据交互的某种形式
  • 常用的头信息:
    • User-Agent:请求载体的身份标识
    • Connection:close
    • content-type:
  • https:
    • 概念:安全的http协议
    • 证书
      • 对称秘钥加密
      • 非对称秘钥加密
      • 证书秘钥加密方式

爬虫相关概述

  • 爬虫概念:

    • 通过编写程序模拟浏览器上网,然后让其去互联网上爬取/抓取数据的过程
      • 模拟:浏览器就是一款纯天然的原始的爬虫工具
  • 爬虫分类:

    • 通用爬虫:爬取一整张页面中的数据. 抓取系统(爬虫程序)
    • 聚焦爬虫:爬取页面中局部的数据.一定是建立在通用爬虫的基础之上
    • 增量式爬虫:用来监测网站数据更新的情况.以便爬取到网站最新更新出来的数据
  • 风险分析

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

  • 反反爬策略

  • robots.txt协议:文本协议,在文本中指定了可爬和不可爬的数据说明.

Requests的基本使用

  • 需求文档

    • 项目背景介绍
    • 分工
    • 功能模块的介绍
    • 业务逻辑
  • 数据量级: >= 10000

  • 设计业务逻辑(数据分析+机器学习)

  • 数据分类:

    • 电商
    • 新闻资讯
    • 房产,招聘
    • 医疗
  • requests模块

    • 概念:一个机遇网络请求的模块.作用就是用来模拟浏览器发起请求.
    • 编码流程:
      • 指定url
      • 进行请求的发送
      • 获取响应数据(爬取到的数据)
      • 持久化存储
  • 环境的安装:

    • pip install requests
  • 爬取搜狗首页对应的页面源码数据

import requests
#step_1
url = 'https://www.sogou.com'
#step_2:返回值是一个响应对象
response = requests.get(url=url)
#step_3:text返回的是字符串形式的响应数据
page_text = response.text
#step_4
with open('./sogou.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
  • 基于搜狗编写一个简易的网页采集器
wd = input('enter a key:')
url = 'https://www.sogou.com/web'
#存储的就是动态的请求参数
params = {
    'query':wd
}
#一定需要将params作用到请求中
#params参数表示的是对请求url参数的封装
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(wd,'下载成功!')
enter a key:周杰伦
周杰伦 下载成功!
  • 上述程序出现了问题
    • 问题1:爬取到的数据出现了乱码
    • 问题2:遇到了UA检测这种反爬机制
#解决中文乱码
wd = input('enter a key:')
url = 'https://www.sogou.com/web'
#存储的就是动态的请求参数
params = {
    'query':wd
}
#一定需要将params作用到请求中
#params参数表示的是对请求url参数的封装
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(wd,'下载成功!')
enter a key:周杰伦
周杰伦 下载成功!
  • 反爬机制:UA检测
  • 反反爬机制:UA伪装
#解决中文乱码&UA伪装
wd = input('enter a key:')
url = 'https://www.sogou.com/web'
#存储的就是动态的请求参数
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.100 Safari/537.36'
}

#一定需要将params作用到请求中
#params参数表示的是对请求url参数的封装
#headers参数是用来实现UA伪装
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)
print(wd,'下载成功!')
enter a key:波晓张
波晓张 下载成功!
  • 爬取豆瓣电影的电影详情数据
    • 分析:当滚轮滑动到底部的时候,发起了一个ajax的请求,且该请求请求到了一组电影数据
  • 动态加载的数据:就是通过另一个额外的请求请求到的数据
    • ajax生成动态加载的数据
    • js生成动态加载的数据
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
url = 'https://movie.douban.com/j/chart/top_list'
start = input('enter a start:')
limit = input('enter a limit')
#处理请求参数
params = {
    'type': '5',
    'interval_id': '100:90',
    'action': '',
    'start': start,
    'limit': limit,
}

response = requests.get(url=url,params=params,headers=headers)
#json返回的是序列化好的对象
data_list = response.json()

fp = open('douban.txt','w',encoding='utf-8')

for dic in data_list:
    name = dic['title']
    score = dic['score']
    
    fp.write(name+':'+score+'\n')
    print(name,'爬取成功')
 
fp.close()
enter a start:1
enter a limit10
指环王3:王者无敌 爬取成功
七武士 爬取成功
蝙蝠侠:黑暗骑士 爬取成功
搏击俱乐部 爬取成功
指环王1:魔戒再现 爬取成功
指环王2:双塔奇兵 爬取成功
攻壳机动队 爬取成功
将军号 爬取成功
V字仇杀队 爬取成功
黑客帝国 爬取成功
  • 爬取肯德基餐厅位置信息http://www.kfc.com.cn/kfccda/storelist/index.aspx
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city = input('enter a city name:')
data = {
    'cname': '',
    'pid': '',
    'keyword': city,
    'pageIndex': '3',
    'pageSize': '2',
}
#data参数表示的就是get方法中的params
response = requests.post(url=post_url,data=data,headers=headers)

response.json()
enter a city name:北京
{'Table': [{'rowcount': 73}],
 'Table1': [{'addressDetail': '北京经济开发区西环北路18号F1+F2',
   'cityName': '北京市',
   'pro': '24小时,Wi-Fi,店内参观,礼品卡,生日餐会',
   'provinceName': '北京市',
   'rownum': 5,
   'storeName': '亦庄'},
  {'addressDetail': '通顺路石园西区南侧北京顺义西单商场石园分店一层、二层部分',
   'cityName': '北京市',
   'pro': '24小时,Wi-Fi,店内参观,礼品卡',
   'provinceName': '北京市',
   'rownum': 6,
   'storeName': '石园南大街'}]}

思考:如何判定一张页面中是否存在动态加载的数据

  • 抓包工具进行局部搜索

  • 如果判定出页面中有动态加载的数据如何进行数据的定位?

    • 使用抓包工具进行全局搜索
  • 对一个陌生的网站数据进行爬取前一定要判定你爬取的数据是否为动态加载的!!!

  • 爬取企业详情信息:http://125.35.6.84:81/xk/

  • 分析:

    • 1.网站的首页和企业的详情页的数据都是动态加载出来的
    • 2.分析某一家企业的企业详情数据是怎么来的?
      • 企业详情数据时通过一个ajax请求(post)请求到的.
      • 请求对应的url:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
      • 该请求携带了一个参数:id:xxdxxxx
      • 结论:
        • 1.每家企业详情页的数据都是通过一个post形式的ajax请求请求到的
        • 2.每家企业对应的ajax请求的url都一样,请求方式都是post,只有请求参数id的值不一样.
        • 3.只需要获取每一家企业对应的id值即可获取每一家企业对应的详情数据
    • 需要获取每一家企业的id值
      • 思路:每一家企业的id值应该存储在首页对应的相关请求或者响应中.
      • 结论:每一家企业的id值是存储在首页中的某一个ajax请求对应的响应数据中,只需要将该响应数据中企业的id提取/解析出来后即可.
#要请求到没一家企业对应的id
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
data = {
    'on': 'true',
    'page': '1',
    'pageSize': '15',
    'productName': '',
    'conditionType': '1',
    'applyname': '',
    'applysn': '',
}

fp = open('./company_detail.txt','w',encoding='utf-8')

#该json()的返回值中就有每一家企业的id
data_dic = requests.post(url=url,data=data,headers=headers).json()
#解析id
for dic in data_dic['list']:
    _id = dic['ID']
#     print(_id)
    #对每一个id对应的企业详情数据进行捕获(发起请求)
    post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    post_data = {
        'id':_id
    }
    #json的返回值是某一家企业的详情信息
    detail_dic = requests.post(url=post_url,data=post_data,headers=headers).json()
    company_title = detail_dic['epsName']
    address = detail_dic['epsProductAddress']
    
    fp.write(company_title+':'+address+'\n')
    print(company_title,'爬取成功!!!')
fp.close()
    
江苏正东生物科技有限公司 爬取成功!!!
通化昌源医药科技有限公司 爬取成功!!!
启励(广州)生物科技有限公司 爬取成功!!!
广州真事美化妆品制造有限公司 爬取成功!!!
广州市暨鼎生物科技有限公司 爬取成功!!!
西安尹千容生物科技有限责任公司 爬取成功!!!
施洛丹(福建)工贸有限公司 爬取成功!!!
莱芜瑶草生物科技有限公司 爬取成功!!!
辽宁婵泉生物药业有限公司 爬取成功!!!
辽宁东宁药业有限公司 爬取成功!!!
广州二天堂制药有限公司 爬取成功!!!
赫莲娜(广州)生物科技有限公司 爬取成功!!!
广州腾信生物科技有限公司 爬取成功!!!
广州娜艾施化妆品有限公司 爬取成功!!!
广州汉方医学生物科技有限公司 爬取成功!!!
  • 什么是抓包工具
    • 代理服务器
      • 作用:进行请求转发的
posted @ 2020-07-29 00:31  老宝  阅读(58)  评论(0)    收藏  举报