爬虫入门一(爬虫概述和requests模块的使用)

1、爬虫概述

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


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


- 爬虫合法性探究:
	- 爬虫的风险体现:
		- 爬虫干扰了被访问网站的正常运营;
		- 爬虫抓取了受到法律保护的特定类型的数据或信息。
	- 如何规避风险:
		- 严格遵守网站设置的robots协议;
		- 在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
		- 在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。
		
		
- 反爬机制
	- robots协议:存在于服务器端的一个纯文本的协议。
		- User-Agent:就是请求载体的身份标识。
		- 特点:防君子不放小人
- 反反爬策略

- http的头信息
    - User-Agent
    - Connection:‘close’
    - content-type

2、requests模块的基本使用

1、简介

- 基于网络请求的模块。

- 环境的安装:pip install requests

- 作用:模拟浏览器发起请求
- 分析requests的编码流程:
	- 1.指定url
	- 2.发起了请求
	- 3.获取响应数据
	- 4.持久化存储

2、示例

爬取搜狗首页的页面源码数据

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,'爬取成功!!!')

enter a key word:波晓张
波晓张.html 爬取成功!!!

爬取豆瓣电影的详情数据

分析

更多的电影数据是通过将滚轮滑动到底部后发起了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()
第0页数据爬取成功!
第1页数据爬取成功!
第2页数据爬取成功!
第3页数据爬取成功!
第4页数据爬取成功!
第5页数据爬取成功!
第6页数据爬取成功!
第7页数据爬取成功!
第8页数据爬取成功!
第9页数据爬取成功!

肯德基餐厅查询

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
亳州嘉禾药业有限公司 安徽省亳州市谯城区三官工业街168号
倍斯柔(广东)生物科技有限公司 佛山市三水区乐平镇西乐大道东39号登骏数码城二期厂房B3号301A、401A、501A单元(住所申报)
佛山市方方洁生物科技有限公司 广东省佛山市南海区丹灶镇塱心工业区吴伟升厂房自编A座1楼、2楼(住所申报)
青岛尚合生物科技有限公司 山东省青岛市莱西市夏格庄文昌路8号
山东暨肽生物医药科技有限公司 山东省烟台市福山区振华街879号
淳安千岛湖诚达实业有限公司 浙江省杭州市淳安县千岛湖镇永和路321号1幢2楼
浙江好妆化妆品有限公司 浙江省金华市义乌市廿三里街道安商路37号
美尚美生物技术(广州)有限公司 广州市花都区花山镇启源大道6号4栋304房
广州市联盈日用化妆品有限公司 广州市花都区赤坭镇白坭经济社内
浙江绿岛科技有限公司 海润街道工业大道5号
广州市三荣化妆品有限公司 广州市白云区江高镇塘荔路3号A1栋、B栋
广州市欣俊颜化妆品有限公司 广州市白云区白云湖街夏茅向西大道十九社工业区自编一号五楼
广州甲美生物科技有限公司 广州市白云区均禾街石马村旺发大街自编25号
广州卡丝蓝化妆品有限公司 广州市白云区江高镇神山雄郭西路128号3栋101房、201房
广州市绿色春天化妆品科技研发有限公司 广州市白云区均禾街罗岗工业区企业路23号

药监总局数据爬取,爬取的是每一家企业的详情数据

- 分析:
    - 打开了某一家企业的详情页面,看到了企业的详情数据
    - 判定改家企业的详情数据是否为动态加载的?
        - 进行局部搜索
            - 没有搜索到,说明数据是动态加载出来的
        - 捕获动态加载的数据?
            - 全局搜索,定位到了动态加载数据对应的数据包,提取出了url和请求参数
    - 成功的捕获到了一家企业对应的详情数据
    - 通过上述方式继续分析第二家企业,发现:
        - 每一家企业对应动态加载数据的url都一样:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById,只要请求参数id的值不一样!说明id值标识的就是每一家企业的唯一标识。
        
    - 捕获每一家企业的id
        - 在首页中,通过抓包工具对企业名称进行搜索,对应的数据包中发现了企业名称和id
            - url:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList
            
#获取企业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'])
posted @ 2019-12-06 22:01  __张达达  Views(761)  Comments(0Edit  收藏  举报