🤖依赖模块实现

依赖模块由爬虫模块、提取模块、存储模块三部分组成。

爬虫模块由spider、pipelines、middlewares、settings四部分组成,依赖scrapy框架。

提取模块由HTMLExtractor、Self_Defining_Extractor、URLExtractor三部分组成。

存储模块由Recorder、Store两部分组成

爬虫模块

这个部分是爬取页面的核心部分:

  • 爬取方式:广度优先

  • 爬取原理:通过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)

提取模块

提取模块用于解析页面,提取出页面中的目标信息。

提取模块的实现:

提取模块中包含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。

存储模块

Recorder功能

  • 创建工作文件夹

  • 根据插件接口返回的log记录各插件日志

  • 根据插件接口返回的result记录插件运行结果

最后更新于

这有帮助吗?