python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)
优采云 发布时间: 2021-09-11 12:06python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)
先试试爬虫
前言
通过前几章的介绍,我们对什么是爬虫有了初步的了解,同时对如何抓取网页有了一个大致的了解。从本章开始,我们将从理论走向实践,结合实际操作进一步加深理解。
因为使用python爬取页面的工具有很多,比如requests、scrapy、PhantomJS、Splash等,而且解析爬取的页面的工具也很多。这里我们从最简单的开始,使用requests库和beautifSoup工具进行静态页面爬取和解析。
在基本功扎实之后,我们可以使用更加灵活的工具,不仅可以静态爬行,也可以动态爬行;不仅可以抓取单个页面,还可以递归深度抓取。同时,结合其他渲染、存储、机器学习等工具,我们可以对数据进行处理、加工、建模和展示。
实战开始
废话不多说,先从今天的例子开始,抓拍安徒生童话中著名的“丑小鸭”。 “欲善其事,必先利其器”。在开始之前,我们需要做好准备。
安装命令:pip install beautifulsoup4
开始爬行的第一步是找到收录童话“丑小鸭”的链接。我们在这里使用的链接是:
找到我们的目标链接后,第二步是分析网页。要分析什么?当然是分析我们要爬到哪里的内容。
根据我们之前的介绍,我们爬虫的目的是爬取丑小鸭的文本。根据这个目标,我们首先需要研究网页的组成。那么如何查看网页呢?一般是在浏览器的开发者模式下完成的。对于chrome浏览器,我们可以使用快捷键F12查看,如图:
左边是网页显示的内容,右边是网页的HTML文档。
通过对右边页面的分析,我们可以观察到我们需要抓取的页面内容在一个
在标签中:
既然找到了页面,也找到了需要爬取的内容的位置,那么现在我们需要解决一个问题:如何使用代码快速定位目标内容?
理想情况下,我们想要这个
tag有一个唯一的属性(通常是id或者class),那么我们可以直接通过这个属性来定位位置。
但不幸的是,在我们的目标标签中
在
,它没有属性,更不用说独特的属性了。由于直接访问的愿望已经落空,只能使用间接访问。
通常有两种间接方法:
至于哪个更好,我们会根据实际情况进行分析和选择。我们在这里演示了这两种方法。
第一种方式
我们基于
父标签div
标签有唯一的class属性articleContent来查找div标签,然后根据父子关系找到p标签,然后通过正则表达式过滤掉无用的内容,得到最终结果。
# -*- coding: utf-8 -*-
# @Author : 一凡
import requests
from bs4 import BeautifulSoup
# 正则模块
import re
# 爬取的网页
url = r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
response = requests.get(url)
response.encoding=None
result = response.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result, 'html.parser')
psg = bs.select('.articleContent > p')
title = bs.select('title')[0].text.split('_')[0]
txt = ''.join(str(x) for x in psg)
res = re.sub(r'', "", txt)
result = res.split("(1844年)")[0]
print('标题:', title)
print('原文:', result)
效果:
实现的代码主要分为两部分:第一部分是页面的抓取,如:
# 爬取的网页链接
url = r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
response = requests.get(url)
response .encoding=None
result = response .text
print(result)
这部分内容和我们在浏览器的开发者模式下看到的HTML源代码完全一样。
第二部分是页面分析。
我们之前介绍过,HTLML 页面本质上是一棵 DOM 树。我们用树遍历子节点来遍历HTML页面中的标签,如:
再次打包获取特定标签中的内容
bs = BeautifulSoup(result, 'html.parser')
psg = bs.select('.articleContent > p')
这里先将页面信息转换成xml格式的文档(注意:HTML文档是一种特殊类型的xml文档),然后根据css的语法找到p标签的内容。
第二种方式
我们原来的方式写的代码是这样的:
# 爬取的网页链接
url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
response = requests.get(url)
response .encoding=None
result = response .text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,'html.parser')
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data = bs.find_all('p')
# 循环打印输出
for tmp in data:
print(tmp)
print('********************')
然后我们检查输出结果,但与预期不符,是这样的:
获取的内容是分段的,收录了很多其他无用的信息。其实这些都是在实际爬取过程中常见的,并不是每一次爬取都一步到位,需要不断调试。
经过分析,我们可以用表达式过滤掉无用的信息,用字符串拼接函数拼接得到我们期望的内容。
最终代码如下:
# 爬取的网页链接
url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
response = requests.get(url)
response .encoding=None
result = r.text
# 再次封装,获取具体标签内的内容
bs = BeautifulSoup(result,'html.parser')
# 具体标签
print("---------解析后的数据---------------")
# print(bs.span)
a = {}
# 获取已爬取内容中的p签内容
data=bs.find_all('p')
result = ' '
# 循环打印输出
for tmp in data:
if '1844年' in tmp.text:
break
result+=tmp.text
print(result)
上面,我们已经说明了如何通过两种方式抓取一些简单的网页信息。当然,对于抓取到的内容,我们有时不仅需要输出,还可能需要存储。
通常的存储方式是文件和数据库的形式。我们稍后会详细介绍。
如果您想交流软件测试、接口测试、自动化测试、技术同行、持续集成和面试方面的经验。有兴趣的可以去893694563,群里会不定期分享测试数据。
如果文章对你有帮助,请联系发财,给我点个赞。感谢您的支持。您的点赞是我不断更新的动力。