python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)

优采云 发布时间: 2021-09-11 12:06

  python抓取动态网页(【干货】如何使用代码快速的进行目标内容的位置定位)

  先试试爬虫

  前言

  通过前几章的介绍,我们对什么是爬虫有了初步的了解,同时对如何抓取网页有了一个大致的了解。从本章开始,我们将从理论走向实践,结合实际操作进一步加深理解。

  因为使用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,群里会不定期分享测试数据。

  如果文章对你有帮助,请联系发财,给我点个赞。感谢您的支持。您的点赞是我不断更新的动力。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线