【python】遵守 robots.txt 规则的数据爬虫程序

2024-03-03 07:20

本文主要是介绍【python】遵守 robots.txt 规则的数据爬虫程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序1

编写一个遵守 robots.txt 规则的数据爬虫程序涉及到多个步骤,包括请求网页、解析 robots.txt 文件、扫描网页内容、存储数据以及处理异常。由于编程语言众多,且每种语言编写爬虫程序的方式可能有所不同,以下将使用 Python 语言举例,提供一个简化的流程。

注意:以下代码只是一个示例,并不是一个完备的、可直接运行的程序。此外,实际应用中还需要处理网络错误、限速遵循礼貌原则,以及可能的存储问题等等。

import requests
from urllib.robotparser import RobotFileParser
from bs4 import BeautifulSoup# 初始化robots.txt解析器
def init_robot_parser(url):rp = RobotFileParser()rp.set_url(url + "/robots.txt")rp.read()return rp# 爬取页面
def crawl_page(url, user_agent='MyBot'):rp = init_robot_parser(url)if rp.can_fetch(user_agent, url):headers = {'User-Agent': user_agent}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textelse:print(f"爬取被禁止在: {url}")return None# 解析页面,提取数据
def extract_data(html):soup = BeautifulSoup(html, 'html.parser')# 这里根据实际需要定制提取数据的代码# 例子: 提取所有的a标签for link in soup.find_all('a'):href = link.get('href')print(href)# 应该将提取的数据存储到数据库或文件系统等# 主函数
def main():url = 'http://example.com'  # 目标网站user_agent = 'MyBot'  # 爬虫名称html = crawl_page(url, user_agent)if html:extract_data(html)if __name__ == "__main__":main()

程序2

编写遵守`robots.txt`规则的数据爬虫需要遵循几个关键步骤。以下是一个遵守`robots.txt`规则的Python数据爬虫的示例:
1. 解析`robots.txt`:使用`urllib.robotparser`模块来解析目标网站的`robots.txt`文件,并确定哪些页面是可爬取的。
2. 请求数据:使用如`requests`的库发起网络请求,获取网页内容。
3. 分析内容:利用如`BeautifulSoup`的库分析网页内容,提取所需数据。
4. 遵循爬虫规则:确保在爬取时尊重`robots.txt`文件中的`Crawl-delay`指令,并且不爬取`Disallow`中指定的页面。
下面是精简版的代码实现:

import requests
from urllib.robotparser import RobotFileParser
from time import sleep
from bs4 import BeautifulSoupclass MySpider:def __init__(self, base_url):self.base_url = base_urlself.robots_url = base_url + "/robots.txt"self.robot_parser = RobotFileParser()def fetch_robots_txt(self):response = requests.get(self.robots_url)# 假定robots.txt存在,若不存在需要额外处理self.robot_parser.parse(response.text.splitlines())def crawl(self, path):url = self.base_url + path# 检查是否允许爬取if self.robot_parser.can_fetch("*", url):crawl_delay = self.robot_parser.crawl_delay("*")if crawl_delay:sleep(crawl_delay)  # 根据 Crawl-delay 设置等待response = requests.get(url)if response.status_code == 200:return response.textelse:print(f"被禁止爬取:{url}")return Nonedef parse(self, html):# 使用 BeautifulSoup 或其它工具解析 htmlsoup = BeautifulSoup(html, 'html.parser')# 这里进行具体的解析任务# ...base_url = "https://example.com"  # 假设这是您要爬取的网站的根URL
spider = MySpider(base_url)# 获取并解析robots.txt
spider.fetch_robots_txt()# 爬取网站中的特定路径
path_to_crawl = "/some-page"  # 你要爬取的页面路径
html_content = spider.crawl(path_to_crawl)if html_content:# 解析获取的网页内容spider.parse(html_content)

注意,上述代码是一个基础示例。在实际应用中,还需要考虑一些其他因素:
- 异常处理:网络请求和内容解析时可能会出现异常。
- 日志记录:记录爬虫的行为,方便追踪问题和调试。
- 遵守法律法规:不同国家和地区对网络爬虫有不同的法律要求,在编写和运行爬虫之前,应当了解并遵守当地的法律。
- 更复杂的URL规则和爬取策略:需要更精细化地处理 URL 规则,并设计合理的爬取策略来避免服务器的压力。

程序3

创建一个遵守 robots.txt 规则的数据爬虫的示例程序相当复杂,因为它需要考虑多个方面,包括解析 robots.txt 规则、避开禁止访问的路径、遵守爬取时间间隔(Crawl-delay)等。
以下是一个简化的 Python 程序,展示了如何使用 urllib.robotparser 库读取和解析 robots.txt 文件,以及如何使用 requests 库实现基本的网页爬取功能。注意,此示例仅作为演示之用,并不是一个完整功能的爬虫。
首先,安装 requests 库,如果 Python 环境尚未安装它的话:

pip install requests

接下来是示例程序:

import requests
from urllib.robotparser import RobotFileParser
from urllib.parse import urlparseclass SimpleCrawler:def __init__(self, base_url):self.base_url = base_urlself.robot_parser = RobotFileParser()self.crawl_delay = 0self.parse_robots_txt()def parse_robots_txt(self):robot_url = urlparse(self.base_url)robot_url = f"{robot_url.scheme}://{robot_url.netloc}/robots.txt"self.robot_parser.set_url(robot_url)self.robot_parser.read()self.crawl_delay = self.robot_parser.crawl_delay("*")def can_fetch(self, url):return self.robot_parser.can_fetch("*", url)def fetch_page(self, url):if self.can_fetch(url):response = requests.get(url)if response.status_code == 200:return response.textelse:print(f"Access denied by robots.txt: {url}")return None# 注意此方法可能不遵守 Crawl-delay,视乎 `requests` 的具体实现和网络条件。def fetch_pages(self, urls):for url in urls:page_content = self.fetch_page(url)if page_content:print(f"Fetched URL: {url[:60]}...")  # 打印URL的前60个字符else:print(f"Failed to fetch URL: {url[:60]}...")# 遵守robots.txt的Crawl-delay设置等待相应时间if self.crawl_delay:time.sleep(self.crawl_delay)# 使用示例
if __name__ == "__main__":# 确保这个 URL 是你有权限爬取的base_url = "http://example.com"crawler = SimpleCrawler(base_url)url_list = ["http://example.com/page1","http://example.com/page2",# 添加更多你希望爬取的页面]crawler.fetch_pages(url_list)

此代码定义了一个 SimpleCrawler 类,初始化时给它一个基础 URL。它将尝试读取此网站的 robots.txt,并解析其中的规则。`can_fetch` 方法用来判断是否允许抓取指定的 URL。`fetch_page` 方法负责实际的抓取工作,并遵守 robots.txt 中的 Disallow 规则。`fetch_pages` 方法是一个遍历 URL 列表并依次抓取每个页面的高层次封装。
请注意,在使用此代码时,应确保:
1. 遵守目标网站的 robots.txt 规则。
2. 尊重 Crawl-delay 提示,此代码示例仅在遍历 URL 列表时等待指定时间,而不是在连续请求之间等待。
3. 在实际部署到爬虫程序之前,需要进行全面的测试和额外的错误处理工作。
以上只是一个基础示例,真实环境中的爬虫还需要考虑 IP 被封禁、各种 HTTP 状态码处理、异常处理、日志记录、爬取速率控制等更多复杂情况。此外,为了完整遵守 robots.txt,爬虫还需要处理 Sitemap 和 Allow 指令,以及 User-agent 和 Crawl-delay 对不同爬虫的特定规则。

这篇关于【python】遵守 robots.txt 规则的数据爬虫程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768897

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(