爬虫获取一个网站内所有子页面的内容
要爬取一个网站的所有子页面内容,你可以使用Python中的requests和beautifulsoup4库。以下是一个简单的示例代码,用于爬取一个网站的所有子页面的标题和URL。
首先,确保安装了所需的库:
pip install requests
pip install beautifulsoup4
然后,使用以下代码作为爬虫的基本框架:
import requests
from bs4 import BeautifulSoup
import queue
# 初始化一个队列,用于存储待爬取的URL
url_queue = queue.Queue()
# 将起始URL放入队列
start_url = 'http://example.com'
url_queue.put(start_url)
# 初始化一个集合,用于存储已爬取的URL,避免重复爬取
crawled_urls = set()
def get_url_queue():
return url_queue
def get_crawled_urls():
return crawled_urls
def crawl_page(url):
"""
爬取单个页面的内容
"""
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
print(f'Failed to crawl {url}, status code: {response.status_code}')
except requests.exceptions.RequestException:
print(f'Failed to crawl {url}, an error occurred')
def create_sitemap(content):
"""
解析页面内容,提取子页面URL
"""
soup = BeautifulSoup(content, 'html.parser')
for link in soup.find_all('a'):
href = link.get('href')
if href and href not in crawled_urls and 'http' not in href:
# 构建完整的URL
full_url = '{}{}'.format(start_url, href) if href[0] == '/' else href
# 将新的URL放入队列
url_queue.put(full_url)
def main():
"""
主函数,控制爬虫的执行流程
"""
while not url_queue.empty() or len(crawled_urls) == 0:
if not url_queue.empty():
# 从队列中获取待爬取的URL
url = url_queue.get()
# 检查URL是否已被爬取
if url not in crawled_urls:
# 爬取页面内容
content = crawl_page(url)
if content:
# 解析页面内容,提取子页面URL
create_sitemap(content)
# 将当前爬取的URL加入已爬取的集合
crawled_urls.add(url)
print(f'Crawled: {url}')
# 为了避免无限循环,每次检查是否队列为空后,暂停一段时间
import time
time.sleep(5)
if __name__ == '__main__':
main()
请注意,这个代码示例仅用于学习目的,并且不包括错误处理和效率优化。实际应用中,你可能需要考虑并发请求、处理robots.txt、限制请求频率、使用用户代理、处理JavaScript渲染的内容等问题。此外,确保你了解并遵守网站的robots.txt
规则以及法律法规,不要进行滥用网站资源。
评论已关闭