1. requests 模块简介
什么是requests 模块
requests模块是python中原生的基于网络请求的模块,功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。requests模块作用:模拟浏览器发请求。
为什么要使用requests 模块
因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
- 手动处理url编码
- 手动处理post请求参数
- 处理cookie和代理操作繁琐
- ......
而使用requests模块的优势:
- 自动处理url编码
- 自动处理post请求参数
- 简化cookie和代理操作
- ......
如何使用requests模块
安装: pip install requests
使用流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据值
- 持久化存储
requests 模块的各种请求方式
最常用的请求方式就是 post 和 get 请求。params 在 get 请求中使用,data、json在post请求中使用。
1 response = requests.get(url, params={‘key‘:‘value‘}) 2 response = requests.post(url, data={‘key‘:‘value‘})
1 #返回的是Unicode型的数据;取html源码; 2 response.text 3 4 # 返回的是bytes型也就是二进制的数据。取图片,文件; 5 resppnse.content 6 7 # 返回的是json格式数据 8 resppnse.json()
User-Agent *****
通过自定义请求对象,用于伪装爬虫程序请求的身份。
User-Agent参数,简称为UA,该参数的作用是用于表明本次请求载体的身份标识。如果我们通过浏览器发起的请求,则该请求的载体为当前浏览器,则UA参数的值表明的是当前浏览器的身份标识表示的一串数据。如果我们使用爬虫程序发起的一个请求,则该请求的载体为爬虫程序,那么该请求的UA为爬虫程序的身份标识表示的一串数据。有些网站会通过辨别请求的UA来判别该请求的载体是否为爬虫程序,如果为爬虫程序,则不会给该请求返回响应,那么我们的爬虫程序则也无法通过请求爬取到该网站中的数据值,这也是反爬虫的一种初级技术手段。为了防止该问题的出现,则我们可以给爬虫程序的UA进行伪装,伪装成某款浏览器的身份标识。
1 import requests 2 url = ‘http://www.baidu.com/‘ 3 headers={ 4 ‘User-Agent‘ : ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36‘ 5 } 6 request =request.get(url=url,headers=headers)
2. requests 模块使用实例
2.1 基于requests模块的get请求
示例:爬取搜狗指定词条搜索后的页面数据 (网页采集器, 动态获取)
1 import requests 2 word = input(‘please enter a word:‘) 3 url = ‘https://www.sogou.com/web‘ 4 5 headers = { 6 ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36‘ 7 } 8 9 param = { 10 ‘query‘:word 11 } 12 13 response = requests.get(url=url,params=param) 14 page_text = response.text 15 16 fileName = word+‘.html‘ 17 with open(fileName,‘w‘,encoding=‘utf-8‘) as fp: 18 fp.write(page_text) 19 20 print(fileName,‘爬取成功!‘)
2. 2 基于requests模块的post请求
示例:登录豆瓣电影,爬取登录成功后的页面数据
1 import requests 2 import os 3 4 url = ‘https://accounts.douban.com/login‘ 5 6 # 请求携带参数 7 data = { 8 "source": "movie", 9 "redir": "https://movie.douban.com/", 10 "form_email": "131xxxxxxxxx", 11 "form_password": "88888888", 12 "login": "登录", 13 } 14 15 #自定义请求头信息 16 headers={ 17 ‘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‘, 18 } 19 page_text = requests.post(url=url,data=data).text 20 with open(‘./douban111.html‘,‘w‘,encoding=‘utf-8‘) as fp: 21 fp.write(page_text)
2.3 基于requests模块ajax的get请求
示例:爬取豆瓣电影分类排行榜中的电影详情数据
1 import requests 2 3 headers = { 4 ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘ 5 } 6 7 url = ‘https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20‘ 8 9 movie_list = requests.get(url=url,headers=headers).json() 10 11 all_names = [] 12 for dic in movie_list: 13 name = dic[‘title‘] 14 all_names.append(name)
2.4 基于requests模块ajax的post请求
示例:破解百度翻译(post请求)
1 import requests 2 3 url = ‘https://fanyi.baidu.com/sug‘ 4 wd = input(‘enter something of English:‘) 5 data = { 6 ‘kw‘:wd 7 } 8 9 headers = { 10 ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘ 11 } 12 13 #发起一个post请求 14 res =requests.post(url=url,data=data,headers=headers).json()
综合练习:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
1 import requests 2 3 headers = { 4 ‘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‘, 5 6 url = ‘http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList‘ 7 8 9 for page in range(1,5): 10 data = { 11 ‘on‘: ‘true‘, 12 ‘page‘: str(page), 13 ‘pageSize‘: ‘15‘, 14 ‘productName‘:‘‘, 15 ‘conditionType‘: ‘1‘, 16 ‘applyname‘:‘‘, 17 ‘applysn‘:‘‘ 18 } 19 20 json_text = requests.post(url=url,data=data,headers=headers).json() 21 all_id_list = [] 22 for dict in json_text[‘list‘]: 23 id = dict[‘ID‘] #用于二级页面数据获取 24 all_id_list.append(id) 25 26 #该url是一个ajax的post请求 27 post_url = ‘http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById‘ 28 for id in all_id_list: 29 post_data = { 30 ‘id‘: id 31 } 32 response = requests.post(url=post_url, data=post_data, headers=headers) 33 34 if response.headers[‘Content-Type‘] == ‘application/json;charset=UTF-8‘: 35 # print(response.json()) 36 # 进行json解析 37 json_text = response.json() 38 print(json_text[‘businessPerson‘])
查看是不是动态加载页面,就在开发者工具中的response中搜索。不能搜到就证明是动态加载出来的。