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

news2024/9/28 9:33:58

程序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.text
    else:
        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 BeautifulSoup

class MySpider:
    def __init__(self, base_url):
        self.base_url = base_url
        self.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.text
        else:
            print(f"被禁止爬取:{url}")
            return None

    def parse(self, html):
        # 使用 BeautifulSoup 或其它工具解析 html
        soup = 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 urlparse

class SimpleCrawler:
    def __init__(self, base_url):
        self.base_url = base_url
        self.robot_parser = RobotFileParser()
        self.crawl_delay = 0
        self.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.text
        else:
            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 对不同爬虫的特定规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1485988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Material UI 5 学习01-按钮组件

Material UI 5 学习01-按钮组件 一、安装Material UI二、 组件1、Button组件1、基础按钮2、variant属性3、禁用按钮4、可跳转的按钮5、disableElevation属性6、按钮的点击事件onClick 2、Button按钮的颜色和尺寸1、Button按钮的颜色2、按钮自定义颜色3、Button按钮的尺寸 3、图…

Topaz Gigapixel AI:让每一张照片都焕发新生mac/win版

Topaz Gigapixel AI 是一款革命性的图像增强软件,它利用先进的人工智能技术,能够显著提升图像的分辨率和质量。无论是摄影爱好者还是专业摄影师,这款软件都能帮助他们将模糊的、低分辨率的照片转化为清晰、细腻的高分辨率图像。 Topaz Gigap…

每日五道java面试题之mysql数据库篇(三)

目录: 第一题. 百万级别或以上的数据如何删除?第二题. 前缀索引第三题. 什么是最左前缀原则?什么是最左匹配原则?第四题. B树和B树的区别第五题. 使用B树和B树好处 第一题. 百万级别或以上的数据如何删除? 关于索引:…

【微服务】微服务中常用认证加密方案总结

目录 一、前言 二、登录认证安全问题 3.1 认证方式选择 三、常用的加密方案 3.1 MD5加密算法 3.1.1 md5特点 3.1.2 md5原理 3.1.3 md5使用场景 3.2 AES加密算法 3.2.1 AES简介 3.2.2 AES加解原理 3.2.3 AES算法优缺点 3.2.4 AES算法使用场景 3.3 RSA加密算法 3.3…

【IDEA+通义灵码插件】实现属于你的大模型编程助手

目录 1.前言 2.下载安装 3.解释代码 4.生成单元测试 5.生成注释 6.智能补全 1.前言 大模型到底该以一种什么方式落地,从而嵌入我们的工作当中,助力我们工作效率的提升,其实最好的方式也许就是虚拟助手的方式,就像钢铁侠的&…

无极低码:无极低码部署版操作指南

无极低码 :https://wheart.cn 无极低码是一个面向开发者的工具,旨在为开发者、创业者或研发企业,提供快速,高效,标准化,可定制,私有化部署的平台,在兼顾开发速度的同时,兼…

ChemDraw Pro 2022:呈现专业化学绘图的极 致之作 mac/win版

PerkinElmer ChemDraw Pro 2022是一款功能强大的化学绘图软件,专为化学家、科研工作者和教育者设计。这款软件凭借其卓越的性能和丰富的功能,已经成为化学绘图领域的领导者。 PerkinElmer ChemDraw Pro 2022软件获取 ChemDraw Pro 2022提供了广泛的化学…

可重入锁-隐式锁与显式锁

可重入锁 隐式锁(即synchronized关键字使用的锁),默认是可重入锁 在一个synchronized修饰的方法或者代码块的内部调用本类的其他synchronized修饰的方法或者代码块时,是永远可以得到锁。 显式锁(即Lock)也…

【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolov8目标检测|含源码

一、前言 部署yolo项目,是我这几个月以来做的事情,最近打算把这几个月试过的方法,踩过的坑,以博客的形式,分享一下。关于下面动态中讲到的如何用opencv部署,我在上一篇博客中已经详细讲到了:【…

【C++】const成员

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. const成员3. 取地址及const取地址操作符重载 1. 前言 在之前已经已经分享过了关于 【C】类和对象之常引用与运算符重载,这次分享的有关const的内容,话不多说,正文开始。…

Mybatis 框架 基础语法

Mybtais 中文网站 Maven 仓库 考点: SQL 注入 #{}最终生成预编译sql,预编译Sql语句中?替换#{}内容 一个#{} 替换一个? 在模糊查询时要使用 , ′ {},% ,′{}%’ ,因为?不能出现在‘’中&…

2024最新算法:鹦鹉优化算法(Parrot optimizer,PO)求解23个基准函数

一、鹦鹉优化算法 鹦鹉优化算法(Parrot optimizer,PO)由Junbo Lian等人于2024年提出的一种高效的元启发式算法,该算法从驯养的鹦鹉中观察到的觅食、停留、交流和对陌生人行为的恐惧中汲取灵感。这些行为被封装在四个不同的公式中…

2024年自动化测试五大趋势

目录 2024年QA自动化趋势:塑造软件开发的未来 1.自动化测试中的AI和ML集成 2.DevOps中的持续测试 3.无代码自动化工具的使用 4.更加重视安全测试 5.定制化测试解决方案 有效实施2024年QA自动化趋势 1.集成AI和ML实现更智能的测试 2.在敏捷和DevOps文化中嵌入…

5.STL源码解析-算法、仿函数、适配器

算法 STL算法总览 仿函数与适配器 C标准模板库(STL)是C程序员的得力工具,提供了许多强大而高效的数据结构和算法。在STL中,仿函数(Functor)和适配器(Adapter)是两个重要的概念…

windows上elasticsearch的ik分词器的安装

下载 下载地址 在elasticsearch下的plugins文件夹下创建ik的文件夹 下载的ik压缩包解压到plugins/ik 重启elasticsearch 验证 http://ip:9200/_cat/plugins

OSCP靶场--Squid

OSCP靶场–Squid 考点(1.squid代理绕过 2.phpmyadmin写webshell 3.受限服务账户【LOCAL SERVICE或NETWORK SERVICE】恢复特权 4.SeImpersonatePrivilege提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.188.189 --min-rate 2000 Starti…

05-Linux部署MySQL

Linux部署MySQL 在今后的使用过程中,需要频繁使用Linux系统,所以在Linux上安装软是必不可少的操作 。 前置要求 需要学习前四章知识,初识Linux、Linux基础命令、Linux权限管理、Linux高阶技巧这4个章节。需要开启多态虚拟机,电…

LeetCode 热题 100 | 图论(三)

目录 1 前缀树 1.1 什么是前缀树 1.2 如何构建前缀树 2 208. 实现 Trie(前缀树) 菜鸟做题,语言是 C 1 前缀树 1.1 什么是前缀树 前缀树,也被称作字典树(Trie)或者键树,是一种用于检…

顶会ICLR2024论文Time-LLM:基于大语言模型的时间序列预测

文青松 松鼠AI首席科学家、AI研究院负责人 美国佐治亚理工学院(Georgia Tech)电子与计算机工程博士,人工智能、决策智能和信号处理方向专家,在松鼠AI、阿里、Marvell等公司超10年的技术和管理经验,近100篇文章发表在人工智能相关的顶会与顶刊…

实战:Oracle Weblogic 11g配置无密码启动,启动关闭脚本,修改节点内存

导读 上篇博文介绍了Oracle Weblogic 11g的安装部署,本文介绍Weblogic安装后的基本配置 包括:设置weblogic启动关闭的无密码验证,启动关闭脚本,修改默认的节点内存。 1、配置无密码启动 [weblogicw1 base_domain]$ cd servers/ […