从网页抓取数据(爬虫实战入门级教学(数据爬取-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(&#39;//div[&#39; + str(j) + &#39;]//a/@href&#39;)

link = &#39;https://www.2bulu.com&#39; + semi_link[0]

# 提取出行方式, text()可以获取文本内容

way = h.xpath(&#39;//div[&#39; + str(j) + &#39;]//p/span[1]/text()&#39;)

# 去除数据头和尾部的空格(\t\n)

way = way[0].strip()

# 提取标题

title = h.xpath(&#39;//div[&#39; + str(j) + &#39;]//p[1]/text()&#39;)

title = title[1].strip()

# 提取出行距离

distance = h.xpath(&#39;//div[&#39; + str(j) + &#39;]//li[1]/span[1]/text()&#39;)

distance = distance[0].strip()

# 去除数据中间的空格(\t\n)

distance = re.sub(&#39;\t&#39;, &#39;&#39;, distance)

distance = re.sub(&#39;\n&#39;, &#39;&#39;, distance)

# 提取作者名称

author = h.xpath(&#39;//div[&#39; + str(j) + &#39;]//li[1]/span[3]/a/text()&#39;)

author = author[0].strip()

# 提取起点和终点

travel = h.xpath(&#39;//div[&#39; + str(j) + &#39;]//li[2]/text()&#39;)

travel = travel[0].strip()

travel = re.sub(&#39;\t&#39;, &#39;&#39;, travel)

travel = re.sub(&#39;\n&#39;, &#39;&#39;, travel)

# 提取出行时间

tim = h.xpath(&#39;//div[&#39; + str(j) + &#39;]//li[1]/span[3]/text()&#39;)

# 该网页中有的用户名存在特殊字符,比如包含&#39;

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线