Python网络请求模块
urllib
Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块
第一个模块 request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
第二个 error 模块即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。
比较古老,封装的相关基于爬虫的操作相对比较麻烦、繁琐、复杂的
requests出现逐渐代替了urllib
requests
定义
requests模块:Python中原生的一款基于网络请求的模块
特点
- 功能强大
- 简单便捷
- 效率高
作用
模拟浏览器发送请求
浏览器发送请求流程
- 指定URL
- 发起HTTP/HTTPS请求(get)
- 获取响应数据
requests发送请求流程
- 指定URL
- 发起HTTP/HTTPS请求(get/post)
- 获取响应数据
- 持久化存储
requests编码流程
安装环境
安装requests模块 pip install requests
pip install requests
实战编码
爬取搜狗首页的页面数据
请求搜狗首页,并且把html的源码写入sogo.html文件中
import requests
if __name__ == "__main__":
url = 'https://www.sogo.com/'
response = requests.get(url=url)
page_text = response.text
with open('./requests/sogo.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('over')
打开文件,没有相应的样式,我们只需要数据。
UA伪装
UA:user-agent(请求载体的身份标识)
UA检测/反爬机制:门户网站的浏览器会检测对应请求的载体身份标识,如果检测到载体的身份标识为某一款浏览器,则说明此次请求为一次正常的请求(服务器端不会拒绝正常请求。反之,则认为该请求为不正常的请求(爬虫),服务器很有可能拒绝请求。(反爬机制)
正常请求的user-agent:
UA伪装/反反爬机制:将爬虫对应请求的载体身份标识为某一款浏览器(不进行伪装可能得不到数据或乱码数据)
UA伪装获取搜狗搜索数据
import requests
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
url = 'https://www.sogou.com/web'
kw = input('enter a keyword:')
param = {
'query': kw
}
response = requests.get(url=url, params=param, headers=headers)
page_text = response.text
with open('./requests/sogo.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('over')
百度翻译
UI输入关键词后,进行ajax请求,响应json数据
json数据
{
"errno":0,"data":[{
"k":"dog","v":"n. \u72d7; \u8e69\u811a\u8d27; \u4e11\u5973\u4eba; \u5351\u9119\u5c0f\u4eba v. \u56f0\u6270; \u8ddf\u8e2a"},{
"k":"DOG","v":"abbr. Data Output Gate \u6570\u636e\u8f93\u51fa\u95e8"},{
"k":"doge","v":"n. \u5171\u548c\u56fd\u603b\u7763"},{
"k":"dogm","v":"abbr. dogmatic \u6559\u6761\u7684; \u72ec\u65ad\u7684; dogmatism \u6559\u6761\u4e3b\u4e49; dogmatist"},{
"k":"Dogo","v":"[\u5730\u540d] [\u9a6c\u91cc\u3001\u5c3c\u65e5\u5c14\u3001\u4e4d\u5f97] \u591a\u6208; [\u5730\u540d] [\u97e9\u56fd] \u9053\u9ad8"}]}
Python获取结果百度翻译结果,使用json() 获取的是对象,text() 获取的是字符串
import requests
import json
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
kw = input('enter a kewword:')
data = {
'kw': kw}
url = 'https://fanyi.baidu.com/sug'
response = requests.post(url=url, data=data, headers=headers)
json_data = response.json()
print(json_data)
fp = open('../' + kw + '.json', 'w', encoding='utf-8')
json.dump(json_data, fp=fp, ensure_ascii=False)
print('over')
持久化存储值json文件:
豆瓣电影
import requests
import json
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
params = {
'type': '24', # 电影类型 24--喜剧
'interval_id': '100: 90',
'action': '',
'start': '0', # 从第几部开始取
'limit': '20'} # 每次多少部
url = 'https://movie.douban.com/j/chart/top_list'
response = requests.get(url=url, params=params, headers=headers)
json_data = response.json()
print(json_data)
fp = open('./requests/douban.json', 'w', encoding='utf-8')
json.dump(json_data, fp=fp, ensure_ascii=False)
print('over')
爬取肯德基餐厅信息
import requests
import json
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 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, data=data, headers=headers)
text_data = response.text
print(text_data)
fp = open('./requests/kendeji.json', 'w', encoding