一、什么是requests模块?
requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
二、为什么要使用requests模块
因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
手动处理url编码
手动处理post请求参数
处理cookie和代理操作繁琐
......
使用requests模块:
自动处理url编码
自动处理post请求参数
简化cookie和代理操作
......
三、如何使用requests模块
安装:
pip install requests
使用流程
指定url
基于requests模块发起请求
获取响应对象中的数据值
持久化存储
四、基于requests模块ajax的get请求实例(豆瓣电影评分)
#爬去电影详细内容
importrequests#设置网页请求头信息
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36"}#请求网址
url = "https://movie.douban.com/j/chart/top_list"
#获取前10页内容
for i in range(10):
params={'type': '5','interval_id': '100:90','action': '','start': '0','limit': str(i*20)
}#返回请求结果
res_json = requests.get(url=url, params=params, headers=headers).json()for res inres_json:print(res["title"], res["rating"][0])
五、基于requests模块ajax的post请求(肯德基餐厅数据)
importrequests#请求头
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36"}
url= "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"city= input("请输入城市?")for page in range(10):
data={'cname': '','pid': '','keyword': city,'pageIndex': page,'pageSize': '10',
}#获取网页信息
res_json = requests.post(url=url, data=data, headers=headers).json()for res in res_json["Table1"]:
detail_dict={"storeName": res["storeName"],"addrs": res["addressDetail"]
}print(detail_dict)
六、基于requests模块请求(图片存取的两种方式)
需求:图片地址:https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4123503812,4090072703&fm=26&gp=0.jpg
6.1 通过request获取图片,可以设置UA进行伪装
#方式一:
importrequests#图片url
url = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4123503812,4090072703&fm=26&gp=0.jpg"headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36"}
res= requests.get(url, headers=headers).content#print(res)
#保存图片
with open("1.jpg", "wb") as fp:
fp.write(res)
6.2 通过urllib获取图片
#方式二:
from urllib importrequest#图片url
url = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4123503812,4090072703&fm=26&gp=0.jpg"
#保存图片
res = request.urlretrieve(url, filename="./2.jpg")
七、基于requests模块综合练习(国家药监局)
需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据http://125.35.6.84:81/xk/
importrequestsfrom fake_useragent importUserAgent
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']#用于二级页面数据获取
#下列详情信息可以在二级页面中获取
#name = dict['EPS_NAME']
#product = dict['PRODUCT_SN']
#man_name = dict['QF_MANAGER_NAME']
#d1 = dict['XC_DATE']
#d2 = dict['XK_DATE']
all_id_list.append(id)#该url是一个ajax的post请求
post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
for id inall_id_list:
post_data={'id':id
}
response= requests.post(url=post_url,data=post_data,headers=headers)#该请求响应回来的数据有两个,一个是基于text,一个是基于json的,所以可以根据content-type,来获取指定的响应数据
if response.headers['Content-Type'] == 'application/json;charset=UTF-8':#print(response.json())
#进行json解析
json_text =response.json()print(json_text['businessPerson'])
方式一
方式二:
importjsonimportrequestsdefget_url_id(url, headers):#网页ID列表
id_list =[]#爬取5页数据
for page in range(5):
data={'on': 'true','page': str(page),'pageSize': '15','productName': '','conditionType': '1','applyname': '','applysn': ''}#获取所有的数据
res_dict = requests.post(url=url, data=data, headers=headers).json()for res in res_dict["list"]:
id_list.append(res["ID"])#返回id列表,里面存放所有详情页id
returnid_list#获取详情页信息
defget_detail(url, headers, id_list):#遍历id列表
for id inid_list:
data= {'id': id}
res_dict= requests.post(url=url, headers=headers, data=data).json()
content={"epsName": res_dict.get("epsName"),"businessPerson": res_dict.get("businessPerson")
}print(content)#保存内容到文件
f = open("detail.txt", encoding="utf-8", mode="a")
json.dump(content, f, ensure_ascii=False)
#with open('detail.json','w',encoding='utf-8') as fp:
# json.dump作用:
# 将字典、列表dump成满足json格式的字符串
#json.dump(data,fp,ensure_ascii=False)
if __name__ == '__main__':#获取网页ID
id_url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList"
#网页详情
detail_url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById"
#请求头信息
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3573.0 Safari/537.36"}#获取id列表
id_list =get_url_id(id_url, headers)#获取详情内容更
get_detail(detail_url, headers, id_list)