Python爬虫系列-让爬虫自己写爬虫(半自动化,代替人工写爬虫)

        现在的PC、手机客户端等终端设备大量使用了网页前后端技术,另外主流的网站也会经常会更新,导致以前一个月更新一次爬虫代码,变成了天天需要更新代码,所以自动化爬虫技术在当前就显得特别重要,最近我也是在多次更新某个爬虫后,突然有了这样的需求,尝试搜索了下相关信息,发现是有人弄过这东西,我想哪些大厂肯定也有爬虫工程师开发过这东西,但是都没有开源,找不到啥资料,所以我想写一篇这方面的东西,感兴趣的朋友可以看下去。

        首先,我们先确定下基本思路,我经常使用Requests+BeautifulSoup写爬虫,所以基本代码的模板很好写,如下:

code_template = """
import requests
from bs4 import BeautifulSoup

def crawl(url):
    response = requests.get(url)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')
    
    results = []
    SELECTORS_PLACEHOLDER
    
    return results

if __name__ == "__main__":
    url = "URL_PLACEHOLDER"
    results = crawl(url)
    for result in results:
        print(result)
    """

其中SELECTORS_PLACEHOLDER就是我们需要用程序动态填写的内容,这是根据爬虫自我填写的代码,输入的代码如下所示:
 那么我们跟这个程序根据什么爬虫那,其实也很简单,我们使用上一篇文章的例子,链接如下为:
Python爬虫系列-爬取小说20240703更新(Request方法)icon-default.png?t=N7T8https://blog.csdn.net/donglxd/article/details/140145498

我们先试试爬取某个章节部分,随便打开一篇文章,如下图:

选取一行字,比如正文的第一句:"京海市第四高中,新生报到日。" 把这句作为一个参数代入到我的程序中,同时把这篇文章的网址也代入到我的程序中如下:

把运行后的自动写的代码如下:

复制后新建一个python文件,粘贴进去,保存并运行,就会得到如下结果:

 

有人要问了,我的自动生成爬虫,只能爬取文本吗?不能爬取属性值吗?比如属性里的链接?当然可以,请看下图:

可以看到第一章的链接是"41594870.html",这个不是绝对链接,而是相对链接,需要拼接处理,这个很简单,我想稍微学过5分钟python字符串语法的都会。我们把这个"41594870.html"属性代入我的程序读取看看,参数设置如下:

生成的爬虫如下:
新建一个python文档运行看看:

可以看到爬取成功了,我们可以尝试把两者结合起来,写一个手动爬虫,如下:

import requests
from bs4 import BeautifulSoup
import time# 导入time库加延迟用

# def crawl(url):
def getText(url):#把crawl函数建立一个新名称,方便调用,这个函数和下面的函数名不同,已区分开功能(读取每章内容)
    response = requests.get(url)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')

    # results = []
    results = ""#把数组改成字符串拼接用
    elements = soup.select('html body #main .bookinfo.m10.clearfix .chaptercontent #content p')
    for element in elements:
        # results.append(element.get_text(strip=True))
        results = results + element.get_text(strip=True) + "\n"
    results = results + "\n"#每章之间空一行
    return results

# def crawl(url):
def getUrl(url):#把crawl函数建立一个新名称,方便调用,这个函数和下面的函数名不同,已区分开功能(读取每章网址)
    response = requests.get(url)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')

    # results = []
    elements = soup.select('html body #main .chapterlist .clearfix li a')
    with open("20.AI编程爬虫\\1.txt","a+",encoding="utf-8") as f:# 创建一个新的txt文档,记录小说内容。
        for element in elements:
            # results.append(element.get('href', 'N/A'))
            results = getText(url + "/" + element.get('href', 'N/A'))# 把主链接和href的相对链接拼合
            f.write(results)#写入每章内容到txt文档
            print("链接内容:" + url + "/" + element.get('href', 'N/A') + "写入成功!")#输出写入的链接
            time.sleep(3)#为了爬取稳定加点延迟
    # return results

if __name__ == "__main__":
    url = "https://www.feibzw.com/Html/51366"
    # results = getUrl(url)
    getUrl(url)
    
    # for result in results:
    #     print(result)

可以看到上面的代码中,我注释的代码都是原来两个爬虫里的,新加的代码都有注释说明,一行行写下来不难,这部分其实也可以自动化,但是可能每个网站的链接地址都不同,拼接方法也不同,所以我写了这个模板给大家套用,按实际情况改就行了,这个模板可以应付大多数小说网站。我在这只是教大家方法,希望有抛砖引玉的作用,授人以渔。

最后放上我的自动生成程序,免费提供给大家:

import requests
from bs4 import BeautifulSoup

def find_elements_by_text_or_attribute(url, text):
    # 发送请求并获取网页内容
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
    html_content = response.text

    # 解析网页内容
    soup = BeautifulSoup(html_content, 'html.parser')

    # 查找所有包含目标文本的标签
    target_tags = set()
    for tag in soup.find_all(string=True):
        if text in tag:
            parent = tag.parent
            target_tags.add(parent)

    # 查找所有包含目标属性值的标签
    for tag in soup.find_all(True):  # True表示查找所有标签
        for attr, value in tag.attrs.items():
            if isinstance(value, list):
                value = ' '.join(value)
            if text in value:
                target_tags.add(tag)
                break

    return target_tags

def get_unique_selectors(target_tags):
    unique_selectors = set()
    for tag in target_tags:
        selectors = []
        for parent in tag.parents:
            if parent.name == '[document]':
                break
            if parent.get('id'):
                selectors.append(f"#{parent.get('id')}")
            elif parent.get('class'):
                selectors.append(f".{'.'.join(parent.get('class'))}")
            else:
                selectors.append(parent.name)
        selectors.reverse()
        selectors.append(tag.name)
        unique_selector = ' '.join(selectors)
        unique_selectors.add(unique_selector)

    return unique_selectors

def generate_crawler_code(url, selectors, is_attribute, attribute=None):
    code_template = """
import requests
from bs4 import BeautifulSoup

def crawl(url):
    response = requests.get(url)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')
    
    results = []
    SELECTORS_PLACEHOLDER
    
    return results

if __name__ == "__main__":
    url = "URL_PLACEHOLDER"
    results = crawl(url)
    for result in results:
        print(result)
    """

    selectors_code = ""
    for selector in selectors:
        selectors_code += f"elements = soup.select('{selector}')\n"
        selectors_code += f"    for element in elements:\n"
        if is_attribute:
            selectors_code += f"        results.append(element.get('{attribute}', 'N/A'))\n"  # 这里的N/A表示如果属性不存在返回默认值
        else:
            selectors_code += f"        results.append(element.get_text(strip=True))\n"

    final_code = code_template.replace("URL_PLACEHOLDER", url).replace("SELECTORS_PLACEHOLDER", selectors_code)
    return final_code

def crawl_generator(url, text):
    target_tags = find_elements_by_text_or_attribute(url, text)
    if target_tags:
        unique_selectors = get_unique_selectors(target_tags)
        attribute = None
        is_attribute = False

        # 检查是文本内容还是属性值
        for tag in target_tags:
            for attr, value in tag.attrs.items():
                if isinstance(value, list):
                    value = ' '.join(value)
                if text in value:
                    is_attribute = True
                    attribute = attr
                    break
            if is_attribute:
                break

        crawler_code = generate_crawler_code(url, unique_selectors, is_attribute, attribute)
        return crawler_code
    else:
        return "未找到包含目标文本或属性的元素。"

if __name__ == "__main__":
    url = "https://www.feibzw.com/Html/51366"  # 替换为目标网址
    text = "41594870.html"  # 替换为目标文本
    # url = "https://www.feibzw.com/Html/51366/41594870.html"  # 替换为目标网址
    # text = '''京海市第四高中,新生报到日。'''  # 替换为目标文本

    crawler_code = crawl_generator(url, text)
    print(crawler_code)

谢谢大家观看,再见! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {int n nums.length;Map<Long, Long> map new HashMap<Long, Long>();long w (long) t 1;for (int i 0; i < n; i) {long i…

【Java探索之旅】初识多态_概念_实现条件

文章目录 &#x1f4d1;前言一、多态1.1 概念1.2 多态的实现条件 &#x1f324;️全篇总结 &#x1f4d1;前言 多态作为面向对象编程中的重要概念&#xff0c;为我们提供了一种灵活而强大的编程方式。通过多态&#xff0c;同一种操作可以应用于不同的对象&#xff0c;并根据对象…

【Python迭代器探秘】:揭秘迭代器与生成器的魔法,掌握高效循环的艺术

文章目录 一、迭代器的基本概念1.1 迭代器优点1.2 迭代器的编写方法1.3 python内置迭代器函数1.4 小结1.5 迭代器对象与迭代对象1.5.1 区别1. 迭代对象2. 迭代器对象3. 小结 1.5.2 方法区分 二、生成器基本概念1. 生成器函数2. 生成器表达式 一、迭代器的基本概念 迭代器是Pyt…

一.2.(2)基本共射放大电路组成、工作原理;

1.基本共射放大电路组成 共什么取决于输入输出&#xff0c;共剩下的那一极 2.工作原理 输入信号ui通过电容C1加到三极管的基 极&#xff0c;引起基极电流iB的变化&#xff0c;iB的变化又使集电极电流ic发生变 化&#xff0c;且ic的变化量是iB变化量的β倍。由于有集电极电压&…

【数据结构】05.双向链表

一、双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这里“放哨的”。 “哨兵位”存在的意义&#xff1a;遍历循…

Django QuerySet对象,filter()方法

filter()方法 用于实现数据过滤功能&#xff0c;相当于sql语句中的where子句。 filter(字段名__exact10) 或 filter(字段名10)类似sql 中的 10 filter(字段名__gt10) 类似SQL中的 >10 filter(price__lt29.99) 类似sql中的 <29.99 filter(字段名__gte10, 字段名__lte20…

LightGlue: Local Feature Matching at Light Speed【文献阅读】

论文&#xff1a;LightGlue: Local Feature Matching at Light Speed 代码&#xff1a;https://github.com/cvg/LightGlue 作者&#xff1a;1 ETH Zurich__2 Microsoft Mixed Reality & AI Lab Abstract 提出的LightGlue是一个深度神经网络用于学习图像间的局部特征匹配。…

基于AOP的数据字典实现:实现前端下拉框的可配置更新

作者&#xff1a;后端小肥肠 创作不易&#xff0c;未经允许严禁转载。 目录 1. 前言 2. 数据字典 2.1. 数据字典简介 2.2. 数据字典如何管理各模块的下拉框 3. 数据字典核心内容解读 3.1. 表结构 3.2. 核心代码 3.2.1. 根据实体类名称获取下属数据字典 3.2.2. 数据字…

python库(6):Pygments库

1 Pygments介绍 在软件开发和文档编写中&#xff0c;代码的可读性是至关重要的一环。无论是在博客文章、技术文档还是教程中&#xff0c;通过代码高亮可以使程序代码更加清晰和易于理解。而在Python世界中&#xff0c;Pygments库就是这样一个强大的工具&#xff0c;它能够将各…

【YOLOv9教程】如何使用YOLOv9进行图像与视频检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【论文阅读】AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising

论文&#xff1a;2406.06911 (arxiv.org) 代码&#xff1a;czg1225/AsyncDiff: Official implementation of "AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising" (github.com) 简介 异步去噪并行化扩散模型。提出了一种新的扩散模型分布式加…

python脚本“文档”撰写——“诱骗”ai撰写“火火的动态”python“自动”脚本文档

“火火的动态”python“自动”脚本文档&#xff0c;又从ai学习搭子那儿“套”来&#xff0c;可谓良心质量&#x1f44d;&#x1f44d;。 (笔记模板由python脚本于2024年07月07日 15:15:33创建&#xff0c;本篇笔记适合喜欢钻研python和页面源码的coder翻阅) 【学习的细节是欢悦…

001uboot体验

1.uboot的作用&#xff1a; 上电->uboot启动->关闭看门狗、初始化时钟、sdram、uart等外设->把内核文件从flash读取到SDRAM->引导内核启动->挂载根文件系统->启动根文件系统的应用程序 2.uboot编译 uboot是一个通用的裸机程序&#xff0c;为了适应各种芯片&…

盘点8款国内顶尖局域网监控软件(2024年国产局域网监控软件排名)

局域网监控软件对于企业网络管理至关重要&#xff0c;它们可以帮助IT部门维护网络安全&#xff0c;优化网络性能&#xff0c;同时监控和控制内部员工的网络使用行为。以下是八款备受推崇的局域网监控软件&#xff0c;每一款都有其独特的优势和适用场景。 1.安企神软件 试用版领…

【数据结构】(C语言):二叉搜索树(不使用递归)

二叉搜索树&#xff1a; 非线性的&#xff0c;树是层级结构。基本单位是节点&#xff0c;每个节点最多2个子节点。有序。每个节点&#xff0c;其左子节点都比它小&#xff0c;其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。 …

Report Design Analysis报告之logic level详解

目录 一、前言 二、Logic Level distribution 2.1 logic level配置 2.2 Logic Level Distribution报告 2.3 Logic Level 报告详情查看 2.4 Route Distributions 报告详情查看 2.5 示例代码 一、前言 ​在工程设计中&#xff0c;如果需要了解路径的逻辑级数&#xff0c;可…

赚钱小思路,送给没有背景的辛辛苦苦努力的我们!

我是一个没有背景的普通人&#xff0c;主要靠勤奋和一股钻劲&#xff0c;这十几年来我的日常作息铁打不变&#xff0c;除了睡觉&#xff0c;不是在搞钱&#xff0c;就是在琢磨怎么搞钱。 ​ 可以说打拼了十几年&#xff0c;各种小生意都做过&#xff0c;以前一直是很乐观的&…

绘唐3最新版本哪里下载

绘唐3最新版本哪里下载 绘唐最新版本下载地址 推文视频创作设计是一种通过视频和文字的形式来进行推广的方式&#xff0c;可以通过一些专业的工具来进行制作。 以下是一些常用的小说推文视频创作设计工具&#xff1a; 视频剪辑软件&#xff1a;如Adobe Premiere Pro、Fina…

人工智能系列-Pandas基础

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Pandas简介 Pandas是Python语言的拓展程序库&#xff0c;用于数据分析。 Pandas是一个开放源码&#xff0c;BSD许可的库&#xff0c;提供高性能&#xff0c;易于使用的数据结…

SSM养老院管理系统-计算机毕业设计源码02221

摘要 本篇论文旨在设计和实现一个基于SSM的养老院管理系统&#xff0c;旨在提供高效、便捷的养老院管理服务。该系统将包括老人档案信息管理、护工人员管理、房间信息管理、费用管理等功能模块&#xff0c;以满足养老院管理者和居民的不同需求。 通过引入SSM框架&#x…