栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

第四周——爬虫入门 Day3 7.20

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第四周——爬虫入门 Day3 7.20

学习时间:9:00——11:00          16:00——18:30

实践——爬取肯德基地址

爬取肯德基网站数据
import requests
import json
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32'}
kw = input ('请输入城市:')
param = {'cname': '',
'pid': '',
'keyword': kw,
'pageIndex': '1',
'pageSize': '1000',
}
response = requests.post(url,params=param,headers=header)
page_data = response.text
fileName = kw + '.html'
with open(fileName,'w',encoding='GBK') as fp:
    fp.write(page_data)
    print('over!')

实践——爬取药监总局

这个网站的内容中,我们要爬取的内容是动态加载出来的数据,大概率是阿贾克斯所制作的数据,因此无法通过传统的方式来获取(无法直接对url发送请求即可或许),而接下就进行验证是否真的是阿贾克斯请求导致的动态网址。

刷新该网址,然后可以在开发者人员模式下的网络里找到XHR,里面有一行,点开之后查看Content-TYPE后能发现是json格式的,然后点击response后可以看到这个json串,在百度里搜索json在线就能出现一个解析格式化的网址,将这个json串剪切到里面就可以查看到首页当中所显示的行政机关、日期和许可编号之类的。意味着当前页面中的信息是的阿贾克斯请求所请求到的。

通过对这个json串进行深度剖析之后发现并没有现成的url,但是却有id,通过对每个网页当中不同的链接进行观察会发现,每一个链接的唯一区别就只有id不一样,所以可以根据每家企业所对应的id值能够和网页的域名拼接出完整的url地址。

而在首页已经得到了一个教训就是网页当中的内容可能是动态加载的,因此我们不可能轻松地搞定,为了防止每一个链接下也是如此,所以要进行验证,打开任意一个链接,然后在这个链接下在开发者人员工具模式下可以看到content-TYPE中显示该网页是html格式,然后再response中搜索网页中的文字但是搜不到,因此可以判定这个网页也是动态加载数据。然后在XHR中可以看到又出现了一个阿贾克斯的Name,然后将该Name的response下的json串继续在线解析格式化输出看一下,就可以发现这些内容里就拥有我们想要爬取的最终的内容。最后通过对比不同的链接可以发现,每一个链接的post请求的url都是相同的,只有参数id不同。因此倘若可以批量夺取多家企业的id后,就可以将id和url形成一个详情页对应想求数据的阿贾克斯请求的url。

那么进入代码环节,因为我们要爬取的内容在药品官网的链接里的阿贾克斯请求POST里面,所以我们的url是在网络的XHR里的那个url里。同时json串都是有封装的,其封装内容是在最下面的from data里,我们在代码里创建一个data的列表将其进行封装即可。在搞好了url、headesUA反爬、data封装之后,将这个json串进行保存赋值给json_ids,下一步就可以将json_ids里面的id进行提取并存储了。存储的话我们要存储在列表里,因此要提前建立一个列表这里命名为id_list,然后通过循环将id安置在列表当中,同时还要知道我们的id是在哪里,观察json在线解析里可得知每一个id都在医药首页的XHR阿贾克斯中json串所显示的的response的list中的列表里

我们可以用尾部追加append的方式一个个地将list中的id一个个地打印到我们所创建的空列表当中,批量获取id完成,接下来就要获取企业详情页的数据。

之前分析过每一个链接都是一样的,不同时只是id,因此可以通过循环,for id in id_list,意思就是设id是我们刚才所创建的存储id的列表的id_list的表达形式,然后封装的时候就以data的列表命名,然后键是id,值就是id_list里面的内容,最后通过requests的post请求,设置好网址url,还有反爬UA,最后还有post所对应的data就是刚封装好的id,以json的形式组合完成命名为derail_json,最后再将其通过追加append的方式保存到all_data_list当中,保存为json钱再将jsonimport一下。

下一步就要实行分页操作,因此要做一下循环,负责搞定网页的爬取的分页的在data里的page,range(1,6),根据顾头不顾尾的方式是循环五次(1,2,3,4,5)的意思,因此将page的类型先确定为是字符串而并非是数字,然后在data字典里的page就变成了(1,2,3,4,5),获取前五页所有企业的id进而获得所有企业的详情数据。

总结:首先讲解的是什么是requests模块,requests模块就是一个模拟浏览器发送请求的工具。使用方式大致分为:指定url(包括UA尾伪装和请求参数的处理)、发送请求、获取相应数据、持久化存储四个步骤。接下来就要摄入到数据解析的讲解过程当中,主要应用在聚焦爬虫(一整张页面的当中局部的内容进行爬取)

数据解析分类:正则、bs4、xpath(常用)

大部分网页要存储的位置,无非只有两种,一种是存放在标签中间,另一种是存放在标签所对应的属性中,我们最终想要拿到这些数据,只需要找到标签的位置或存储标签所对应的属性值存储下来。

正则解析原理:

  1. 进行指定标签的定位
  2. 标签或者标签定位的属性中存储的数据值进行提取(解析)

图片数据的爬取,最后用text对图片的url进行返回的结果是字符串形式的数据,而如果使用content返回的是二进制数据,json返回的是对象。想要获取图片我们用的是content,然后保存的话就是with open来保存。

import requests
url = 'https://www.toopic.cn/public/uploads/small/1642749433419164274943395.png'
image_data = requests.get(url).content
with open('./bizhi.jpg','wb') as fp:
    fp.write(image_data)
    print('over!')

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022033.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号