一含义:
requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发请求。
二如何使用:(requests模块的编码流程)
1.指定url
-----UA伪装
-----请求参数的处理
2.请求参数的处理
3.发请求
4.获取响应数据,json()返回的是obj
5,持久化存储
#输入参数可以找headers旁边的payload
三实战编码:1.需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
import json
import requests
#1.指定url
post_url='https://fanyi.baidu.com/?aldtype=85#en/zh/dog'
#2.UA伪装
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
#携带参数处理
kw=input('enter a word:')
data={'kw':kw}
4.请求发送
response=requests.post(url=post_url,json=data,headers=headers)
print(response.text)
显示的是你请求的参数格式
2.需求:破解百度翻译
3.需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据
4.需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
5.需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
http://scxk.nmpa.gov.cn:81/favicon.ico
- 动态加载数据
- 首页中对应的企业信息数据是通过ajax动态请求到的。
http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=e6c1aa332b274282b04659a6ea30430a
http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=f63f61fe04684c46a016a45eac8754fe
- 通过对详情页url的观察发现:
- url的域名都是一样的,只有携带的参数(id)不一样
- id值可以从首页对应的ajax请求到的json串中获取
- 域名和id值拼接出一个完整的企业对应的详情页的url
- 详情页的企业详情数据也是动态加载出来的
- http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
- http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById
- 观察后发现:
- 所有的post请求的url都是一样的,只有参数id值是不同。
- 如果我们可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据的ajax请求的url
#动态加载数据(ajax)
url和详情页面都是动态加载
2,破解百度翻译:import json
import requests
#1.指定url
post_url='https://fanyi.baidu.com/?aldtype=85#en/zh/dog'
#2.UA伪装
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
#3.请求参数处理
kw=input('enter a word:')
data={'kw':kw}
#4.请求发送
response=requests.post(url=post_url,json=data,headers=headers)
print(response.text)
#5.获取响应数据,json()返回的是obj对象(如果确认响应数据是json类型的,才可以使用json()方法 )
#dic_obj=response.json() #.json拿到的是字符串对象
page_text = response.text
#持久化存储
#fp=open(filename,'w',encoding='utf-8')
#json.dump(dic_obj,fp=fp,ensure_ascii=False) #ensure_ascii=False中文
filename="word"+'.html'
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('over!')
3,豆瓣电影分类排行榜
#----- 实战代码:-----
# 基于requests模块ajax的get请求
# 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据
import requests
if __name__ == "__main__":
#指定ajax-get请求的url(通过抓包进行获取)
url='https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action='
#定制请求头信息,相关的头信息必须封装在字典结构中
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
#定制get请求携带的参数(从抓包工具中获取)
param = {
'type':'24',
'interval_id':'100:90',
'action':'',
'start':'0', # 从库中的第几部电影开始取
'limit':'20' # 一次请求取出的个数
}
#发起get请求,获取响应对象
response = requests.get(url=url,headers=headers,params=param)
list_data = response.json()
fp = open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp = fp,ensure_ascii=False)
4,肯德基餐厅查询
import requests
#1.指定url
url='http://www.kfc.com.cn/kfccda/storelist/index.aspx'
data={'cname': '',
'pid':'',
'keyword': '南京',
'pageIndex': '1',
'pageSize': '10'}
#2.UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
#3.请求发送
response=requests.post(url=url,data=data,headers=headers)
page_text = response.text
filename="kendeji"+'.html'
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('over!')
5,药监局相关数据
import requests
import json
if __name__ == '__main__':
#1.指定url
url='http://scxk.nmpa.gov.cn:81/favicon.ico'
#2.UA伪装
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
#参数处理
data={'on': 'true',
'page': '1',
'pageSize': '15',
'productName':'',
'conditionType': '1',
'applyname':'',
'applysn':'' }
#3.请求 响应 获取所有企业的id
id_list=[] #存储企业的id
json_ids=requests.post(url=url,data=data,headers=headers).json() #包含ids的json数据
for dic in json_ids['list']:
id_list.append(dic['ID'])
print(id_list)
#获取企业详情数据
post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?hKHnQfLv=5zxRwRx2tA8SQIFhPqIgkPIWjB15QdN7y.g12sev.TdZxpHMZNf7kAytBCisIwB8iIznX1vtRJQEAOxM_hP95JvYQcnT.MsVX03yXgcSgK78vH_.4SfYvfpsW6A7Nbl3acIwimR.tP.ZV0bvA3KtkWehj30OeLnCIh6K5Vib7wo.2ziX2h.PIMXvYFbDbrtxEZY0B9WgG7hIw0WMMCmNMdQCQeYU7z942CNgILWaQurVE9mannv3jzzkzcXWnqVoj1hgD2.T42s8q8p30aWmB_L0W6iGN7QBevUYDhcrhbtl&8X7Yi61c=4S1F9NAVNxJGt845VaPAJbLaDMs8tfMtZO893V7Wr1sl5_sQ5QyFgLfjdzF8mtTf0Up2wwF2kABJGJcnuPhDgwMqWVDHCRxwORon3nsk19.N5HWakLHWHEEC13cAH4nS.'
for id in id_list:
data={'id':id}
detail_json=requests.post(url=post_url, data=data, headers=headers).json()
print(detail_json)
Request URL:
page页码--动态页码——>for循环 page转换字符串 参数处理data字典在for循环当中 headers在循环外 获取的企业id在for循环内



