🤖依赖模块实现
爬虫模块
这个部分是爬取页面的核心部分:
爬取方式:广度优先
爬取原理:通过URLExtractor提取出页面中的所有url,并用这些url继续发送请求,请求会被发送给scrapy内核中的一个工作队列,接收到响应后,将响应回调给parse函数以相同的方式继续对页面进行探索。
将提取的url返回给pipelines
import scrapy
from myproject.items import URLItem
from store import storage
from Extractor import URLExtractor
from Recorder.Recorder import Recorder
import logging
import re
# from fake_useragent import UserAgent
import myproject.settings as mysetting
logtemp={
"name":"scrapy",
"type":"log",
"level":"info",
"messages":[]
}
class TestSpider(scrapy.Spider):
name = "test"
allowed_domains = []
start_urls = []
cookies={}
def __init__(self,project_name="",cookies=None, allowed_domains=None, start_urls=None, *args, **kwargs):
super(TestSpider, self).__init__(*args, **kwargs)
logging.info("初始化spider")
self.project_name=project_name
self.cookies=cookies
self.allowed_domains=allowed_domains
self.start_urls=start_urls
# 创建记录类
self.recorder=Recorder(project_name)
# 创建存储类
self.storage=storage.Storage_Base()
# 创建URL提取器
self.url_extractor=URLExtractor.URLProcessor(allow_domains=self.allowed_domains,start_urls=self.start_urls)
# 爬虫开始运行前
def start_requests(self):
# 在爬虫启动时执行的操作,可以在这里发送初始请求
print('爬虫运行中...')
log=logtemp
log["messages"]=[f'爬虫开始运行:\n\t{self.cookies}\n\t{self.start_urls}\n\t{self.allowed_domains}\n']
print(log["messages"])
self.recorder.log(log)
# 请求初始URL
for start_url in self.start_urls:
log["messages"]=[f'请求初始url:{start_url}']
self.recorder.log(log)
print(log["messages"])
yield scrapy.Request(url=start_url, cookies=self.cookies,callback=self.parse,)
def parse(self, response):
# 提取并去重url
try:
# print("提取url")
urls=self.url_extractor.get_urls(response) # 格式化后的URL
De_duplication_urls=self.url_extractor.De_duplication_url(urls) # 去重后的URL
if De_duplication_urls:
for url in De_duplication_urls:
print(url)
yield response.follow(url, cookies=self.cookies,callback=self.parse) # 通过此url继续发出请求
item=URLItem()
item["urls"]=De_duplication_urls
yield item # 移交给pipline转储url数据
except Exception as e:
logging.error('Extract_url:',e)pipelines利用store库将url存入数据库,和工作文件夹
middlewares中间件用于实现随机User_Angent
//这部分后续会跟进添加代理
scrapy配置文件:
提取模块
提取模块用于解析页面,提取出页面中的目标信息。
提取模块的实现:
提取模块中包含URL提取类、input标签提取类、多行输入框提取类、自定义提取类。
URL提取器功能:
提取页面中的所有链接,并且实现格式化以及去重处理。
1.URL提取类的初始函数
初始化函数中的
2.提取页面中所有链接
3.格式化url
4.URL去重
//待完善功能
5.判断是否是静态网页
要判断提取的URL是否为静态网页,你可以使用Python的requests库来发送HEAD请求,并检查响的Content-Type头部字段。如果Content-Type指示了静态文件类型(例如"text/html"、“text/plain”、"text/css"等),则可以认为该链接是静态网页。以下是相应的代码实现:
以上代码会发送HEAD请求获取URL的响应头部信息,然后检查Content-Type字段中是否包含静态网页类型。如果是静态网页,函数会返回True,否则返回False。
HTML提取器功能:
实现指定标签、属性等的提取,以及自定义标签属性的提取。
1.HTML提取器初始函数
2.input提取器
3.多行输入域提取器
4.form表单提取器
HTML提取器使用范例:
form提取结果:
结果结构解析: form_name是表单名 form_method是表单提交方式 form_action是表单在提交时执行的action input_datas是一个输入框列表
inputs提取结果:
结果结构解析: name是参数名 type是输入框的类型 value是参数的值 form是该输入框属于的表单 method是提交方式
textareas多行输入框提取结果:
结果结构解析: name是参数名 form是属于的表单名 method是提交方式
自定义标签提取器
自定义提取器的使用范例:
此时,你可以将该代码片段作为一个函数来使用,并按照你的参数说明来提取 HTML 中对应标签的信息。请确保将正确的 HTML 字符串传递给函数,并且提供正确的标签名称、标签属性列表和待提取的属性列表。
示例用法:
上述代码将输出带有 class="content" 和 id="my-div" 属性的 <div> 标签的信息,包括待提取的属性列表中的属性值:
如果将 extract_content 参数设置为 True,则标签内容将会被提取。
存储模块
Recorder功能
创建工作文件夹
根据插件接口返回的log记录各插件日志
根据插件接口返回的result记录插件运行结果
storage类的功能:
负责实现与数据库交互进行自定义表单创建数据存储
//待完善数据为进行过滤会导致sql注入漏洞
最后更新于
这有帮助吗?