当前位置: 首页 > news >正文

【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 对不同爬虫的特定规则。

相关文章:

  • 汽车虚拟仿真技术的实现、应用和未来
  • PDF标准详解(二)——PDF 对象
  • 2024.3.2 训练记录(6)
  • 排序刷题12 -双向排序
  • Redis之一: 简介及环境安装搭建
  • CNN-LSTM-Attention混合神经网络归时序预测的MATLAB实现(源代码)
  • ESP-VO 论文阅读
  • Fastjson2 <== 2.0.26反序列漏洞
  • redis 为什么会阻塞
  • 二刷代码随想录算法训练营第七天 |454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • Python 编辑工具 Jupyter notebook
  • PTA天梯 L1-087 机工士姆斯塔迪奥
  • SQL中把datetime 转为字符串
  • 多模态论文阅读--V*指导视觉搜索成为多模态大语言模型的核心机制
  • Java 石头剪刀布小游戏
  • [Vue CLI 3] 配置解析之 css.extract
  • 77. Combinations
  • es6(二):字符串的扩展
  • gcc介绍及安装
  • github从入门到放弃(1)
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java比较器对数组,集合排序
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • mysql 5.6 原生Online DDL解析
  • storm drpc实例
  • 回顾 Swift 多平台移植进度 #2
  • 聊聊redis的数据结构的应用
  • 普通函数和构造函数的区别
  • 前端技术周刊 2019-02-11 Serverless
  • 前端之React实战:创建跨平台的项目架构
  • 深入浅出Node.js
  • kubernetes资源对象--ingress
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #前后端分离# 头条发布系统
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (转)德国人的记事本
  • .net core 6 集成和使用 mongodb
  • .NET 中让 Task 支持带超时的异步等待
  • .net6+aspose.words导出word并转pdf
  • .net程序集学习心得
  • .Net中的集合
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @RunWith注解作用
  • []指针
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [android] 请求码和结果码的作用
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [CakePHP] 在Controller中使用Helper
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用