爬虫实例——化妆品相关数据(多页)
原创
©著作权归作者所有:来自51CTO博客作者心兰相随的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
一、题目描述
二、步骤
1、查看响应URL获取到的内容
①指定URL
②获取请求
③获得响应数据
④持久化处理(存储到文件中)
2、内容判断
3、验证动态请求(抓包工具)
①打开抓包工具(页面右键的检查)
②找到对应的数据包(对比URL)
③对比响应数据
④结论
4、动态加载数据
①判断其请求方式
②查看求请求包内容
③查看resposne返回的内容
④观察详情页的URL的规律
五、源码
六、总结
一、题目描述
爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
二、步骤
1、查看响应URL获取到的内容
最笨的办法:通过代码去测定获取到的URL内容
①指定URL
# step 1:指定URL
url = 'https://m.sogou.com/'
②获取请求
# step 2:发起请求
# get方法会返回一个响应对象
response = requests.get(url=url)
③获得响应数据
# step 3:获取响应数据,text返回的是字符串形式的响应数据
page_test = response.text
print(page_test)
④持久化处理(存储到文件中)
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_test)
print('爬取数据结束')
2、内容判断
通过对获取的信息的与通过浏览器得到的页面相对比发现有不同之处,不同之处在于获取的信息中不包括企业的信息(因为企业的信息一定不是通过URL的方式得到的,而是其他方式——ajax动态请求)
3、验证动态请求(抓包工具)
①打开抓包工具(页面右键的检查)
②找到对应的数据包(对比URL)
③对比响应数据
url对应的响应数据在保存response中,此时的内容就是通过requests请求得到的内容,在源码中进行搜索就能判断请求的数据是否是URL页面的数据
④结论
针对相关的需求进行页面爬取时,爬取的网页中的数据可能是动态加载的,不一定能由地址栏中URL请求得到,可能是其它的加载方式
4、动态加载数据
①判断其请求方式
打开抓包工具,将选项卡切换到SHR中,然后再进行请求发送,发现得到ajax请求包
②查看求请求包内容
(URL,请求方式,是否携带参数,响应回来的数据类型)
③查看resposne返回的内容
response中返回的是json数据,通过json格式化工具查看其内容,发现其就是首页中显示的数据
④观察详情页的URL的规律
其域名都相同,只是所对应的ID不同,而ID存储在前一个页面返回的JSON数据中,所以将域名和ID进行拼接得到的就是详情页的URL,得到URL之后再验证其是否是动态加载的数据(用抓包工具判断)。
五、源码
# -*- coding: utf-8 -*-
import requests
import json
if __name__ == '__main__':
#批量获取不同企业的id值
headers = {
'User-Agent': 'Mozilla /5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36'
}
id_list = [] # 存储企业的id
all_data_list = [] # 存储所有的企业详情数据
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
#参数的封装
for page in range(1,6):
data = {
'on':'true',
'page':'1',
'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)
#持久化存储all_data_list
fp = open('./allData.json','w',encoding='utf-8')
json.dump(all_data_list,fp=fp,ensure_ascii=False)
print('over')
六、总结
此代码试运行不了的,因为有一些反扒机制的存在,但是其思维的方式以及整个的逻辑思维是通用的,而且是普遍的,所以要体会其过程和逻辑,然后再多实践,形成一个固定思维。