python学习日记
注:写这个纯属为了督促自己学习,记录一下学习历程。
大四学生在读,是个贼懒的工科女王吧
之前有一些littlelittle的基础,寒假决定重新自学python,争取每天更新自己的学习笔记!fighting!
2020年2月8日 第3⃣️篇
嘻嘻 偷懒过了个周末,i’m back
这次做了三个任务,分别是豆瓣电影爬取,kfc餐厅地址爬取和国家药监局化妆品生产许可信息管理服务平台网页的爬取。
第三个会复杂一些,但都不难,开冲!
一些笔记📖
- 首先 回顾一下requests模块的使用步骤
-获取url地址
-描述参数
-发起请求
-获取响应数据
-存储数据
细说的话,首先url地址的获取通常是通过页面顶部的地址栏,直接复制粘贴,但其中有一些ajax类型的页面,也就是具有实时的局部动态刷新功能的页面,需要通过抓包工具,也就是chrome页面的检查,来进行获取。
参数的话也是通过抓包工具来进行获取,通常参数封装在一个字典中,喔,记得写好UA进行伪装🥸
请求的话,先通过抓包工具,看看request method是post类型还是get类型
获取响应数据用两种获取方式,一种是用requests模块.text获取;另一种是用json模块.json进行获取
存储数据要看上一步是如何获取的响应数据,如果是用第一种requests模块获取的话,用.html存储;用json获取的,存储为.json类型
实战3 豆瓣电影页面的爬取
网址:https://movie.douban.com/explore#!type=movie&tag=喜剧&sort=recommend&page_limit=20&page_start=0
打开抓包工具,找到response中有电影信息的XHR,
查看其headers,拉到最下面查看其参数query string parameters
可以看到他的参数一共是五个,他们在这个网址的url上也有体现。
然后看看他的request method 是get类型,所以我们一会发起请求的话,直接用requests模块的get就好咯,Content-Type是json类型,所以需要.json获取响应数据
import requests
import json
if __name__ == "__main__":
#1.指定url 有参数用字典封装
url = 'https://movie.douban.com/j/search_subjects'
param = {
'type': 'movie',
'tag': '喜剧',
'sort': 'recommend',
'page_limit': '1',#一次取几个
'page_start': '1'#从哪开始取
}
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
response = requests.get(url=url,params=param,headers=headers)
list_data = response.json()
fp = open('.douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
print('over')
实战四 kfc餐厅地址爬取
网址:http://www.kfc.com.cn/kfccda/storelist/index.aspx
同样打开抓包工具,输入餐厅关键字,这里我输的是北京,进行查询,可以看到XHR出现了一个name,点进去看response,发现响应就是餐厅信息,确定是他。
url和headers都是这里的。向下滑,查看其参数。因为 query string parameters在网站url里有体现了,因此这里的参数取的是form data里面的参数。
request method 是post类型
再查看他的response headers 的content-type是text/plain类型,因此确定获取响应应该用requests模块。不过这里用json也可以,我试了json。
import requests
import json
if __name__ == "__main__":
#1.url
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
#2.参数
param = {
'cname': '',
'pid': '',
'keyword': '北京',
'pageIndex': '1',
'pageSize': '10'
}
#3.UA伪装
headers = {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
#4.获取响应
response = requests.post(url=url,params=param,headers=headers)
list_data = response.text
with open('kfc.html', 'w', encoding='utf-8') as fp:
fp.write(list_data)
print('over')
实战五 化妆品信息管理平台爬取
这个相对来说会稍微复杂一些
网址:http://scxk.nmpa.gov.cn:81/xk/
打开网址的抓包工具,刷新,XHR里面只有一个,查看其response,这里我们可以复制粘贴一下这个response。另开一个页面,搜索json在线,我用的是这个:
网址:https://www.bejson.com,进行格式化校验
可以发现,这个response得到的是页面的15个企业的部分信息,我们要做的是把这15个或者所有的企业的全部信息调取出来。
根据以上两个实战的流程,我们获取这个页面的url,参数,类型,进行第一次爬取
import requests
import json
if __name__ == '__main__':
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
param = {
'on': 'true',
'page': '1',
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': '',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
response = requests.post(url=url,params=param,headers=headers)
list_data = response.json()
fp = open('.comst.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
print('over')
可以调取到json数据,那我们怎么把所有企业的所有信息调取出来呢?
通过观察每一家企业页面信息的参数,我们可以看到,每家企业信息页面的url是相同的,只有一个参数id是不同的。那我们就可以批量获取多家企业id,就可以将id和url形成一个完整的详情页。其实是需要进行循环来完成。
import requests
import json
if __name__ == '__main__':
#1.批量获取不同企业的id
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
#1.2.参数
id_list = []
all_date_list = []
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
for page in range(1,6):
page = str(page)
data = {
'on': 'true',
'page': page,
'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'])
#1.3
#获取企业详情数据
post_url = 'http://scxk.nmpa.gov.cn: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()
#print(detail_json)
all_date_list.append(detail_json)
#持久化存储
fp = open('./alldata.json','w',encoding='utf-8')
json.dump(all_date_list,fp=fp,ensure_ascii=False,indent=True)
print('over')
大体的思路是:
首先批量获取不同企业的id参数:通过循环page参数,返回多个企业的id
将这些id有序存储在id_list中
接着 获取企业详情页的url,将id_list转换为字典类型,并用其作为参数查找企业
然后把返回的json数据放到all_date_list列表中,进行持久化存储。
其实与前面两个相比 最后一个多了两次循环,稍微复杂一些,理解了就ok啦。今天就到这里啦!