从网页抓取数据(爬虫实战入门级教学(数据爬取-gt)(组图))
优采云 发布时间: 2022-04-19 03:01从网页抓取数据(爬虫实战入门级教学(数据爬取-gt)(组图))
爬虫实战入门教学(数据爬取->数据分析->数据存储)
每天写题好累,来个简单舒适的爬虫学习,小测试(仅供学习交流,有不足之处请指正)
文章比较详细,啰嗦,适合没有接触过爬虫的新手。需要源码的可以直接跳转到文章
的末尾
完整的源代码在文章结尾
目标主角:两步之路官网(仅供学习交流)
爬取旅游轨迹页面数据,以湖北武汉东湖数据为例,按时间顺序,爬取2010-2022年的旅游轨迹数据,并将爬取的页面数据保存到xlsx文件中,是知名的excel文件,搜索步骤如下图,地区:湖北-武汉,搜索轨迹:东湖,按时间顺序排列。
爬取的数据如下图所示,包括出行方式、标题、出行距离、作者姓名、出行时间、起点和终点(还有一条数据:下级页面的URL ,稍后会显示)
步骤一、研究网页
本次测试使用谷歌浏览器,进入开发者工具,找到网络,选择XHR,这个网页只有4条数据,所以一一搜索,直到网页出现在预览中,如下图
然后打开header,如下图,虽然我们访问的是初始URL,
但实际上,下图显示的真实网址正是我们所需要的。
但是如果我们直接复制访问真实的URL,结果如下,405错误
有什么问题?其实返回的真实URL只是原创网页的一部分,如下图,你在预览中看到的页面只是搜索结果。然后我们知道根据我们搜索的内容返回了真实的 URL。
既然我们知道真正的 URL 是我们搜索的结果,那么我们究竟搜索了什么?打开load,如下图是我们搜索到的
再研究一下我们的初始URL,如下图,我把它分成了4个block,分别对应上图中的key(东湖的汉字要加密),areaId(15728,代表武汉),pageNumber(1,代表搜索到的数据中的第一页),sortType(2,代表按时间排序),看来我们的初始URL收录了到达真实URL的key。
二、访问网页(写蜘蛛)
爬虫代码如下(相关依赖不展示,自己引导打包),因为我们要爬取的数据是通过搜索得到的,我们只需要通过POST请求发送搜索数据(数据) ,而访问的URL就是上面提到的真实的URL,但是我们把它按时间顺序放入URL中,也可以放在数据中。
# -*- coding = utf-8 -*-
# @Time : 2022/4/16 22:47
# @Author : 从小白出发
# @File : test.py
# @Software : PyCharm
# 真实URL
url = 'https://www.2bulu.com/track/track_search_result.htm?sortType=2'
# 请求头,可以自行百度一下,有很多,也可在开发者工具中复制
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/100.0.4896.88 Safari/537.36', }
# i 代表 pageNumber,从第1页到524页
for i in range(1, 525):
#设置定时3秒访问一次,防止被封ip,实测并不需要,该网页没有针对访问频率的反爬
time.sleep(3)
# 这里就是上文中提到的 荷载 ,即搜索数据
data = {'key': '东湖', 'pageNumber': i, 'areaId': '15728', 'parentId': '15727'}
#发送post请求
resp = requests.post(url=url, headers=head, data=data, timeout=1)
#服务端返回状态码200代表正常
if resp.status_code == 200:
#打印网页结果
print(resp.text)
如下图,我们只展示部分打印结果
三、网页源码分析
如下图,就是我们爬到的网页的代码。我没有展开它,因为太多了,所以我们需要进一步提取所需的数据。
我们以起点和终点为例,分析如何通过xpath获取数据
如下图,点击中上部分的小图标,然后在网页中点击我们需要的数据即可快速找到其源代码(tip)
然后在源码中右键复制xpath /html/body/div[3]/div[2]/div[2]/div/div[1]/ul/li[2]
但是真正的URL返回的不是整个网页,而是搜索结果。 xpath不需要从头开始,而是从div开始,即/html/body/div[3]/div[2]/div[2]/div/div[1] 这一段xpath不是需要
直接来自/div[1]/ul/li[2],我们的搜索结果每页有10条,所以xpath是/div[1 to 10]/ul/li[2]
p>
具体数据提取见下节,代码部分(注解)
四、数据提取(写xpath)
我们想通了如何获取xpath,开始提取数据
<p> # 因为每一页仅展示10条数据 因此我们从1到10,j代表每一条
for j in range(1, 11):
# 遍历j并放到div中
# 提取下一级链接, a是超链接, @href可以获取到url
semi_link = h.xpath('//div[' + str(j) + ']//a/@href')
link = 'https://www.2bulu.com' + semi_link[0]
# 提取出行方式, text()可以获取文本内容
way = h.xpath('//div[' + str(j) + ']//p/span[1]/text()')
# 去除数据头和尾部的空格(\t\n)
way = way[0].strip()
# 提取标题
title = h.xpath('//div[' + str(j) + ']//p[1]/text()')
title = title[1].strip()
# 提取出行距离
distance = h.xpath('//div[' + str(j) + ']//li[1]/span[1]/text()')
distance = distance[0].strip()
# 去除数据中间的空格(\t\n)
distance = re.sub('\t', '', distance)
distance = re.sub('\n', '', distance)
# 提取作者名称
author = h.xpath('//div[' + str(j) + ']//li[1]/span[3]/a/text()')
author = author[0].strip()
# 提取起点和终点
travel = h.xpath('//div[' + str(j) + ']//li[2]/text()')
travel = travel[0].strip()
travel = re.sub('\t', '', travel)
travel = re.sub('\n', '', travel)
# 提取出行时间
tim = h.xpath('//div[' + str(j) + ']//li[1]/span[3]/text()')
# 该网页中有的用户名存在特殊字符,比如包含'