目标
https://opendev.org/openstack/neutron 是Openstack 中的一个网络组件项目,这次示例目标是爬取这个项目中所有文件的URL,有了URL再去检索内容,简单的就只剩下写写正则啦。
页面分析
用元素选择器定到目标位置,通过观察发现整个目标内容都包裹在
标签中。内容分为两种元素:文件和目录,它们都被包裹在标签中。其中文件的标签中包含了 标签,目录的标签中包含了 标签。如下表:爷爷标签
父标签
子标签
tbody
-
-
文件是末梢,目录下包含了目录和文件。点击文件超链接能进入内容呈现页面。点击目录的链接进入到它所包含内容的呈现页面。因此我们只需要一层层不断进入目录中,拿到该目录所包含的所有文件的URL,即算是完成目标。
tbody
爬取思路
我们把爬取的目标抽象成树型结构,先假设这是一颗无环的生成树,不对爬到的URL进行重复检测。因此只需要借助队列,对树进行层次遍历即可。
目录树
工具
爬网页用的两库已经很熟悉了,除此之外我还需要用到python自带的队列库queue。我要用到 queue.Queue() 类中提供了三个方法,入队put()、出队get()和判队空empty()。get()如果在空队列上操作,会一直阻塞等待新元素入队。
from bs4 import BeautifulSoup
import requests
from queue import Queue
我准备设置两个队列,一个是用于暂存URL的cache,一个用于输出爬取成果的result。
处理流程如下:
处理流程
先来看看伪码的实现
def 爬取(url):
html = 访问(url)
<