php网页抓取工具(如何查看网页的一个问题?(一)_光明网)
优采云 发布时间: 2022-02-11 09:32php网页抓取工具(如何查看网页的一个问题?(一)_光明网)
通过前面几章的介绍,我们对什么是爬虫有了初步的了解,同时对如何爬取网页有了大致的了解。从本章开始,我们将从理论走向实践,结合实际操作进一步加深理解。
由于使用python爬取页面的工具有很多,例如requests、scrapy、PhantomJS、Splash等,而且解析爬取页面的工具也很多。我们这里从最简单的开始,使用 requests 库和 beautifSoup 工具进行静态页面爬取和解析。
基础功扎实后,我们可以使用更灵活的工具,不仅可以静态爬取,还可以动态爬取;不仅可以爬取单页,还可以递归深度爬取。同时,结合其他渲染、存储、机器学习等工具,我们可以对数据进行处理、加工、建模和展示。
废话不多说,开始今天的例子,抓起安徒生童话中著名的“丑小鸭”。“要想把工作做好,就必须先利好自己的工具。” 在开始之前,我们需要做一些准备工作,下载pycharm,安装requests库和beautifSoup。安装结果如下:
启动爬虫的第一步是找到童话故事“丑小鸭”的链接。我们在这里使用的链接是:. ![在此处插入图像描述]()
找到我们的目标链接后,第二步就是分析网页。分析什么?当然是分析我们要爬取的内容在哪里。
根据我们之前的介绍,我们这次爬虫的目的是爬取丑小鸭的文字。带着这个目标,我们首先要研究网页的构成。那么如何查看网页呢?一般是在浏览器的开发者模式下完成。对于chrome浏览器,我们可以使用快捷键F12来查看,如图:
左边是网页显示的内容,右边是网页的HTML文档。
通过对右侧页面的分析,我们可以观察到我们需要爬取的页面内容在一个
在标签中:
既然找到了页面,也找到了要爬取的内容的位置,那么我们现在需要解决的一个问题是:如何使用代码快速定位到目标内容?
理想情况下,我们希望这样
标签有一个唯一的属性(通常是id或者class),那么我们可以通过这个属性直接定位到位置。
但不幸的是,在我们的目标标签中
,它没有属性,更不用说独特的属性了。现在直接访问的愿望已经被打败,只能使用间接访问。
通常有两种间接方法:第一种是找到与其相邻的可以快速定位的标签,然后根据两个标签之间的位置关系进行间接访问。在这个操作中,我们很容易发现
标签的父标签div有唯一的类属性articleContent;第二种方法是将所有
找出所有的标签,然后用一个一个的遍历找到目标的标签。事实上,在实际的爬取过程中,这两种方法都会用到。
至于哪个更好,我们将根据实际情况进行分析选择。在这里,我们展示了两种方式。
第一种方式:
我们基于
标签的父标签div有唯一的类属性articleContent找到div标签,然后根据父子关系找到p标签,再通过正则表达式过滤无用的内容,得到最终结果。
1`
1# 请求库
2import requests
3# 解析库
4from bs4 import BeautifulSoup
5import re
6# 爬取的网页链接
7url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
8r= requests.get(url)
9r.encoding=None
10result = r.text
11# 再次封装,获取具体标签内的内容
12bs = BeautifulSoup(result, 'lxml')
13psg = bs.select('.articleContent > p')
14title = bs.select('title')[0].text.split('_')[0]
15# print(title)
16txt = ''.join(str(x) for x in psg)
17res = re.sub(r'', "", txt)
18result=res.split("(1844年)")[0]
19print('标题:',title)
20print('原文内容:',result)
21
22
最后结果:
实现的代码主要分为两部分:第一部分是页面的爬取,如:
1`
1# 爬取的网页链接
2url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
3r= requests.get(url)
4r.encoding=None
5result = r.text
6print(result)
7
8
这部分内容和我们之前在浏览器的开发者模式中看到的HTML源代码完全一样。
第二部分是页面的解析。
我们之前介绍过,HTLML 页面本质上是一棵 DOM 树。我们通过遍历树的子节点来遍历HTML页面中的标签,如:
1# 再次封装,获取具体标签内的内容
2bs = BeautifulSoup(result, 'lxml')
3psg = bs.select('.articleContent > p')
4
5
这里首先将页面信息转换成xml格式的文档(注意:HTML文档是一种特殊类型的xml文档),然后根据CSS语法找到p标签的内容。
第二种方式:
我们原来的方式写的代码是这样的:
1# 请求库
2import requests
3# 解析库
4from bs4 import BeautifulSoup
5
6# 爬取的网页链接
7url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
8r= requests.get(url)
9r.encoding=None
10result = r.text
11# 再次封装,获取具体标签内的内容
12bs = BeautifulSoup(result,'html.parser')
13# 具体标签
14print("---------解析后的数据---------------")
15# print(bs.span)
16a={}
17# 获取已爬取内容中的p签内容
18data=bs.find_all('p')
19# 循环打印输出
20for tmp in data:
21 print(tmp)
22 print('********************')
23
24
然后我们看输出结果和预期的不一样,是这样的:
获取的内容被分割并与许多其他无用的信息混合。其实这些在实际爬取过程中都是常见的。并非每次爬取都是一步完成的,并且需要不断调试。
经过分析,我们可以使用表达式过滤无用信息,并使用字符串拼接函数进行拼接,得到我们期望的结果。
最终代码如下:
1# 请求库
2import requests
3# 解析库
4from bs4 import BeautifulSoup
5
6# 爬取的网页链接
7url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
8r= requests.get(url)
9r.encoding=None
10result = r.text
11# 再次封装,获取具体标签内的内容
12bs = BeautifulSoup(result,'html.parser')
13# 具体标签
14print("---------解析后的数据---------------")
15# print(bs.span)
16a={}
17# 获取已爬取内容中的p签内容
18data=bs.find_all('p')
19result=''
20# 循环打印输出
21for tmp in data:
22 if '1844年' in tmp.text:
23 break
24 result+=tmp.text
25
26print(result)
27
28
上面我们已经说明了如何通过两种方式抓取一些简单的网页信息。当然,对于爬取的内容,我们有时不仅输出,还可能需要存储。
通常,存储方式是文件和数据库的形式。我们稍后会详细介绍这些内容。
其实作为一个编程学习者,有一个学习氛围和一个交流圈是很重要的。学习资料,面试技巧,大厂面试题,升职加薪指日可待。希望大家可以在Q2956807116和我交流,或者加入Q群313782132,无论是新手还是大佬,都欢迎。让我们一起交流,一起成长。