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

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

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

code_template = """
import requests
from bs4 import BeautifulSoupdef crawl(url):response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')results = []SELECTORS_PLACEHOLDERreturn resultsif __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 resultsif __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 BeautifulSoupdef 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.parenttarget_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)breakreturn target_tagsdef get_unique_selectors(target_tags):unique_selectors = set()for tag in target_tags:selectors = []for parent in tag.parents:if parent.name == '[document]':breakif 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_selectorsdef generate_crawler_code(url, selectors, is_attribute, attribute=None):code_template = """
import requests
from bs4 import BeautifulSoupdef crawl(url):response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')results = []SELECTORS_PLACEHOLDERreturn resultsif __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_codedef 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 = Noneis_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 = Trueattribute = attrbreakif is_attribute:breakcrawler_code = generate_crawler_code(url, unique_selectors, is_attribute, attribute)return crawler_codeelse: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)

谢谢大家观看,再见! 

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

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

相关文章

养老院生活管理系统

摘要 随着全球范围内人口老龄化趋势的日益加剧,养老院作为老年人生活的重要场所,其生活管理问题也显得愈发突出和重要。为了满足养老院在日常生活管理、老人健康监护、服务人员管理等多方面的需求,提高管理效率和服务质量。决定设计并实现了…

用一百场线下讲座科普充电桩 能效电气做到了

在新能源汽车产业蓬勃发展的今天,充电桩作为产业链的重要环节,其建设与发展成为推动行业进步的关键。在这一背景下,能效电气凭借其卓越的技术实力和前瞻性的市场布局,成为了新能源充电桩行业的佼佼者。 为了进一步推动新能源产业的发展,普及充电桩知识,能效电气精心策划并举办…

C语言数据类型和变量(二)

目录 1.数据类型的取值范围 2.变量 2.1 变量的创建 2.2 变量的分类 2.3全局变量和局部变量在内存中的存储​编辑 3. 算术操作符: 、 - 、* 、/ 、% 3.1 和 - 3.2 * 3.3 / 3.4 % 1.数据类型的取值范围 每一种数据类型有自己的取值范围,也就是存…

mapper.xml 文件对应的 Dao 接口原理

在 Java 框架如 MyBatis 中,Mapper.xml 文件是用于定义 SQL 查询的配置文件,而对应的 Dao 接口(Mapper 接口)则提供了与 XML 文件中的 SQL 查询相对应的方法。这种设计模式使得 Java 代码与 SQL 语句解耦,提高了代码的…

盘点亚马逊5大实用选品思路(图文讲解+选品案例)

一、7天蓝海选品法 市场上很多工具一般都是近30天的跨境商品数据,而店雷达亚马逊选品,可以筛选出上架近7天的亚马逊产品,避免在已经市场相对饱和的赛道,中小卖家还要挤破头去抢蛋糕。我们更应该学会在市场反馈好的新品中找到出单…

Git删除了文件拉取时失败

本地删除了一些文件,远端的另一个提交修改了被删除的文件,vs里拉取时提示未处理的提交,无法继续操作,git gui里显示很多unstaged change的项 解决办法: 1、用git bash的git rm --cached filename或 git rm -r --cached…

GBASE8S如何使用dbexport实现单表的还原和实现数据库的复制

(一) 通过dbexport实现单表数据还原 1. 测试前的信息查看 本次以test库的表test21为例 [gbasedbtiZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test - Your evaluation license will expire on 2025-05-26 00:00:00Database selected.> select * from test21;id name1 a2 b3 c3…

探索Vue.js的无限可能 —— vuejs-challenges

vuejs-challenges:挑战自我,共同成长,Vue.js挑战等你来战!- 精选真开源,释放新价值。 概览 vuejs-challenges是一个专为Vue.js学习者和开发者设计的开源项目。它通过提供一系列精心设计的挑战,帮助参与者深…

使用 JavaScriptCore 进行跨语言调用

使用 JavaScriptCore 进行跨语言调用时,既可以在 Native 代码中执行 JavaScript 代码,也可以在 JavaScript 中调用 Native 方法。以下是详细的实现步骤和示例。 1. 在 Native 代码中执行 JavaScript 代码 使用 JavaScriptCore 框架,可以在 …

手把手教你一步一步通过AI助手生成利润表分析报告

AI助手之利润表分析报告-操作篇 以下为文字整理部分: 如果要手工制作一份这样的利润分析报告大概要多久时间?从准备数据做成表格,到完成报告,至少需要1天的时间吧,特别是敲文字报告的时候,生怕把数字搞错要…

什么是森林防火气象站?作用?

森林防火气象站用精准的数据和先进的技术,守护着森林的安全。本文将带您了解其重要性、工作原理以及在森林防火中的实际应用。 一、森林防火气象站的重要性 森林火灾是森林生态系统的大敌,它能在短时间内烧毁大片森林,破坏生态平衡&#xff0…

5、Redis 缓存设计相关知识点

1. 多级缓存架构 多级缓存架构是一种通过在应用层和数据库层之间添加多个缓存层来提高系统性能和可用性的架构设计。这种设计能够有效减少数据库负载,并提高数据访问速度。常见的多级缓存包括本地缓存、分布式缓存和数据库缓存。 本地缓存:本地缓存位于应用服务器本地,响应…

高通平台Display显示架构

目录 一、显示整体架构二、SurfaceFlinger三、HWC四、Gralloc五、DisplayManagerService六、WindowManagerService 一、显示整体架构 二、SurfaceFlinger SurfaceFlinger是一个系统服务,如:audioflinger等等,这个系统服务主要实现了Surface的…

通过升级nginx完美修复nginx相关漏洞

目录 前言1 安全评估报告的漏洞信息1.1 nginx漏洞概况1.2 nginx漏洞详细信息1.3 安装的软件信息 2 问题分析3 Nginx从1.18版本升级到1.26版本的步骤与说明3.1 查看现有Nginx配置参数3.2 下载新版本Nginx3.3 配置新版本Nginx3.4 编译新版本Nginx3.5 备份旧版本Nginx的二进制文件…

github 设置中文,亲测有效

点进去 安装 选上面第二个,不行再选第一个 GitHub - maboloshi/github-chinese: GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese)

常见网络攻击方式及防御方法

1. DDOS攻击(分布式拒绝服务攻击) 概念:借助于C/S(客户端/服务器)技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDOS攻击,从而成倍地提高拒绝服务攻击的威力。防护方…

springboot 配置加密,jasypt加解密命令

位置:Maven仓库中\org\jasypt\jasypt\1.9.3 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input123456 passwordmysalt algorithmPBEWithMD5andDES ----ENVIRONMENT----------------- Runtime: Oracle Corporation Java HotSpot™…

sideloadly 苹果自签和sidestore手机续签ipa记录

sideloadly 地址:https://sideloadly.io/#download 直接安装对应系统软件,然后吧ipa 拖到里面续签,缺点每7天需要电脑续签 如果续签保留数据需要对应的位置开启 enable file sharing 勾选 和 bundle id 修改 注意的地方需要电脑和手机appi…

气象观测站:时刻注视着天空的变化

在广袤无垠的地球上,气象观测站时刻注视着天空的变化,记录着大自然的脉动。它们是我们理解和应对气候变化、极端天气事件的重要工具。 一、气象观测站的基本构成 气象观测站包括一系列的气象仪器和设备,用于测量和记录各种气象参数。这些参数…

软考《信息系统运行管理员》-2.5信息系统运维管理系统与专用工具

2.5信息系统运维管理系统与专用工具 信息系统运维管理系统功能框架 信息系统运维管理系统是站在运维管理的整体视角,基于运维流程,以服务为导向的业务 服务管理和运维管理支撑平台,提供统一管理门户,最终帮助运维对象实现信息系…