续上一个笔记,继续学习requests请求
7、实战巩固:爬取豆瓣电影分类排行榜https://movie.douban.com/中的数据
找对对应网页https://movie.douban.com/typerank?type_name=喜剧&type=24&interval_id=100:90&action=(其实这里就可以看到?后面的就是对应的参数了)
滑动发现当滑到最底部时数据会自动更新,即又发起了一个请求。
现在来找一下请求。
可以看到这里是get()方法,响应数据是json类型,并找到User-Agent
参考代码:
import requests
import json
if __name__=='__main__':
url='https://movie.douban.com/j/chart/top_list'
param={
'type':'24',
'interval_id':'100:90',
'action':'',
'start':'0',#从第一部开始
'limit':'30'#每次请求最多30部
}
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'
}
response=requests.get(url=url,params=param,headers=headers)
list_data=response.json()
with open('./douban.json','w',encoding='utf-8') as fp:
json.dump(list_data,fp=fp,ensure_ascii=False)
print('over!!')
8、综合巩固:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
首先,它给我们一个网址http://125.35.6.84:81/xk/
打开后是这样的
可以发现这是属于动态加载数据的,和前面的案例一样,需要通过ajax动态请求得到。
但我们要的是每个企业的具体相关数据,像这样的
怎么得到呢?
对比一下两个不同企业的详情页url
http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=ff83aff95c5541cdab5ca6e847514f88
http://125.35.6.84:81/xk/itownet/portal/dzpz.jsp?id=219320a76d694fb5ab3387430dad4fef
发现url的域名都是一样的,只有携带的参数(id)不一样
而id可以从首页对应的ajax请求到的json串中获取(注意这里的id只是显示出一页的所有企业的,如果要获得多页的,可以用for循环对page参数进行处理)
域名和id拼接成一个完整的企业对应的详情页的url
因此我们可以先由一个ajax请求得到一组json数据,然后由json数据得到多家企业的id,将这组id一个个进行ajax请求的url携带的参数进行爬取(由于url的域名是一样的,这里可以借助for循环),最终获得多家企业的详情信息。
具体代码:
import requests
import json
if __name__=="__main__":
#批量获取id值
url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'
}
all_data_list=[]#存储所有企业详情数据
id_list=[]#存储所有企业id
#参数的封装
for i in range(1,5):
data={
'on':'true',
'page':i,
'pageSize':'15',
'productName':'',
'conditionType':'1',
'applyname':'',
'applysn':'',
}
#发起请求并得到响应文件
json_ids=requests.post(url=url,headers=headers,data=data).json()
for dic in json_ids['list']:
id_list.append(dic['ID'])
#获取企业数据
post_url="http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById"
for id in id_list:
data={
'id':id
}
detail_json=requests.post(url=post_url,headers=headers,data=data).json()
all_data_list.append(detail_json)
#持久化存储
with open('./allData.json','w',encoding='utf-8')as fp:
json.dump(all_data_list,fp=fp,ensure_ascii=False)
print('over!!')
9、总结:
- 找到你要爬取的数据的网页
- 分析数据是如何得到的,是要全部的,还是局部的,需要动态获取吗?
- 分析requests请求是post()还是get()方法,得到响应的url
- url是否携带参数,参数是否需要动态获取,如果需要,可封装在字典中 从请求消息那获取User-Agent
- 从响应消息那查看数据类型,如果是json文件,可以利用json()方法
- 最后记得持久化存储,即存到文件中去。