'''requests模块:python中原生的一款基于网络请求的模块
作用:模拟浏览器发请求
如何使用:requests模块编码流程
指定url
发起请求
获取响应数据
持久化存储
环境安装:pip install requests
实战编码:
需求:搜狗首页页面数据
实战巩固
需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
UA检测
UA伪装
需求:破解百度翻译
使用浏览器自带抓包工具,发现百度翻译使用ajax请求,所以查找SHR类型文件,通过查找sug数据确定那个文件
post请求(携带了参数)
查看content-type得知json类型数据
需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据
需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
查询餐厅信息,输入'北京'后点击查询,地址栏网址变化说明不含ajax请求,局部刷新
需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据http://scxk.nmpa.gov.cn:81/xk/
动态加载数据
首页中对应的企业信息是用ajax请求请求到的
'''
import requests
if __name__=="__main__":
#指定url
url = 'https://www.sogou.com/'
#发起请求,get方法会返回一个响应对象
response=requests.get(url=url)
#获取响应数据,text返回的事字符串形式的响应数据
page_text=response.text
print(page_text)
#持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print('end')
import requests
if __name__=="__main__":
#UA伪装:将对应的User-Agent封装到一个字典中
headers= {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36'}
#指定url
url = 'https://cn.bing.com/search'
#处理url携带的参数:封装到字典中
kw=input('enter a word:')
param={
'q':kw
}#当前url中指携带一组参数,对应字典一组键值,多组对应多组
#对指定的url发起的请求对应的url时携带参数的,并在请求过程中处理了参数
response=requests.get(url=url,params=param,headers=headers)#params是参数,bing的搜索参数是q,headers是发起的头部请求
#获取响应数据,text返回的事字符串形式的响应数据
page_text=response.text
print(page_text)
#持久化存储
filename=kw+'.html'
with open(filename,'w',encoding='utf-8') as fp:
fp.write(page_text)
print('end')
#UA伪装:User-Agent(请求载体的身份标识)
#UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果身份标识为某浏览器,就可判断为浏览器发起的正常请求
#但是,如果检测到请求的身份标识不是浏览器,则表示请求不正常(爬虫),则服务器端很有可能拒绝该请求
#为成功过检测进行UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
'百度翻译'
import requests,json
if __name__=="__main__":
# UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
#指定url
post_url = 'https://fanyi.baidu.com/sug'
#发起请求,get方法会返回一个响应对象
word=input('你要搜的单词')
data={'kw':word}#post参数处理
response=requests.post(url=post_url,data=data,headers=headers)#data类似param是参数,post同get请求一致
#获取响应数据,json()方法返回的是obj(如果确认服务器相响应据是json类型的,才可使用json)
dic_obj=response.json()
print(dic_obj)
#持久化存储
filename = word+ '.json'
fp1=open(filename,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp1,ensure_ascii=False)#我们所拿到的json串是中文的,中文不能使用阿斯克码,所以给ensure_ascil赋值为false
print('over')
‘豆瓣电影’
import requests,json
if __name__=="__main__":
# UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
#指定url
url = 'https://movie.douban.com/j/new_search_subjects'
#发起请求,get方法会返回一个响应对象
word=input('从第几个开始搜')
param={'sort': 'U',
'range':'0,10',
'tags':'',
'start':word,#从豆瓣电影库中第几部电影去取
'genres': '喜剧'}#get参数处理
response=requests.get(url=url,params=param,headers=headers)#data类似param是参数,同get请求一致
#获取响应数据,json()方法返回的是obj(如果确认服务器相响应据是json类型的,才可使用json)
list_data=response.json()
print(list_data)
#持久化存储
fp1=open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp1,ensure_ascii=False)#我们所拿到的json串是中文的,中文不能使用阿斯克码,所以给ensure_ascil赋值为false
print('over')
‘肯德基’
import requests,json
if __name__=="__main__":
# UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
#指定url
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
#发起请求,get方法会返回一个响应对象
where = input('查询哪里的肯德基')
wordye=input('从第几页开始搜')
wordshu = input('一页几个餐厅')
data={'cname':'',
'pid':'',
'keyword':where,
'pageIndex':wordye,
'pageSize': wordshu}#post参数处理
response=requests.post(url=post_url,data=data,headers=headers)#data类似param是参数,同get请求一致
#获取响应数据,json()方法返回的是obj(如果确认服务器相响应据是json类型的,才可使用json)
list_data=response.json()
print(list_data)
#持久化存储
fp1 = open('./kfc.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp1, ensure_ascii=False) # 我们所拿到的json串是中文的,中文不能使用阿斯克码,所以给ensure_ascil赋值为false
print('over')
import requests,json
if __name__=="__main__":
# UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
#指定url
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
#发起请求,get方法会返回一个响应对象
where = input('查询哪里的肯德基')
wordye=input('从第几页开始搜')
wordshu = input('一页几个餐厅')
data={'cname':'',
'pid':'',
'keyword':where,
'pageIndex':wordye,
'pageSize': wordshu}#post参数处理
response=requests.post(url=post_url,data=data,headers=headers)#data类似param是参数,同get请求一致
#获取响应数据,json()方法返回的是obj(如果确认服务器相响应据是json类型的,才可使用json)
list_data=response.text
print(list_data)
#持久化存储
filename=where+'第'+wordye+'页'+'kfc.txt'
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(list_data)
print('end')
#药监总局
#通过对详情页url的观察,发现:
# http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=a6674298a4ac474ba76a7bccbe0ebad5
# http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=5fc36d8973e2478ebe727f911ac0333c
# url的域名都是一样的,只有有参数id不一样,id值可以从首页对应的ajax请求到的json中获取,域名和id值可以拼接出完整的url
#详情页的企业信息也是动态加载出来的
# http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
# http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
#企业信息post请求的url是是统一的,但是参数id不同
#如果我们可以批量获取多家企业id,可将id和url形成完整的详情页对应详情数据的ajax请求
import requests,json
if __name__=="__main__":
# UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
id_list = [] # 存储企业id
all_data = [] # 存储企业详细信息
#批量获取不同企业id值
#指定url
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'#页面ajax请求的xhr文件中的请求url
#参数的封装
for page in range(1,6):
page=str(page)
data={'on': 'true',#缩进数据在循环中
'page': page,#第几页
'pageSize': 15,#一页几个
'productName':'',
'conditionType': 1,
'applyname':'',
'applysn':'' }
#发起请求,get方法会返回一个响应对象
json_ids=requests.post(url=url,data=data,headers=headers).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?method=getXkzsById'
for id in id_list:
data_id={'id':id}#利用开发者工具在ajax请求的xhr文件中的得到Content-Type,判断企业信息数据是json格式
detail_json=requests.post(url=post_url,data=data_id,headers=headers).json()
all_data.append(detail_json)
print(all_data, 'end')
#持久化存储
fp=open('./alldata.json','w',encoding='utf-8')
json.dump(all_data,fp=fp,ensure_ascii=False)
print('over')