02 requests模块
requests模块初始
引入
- 在python实现的网络爬虫中,用于网络请求发送的模块有两种,第一种为urllib模块,第二种为requests模块。urllib模块是一种比较古老的模块,在使用的过程中较为繁琐和不便。当requests模块出现后,就快速的代替了urllib模块,因此,在我们课程中,推荐大家使用requests模块。
- Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
what is requests
- requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
为什么要使用requests模块
- 在使用urllib模块的时候,会有诸多不便之处,总结如下:
- 手动处理url编码
- 手动处理post请求参数
- 处理cookie和代理操作繁琐
- ……
- 使用requests模块:
- 自动处理url编码
- 自动处理post请求参数
- 简化cookie和代理操作
- ……
如何使用requests模块
- 环境安装
- 使用流程/编码流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据值
- 持久化存储
第一个爬虫程序
| |
| import requests |
| |
| url = 'https://www.sogou.com/' |
| |
| response = requests.get(url=url) |
| |
| page_text = response.text |
| |
| with open('./sogou.html','w',encoding='utf-8') as fp: |
| fp.write(page_text) |
| print('爬取数据完毕!!!') |
基于requests模块经典案例实战
通过5个基于requests模块的爬虫项目对该模块进行学习和巩固
- 基于requests模块的get请求
- 需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
- 反爬机制
- User-Agent:请求载体的身份标识,使用浏览器发起的请求,请求载体的身份标识为浏览器,使用爬虫程序发起的请求,请求载体为爬虫程序。
- UA检测:相关的门户网站通过检测请求该网站的载体身份来辨别该请求是否为爬虫程序,如果是,则网站数据请求失败。因为正常用户对网站发起的请求的载体一定是基于某一款浏览器,如果网站检测到某一请求载体身份标识不是基于浏览器的,则让其请求失败。因此,UA检测是我们整个课程中遇到的第二种反爬机制,第一种是robots协议。
- UA伪装:通过修改/伪装爬虫请求的User-Agent来破解UA检测这种反爬机制,具体实现见下属代码:
| import requests |
| |
| word = input('enter a word you want to search:') |
| |
| headers={ |
| 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', |
| } |
| |
| url = 'https://www.sogou.com/web' |
| |
| param = { |
| 'query':word, |
| } |
| |
| response = requests.get(url=url,params=param,headers=headers) |
| |
| page_text = response.text |
| |
| fileName = word+'.html' |
| with open(fileName,'w',encoding='utf-8') as fp: |
| fp.write(page_text) |
| import requests |
| import json |
| word = input('enter a English word:') |
| |
| headers={ |
| 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', |
| } |
| |
| url = 'https://fanyi.baidu.com/sug' |
| |
| data = { |
| 'kw':word, |
| } |
| |
| response = requests.post(url=url,data=data,headers=headers) |
| |
| json_data = response.json() |
| |
| fileName = word+'.json' |
| fp = open(fileName,'w',encoding='utf-8') |
| json.dump(json_data,fp,ensure_ascii=False) |
| import requests |
| if __name__ == "__main__": |
| #指定ajax-get请求的url(通过抓包进行获取) |
| url = 'https://movie.douban.com/j/chart/top_list?' |
| #定制请求头信息,相关的头信息必须封装在字典结构中 |
| headers = { |
| #定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数 |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', |
| } |
| #定制get请求携带的参数(从抓包工具中获取) |
| param = { |
| 'type':'5', |
| 'interval_id':'100:90', |
| 'action':'', |
| 'start':'0', |
| 'limit':'20' |
| } |
| #发起get请求,获取响应对象 |
| response = requests.get(url=url,headers=headers,params=param) |
| #获取响应内容 |
| print(response.json()) |
- 基于requests模块ajax的post请求
- 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
| import requests |
| if __name__ == "__main__": |
| |
| url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' |
| |
| headers = { |
| |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', |
| } |
| |
| data = { |
| 'cname':'', |
| 'pid':'', |
| 'keyword':'北京', |
| 'pageIndex': '1', |
| 'pageSize': '10' |
| } |
| |
| response = requests.get(url=url,headers=headers,data=data) |
| |
| print(response.json()) |
- 综合练习
- 需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据http://125.35.6.84:81/xk/
| import requests |
| from fake_useragent import UserAgent |
| ua = UserAgent(use_cache_server=False,verify_ssl=False).random |
| headers = { |
| 'User-Agent':ua |
| } |
| url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' |
| pageNum = 3 |
| for page in range(3,5): |
| data = { |
| 'on': 'true', |
| 'page': str(page), |
| 'pageSize': '15', |
| 'productName':'', |
| 'conditionType': '1', |
| 'applyname':'', |
| 'applysn':'' |
| } |
| json_text = requests.post(url=url,data=data,headers=headers).json() |
| all_id_list = [] |
| for dict in json_text['list']: |
| id = dict['ID'] |
| |
| |
| |
| |
| |
| |
| all_id_list.append(id) |
| |
| post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' |
| for id in all_id_list: |
| post_data = { |
| 'id':id |
| } |
| response = requests.post(url=post_url,data=post_data,headers=headers) |
| if response.headers['Content-Type'] == 'application/json;charset=UTF-8': |
| |
| |
| json_text = response.json() |
| print(json_text['businessPerson']) |
作业
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)