基于网络请求的模块.
环境的安装: pip install requests
作用: 模拟浏览器发起请求
分析 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)
需求: 简易的网页采集器
- 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 检测
- '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'
- # 代理用户信息, 这个数据时浏览器的信息, 是请求数据的头部信息,
反反爬策略: 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
- {'Table': [{'rowcount': 27}],
- 'Table1': [{'addressDetail': '广州路 104 号',
- 'cityName': '南京市',
- 'pro': '24 小时, Wi-Fi, 点唱机, 店内参观, 礼品卡, 生日餐会',
- 'provinceName': '江苏省',
- 'rownum': 1,
- 'storeName': '广州'},
- {'addressDetail': '天河路 123 号广州购书中心负一层',
- 'cityName': '广州市',
- 'pro': '24 小时, Wi-Fi, 点唱机, 礼品卡',
- 'provinceName': '广东省',
- 'rownum': 2,
- 'storeName': '购书中心'},
- {'addressDetail': '广州南站三楼 B 区餐饮夹层(B26-B27 检票口上方)',
- 'cityName': '广州市',
- 'pro': '礼品卡',
- 'provinceName': '广东省',
- 'rownum': 3,
- 'storeName': '南站二'},
- {'addressDetail': '小谷围广州大学城广州大学生活区商业中心首层 A1028 及二层 A2009',
- 'cityName': '广州市',
- 'pro': '24 小时, Wi-Fi, 点唱机, 店内参观, 礼品卡',
- 'provinceName': '广东省',
- 'rownum': 4,
- 'storeName': '大学城'},
- ]}
药监总局数据爬取, 爬取的是每一家企业的详情数据
分析:
打开了某一家企业的详情页面, 看到了企业的详情数据
判定改家企业的详情数据是否为动态加载的?
进行局部搜索
没有搜索到, 说明数据是动态加载出来的
捕获动态加载的数据?
全局搜索, 定位到了动态加载数据对应的数据包, 提取出了 url 和请求参数
成功的捕获到了一家企业对应的详情数据
通过上述方式继续分析第二家企业, 发现:
每一家企业对应动态加载数据的 url 都一样: http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById, 只要请求参数 id 的值不一样! 说明 id 值标识的就是每一家企业的唯一标识.
捕获每一家企业的 id
在首页中, 通过抓包工具对企业名称进行搜索, 对应的数据包中发现了企业名称和 id
- url:
- # 获取企业 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'])
亳州嘉禾药业有限公司 安徽省亳州市谯城区三官工业街 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 号
来源: http://www.bubuko.com/infodetail-3313451.html