requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发请求。
import requests
if __name__=="__main__":
#第一步:指定url
url='https://www.sogou.com/'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
#第二步:发出请求
#get方法会返回一个响应对象
response=requests.get(url=url,headers=headers)
#第三步:获取响应数据,
#text返回的是字符串形式的响应数据
page_text=response.text
#第四步:持久化存储
with open('搜狗.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print("爬虫完毕")
需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
#UA:User-Agent(请求载体的身份标识)
#UA伪装:门户用站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器
#说明是一个正常请求,反之,不可以请求
import requests
if __name__=="__main__":
url='https://www.sogou.com/web?' #https://www.sogou.com/web?query=你好李焕英
#处理url携带的参数:封装到字典中
world=input('请输入搜索内容')
param={
'query':world
}
#UA伪装
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
#对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
#url请求过程中动态拼接了param
response=requests.get(url=url,params=param,headers=headers)
page=response.text
kw=world+'.html'
with open(kw,'w',encoding='utf-8') as fp:
fp.write(page)
print("爬虫完毕")
需求:破解百度翻译
import requests
import json
if __name__=="__main__":
#1.指定url
post_url='https://fanyi.baidu.com/sug'
#2.UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
#post请求参数处理(同get请求一致)
word=input('请输入一个单词:')
data={
'kw':word
}
#4.请求发送
response=requests.post(url=post_url,data=data,headers=headers)
#5.获取响应数据:json()方法返回的是obj
#如果确认响应数据是json类型的,才可以使用json()
page=response.json()
#持久化存储
fp=word+'.json'
filename=open(fp,'w',encoding='utf-8')
json.dump(page,fp=filename,ensure_ascii=False)
import requests
import json
if __name__=="__main__":
url='https://movie.douban.com/j/chart/top_list?'
# 2.UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
param={
'type': '4',
'interval_id': '100:90',
'action':'',
'start': '0',
'limit': '20',
}
response=requests.get(url=url,params=param,headers=headers)
list=response.json()
fp=open('xiju.json','w',encoding='utf-8')
json.dump(list,fp=fp,ensure_ascii=False)
print('结束')
#作业
import requests
import json
if __name__=="__main__":
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
data={
'cname':'',
'pid':'',
'keyword': '郑州',
'pageIndex': '1',
'pageSize': '10',
}
response=requests.post(url=url,data=data,headers=headers)
dic=response.text
with open('kendeji.html','w',encoding='utf-8') as fp:
fp.write(dic)
print("结束")
需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据,网站(http://scxk.nmpa.gov.cn:81/xk/)
动态加载数据
首页中对应的企业信息数据是通过ajax动态请求到的
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=af4832c505b749dea76e22a193f873c6
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=e48046ec68d34d4692abbb6e06373866
只有两个ID值不同
通过对详情页url的观察发现:
详情页的企业详情数据也是动态加载出来的
观察后发现:
-所有的post请求的url都是一样的,只有参数id值是不同
如果我们可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据的ajax请求的url
import requests
import json
if __name__=="__main__":
#先批量获取企业的id
url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
id_list=[] #存储企业的id
all_data_list=[] #存储所有的企业详情数据
#参数封装
for i in range(1,10):
data={
'on': 'true',
'page': i,
'pageSize': '15',
'productName':'',
'conditionType': '1',
'applyname':'',
'applysn':'',
}
dic=requests.post(url=url,data=data,headers=headers).json()
for i in dic['list']:
id_list.append(i['ID'])
#获取详情页
post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
data={
'id': id,
}
dic1=requests.post(url=post_url,data=data,headers=headers).json()
all_data_list.append(dic1)
fp=open('化妆品.json','w',encoding='utf-8')
json.dump(all_data_list,fp=fp,ensure_ascii=False)
print("完成")