首先明确一下,Python爬虫获取整个站点中的所有外部链接可以分为以下几个步骤:
- 请求目标站点的首页,获取html代码
- 解析html代码,找到所有外部链接
- 对于每一个外部链接,判断是否合法,是否已经被爬取过
- 如果链接合法且未爬取过,则继续爬取该链接,并重复步骤1-3
下面通过两个示例来详细讲解:
示例1: 使用python中的 requests 和 BeautifulSoup 库
首先需要安装 requests 和 BeautifulSoup 库,可以使用以下命令进行安装:
pip install requests
pip install beautifulsoup4
示例代码如下:
import requests
from bs4 import BeautifulSoup
import re
def get_links(url):
# 获取html代码
html = requests.get(url).text
# 解析html代码,找到所有外部链接
soup = BeautifulSoup(html, 'html.parser')
links = []
for link in soup.find_all('a'):
href = link.get('href')
if href is not None:
# 判断是否为外部链接,并去重
if 'http' in href and href not in links:
links.append(href)
return links
def crawl_site(url):
# 已经爬取过的链接
crawled = set()
# 待爬取链接队列
queue = [url]
while queue:
# 从队列中取出一个链接
link = queue.pop(0)
# 如果该链接已经爬取过,则跳过
if link in crawled:
continue
# 获取所有外部链接
links = get_links(link)
for l in links:
# 如果该链接合法并且未爬取过,则加入待爬取队列
if '//' in l:
l = re.sub(r'^(https?:)?//', 'http://', l)
if 'http' in l and url in l and l not in crawled:
queue.append(l)
# 将该链接标记为已爬取
crawled.add(link)
return crawled
在上述代码中,get_links()
函数用于获取某个链接的所有外部链接,crawl_site()
函数则是主函数,在其中使用队列实现了站点的全站爬取。
示例2: 使用 scrapy 爬虫框架
使用 scrapy 框架可以更加方便地实现站点的全站爬取,示例代码如下:
import scrapy
class Spider(scrapy.Spider):
# 定义爬虫名称,启动爬虫时需要使用该名称
name = 'spider'
# 定义起始链接
start_urls = ['http://www.example.com/']
def parse(self, response):
# 解析response,获取所有外部链接
for href in response.css('a::attr(href)'):
# 判断是否为外部链接
if 'http' in href.get() and self.allowed_domains[0] in href.get():
yield scrapy.Request(href.get(), callback=self.parse)
if __name__ == '__main__':
# 启动爬虫
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'ROBOTSTXT_OBEY': True,
'LOG_LEVEL': 'DEBUG',
'DOWNLOAD_DELAY': 0.5,
'RANDOMIZE_DOWNLOAD_DELAY': True,
})
process.crawl(Spider)
process.start()
在上述代码中,我们使用 scrapy 框架,定义了一个名为 Spider
的爬虫,并且指定了起始链接。在 parse()
函数中,使用 css 选择器解析 response,获取所有外部链接,并逐一进行爬取。最后在 __main__
中启动爬虫。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫获取整个站点中的所有外部链接代码示例 - Python技术站