具有动态生成的规则和蜘蛛参数的CrawlSpider不会抓取

时间:2019-07-12 13:36:37

标签: python web-scraping scrapy

我目前正在尝试创建一个蜘蛛,该蜘蛛以递归方式跟随我给出的页面。其目的是从新闻门户网站上抓取文章的内容。对其实施很重要的两件事:

  • 我必须能够使用门户网站URL为Spider提供参数,
  • 我想根据前面给出的门户链接动态生成商品URL的正则表达式。

需要蜘蛛参数,因为我想为每个要爬网的门户创建一个蜘蛛。

规则和LinkExtractor需要正则表达式。

问题在于,蜘蛛程序运行后无法递归工作,并且不会收集任何文档。好像动态生成的规则不适用。

在实现我的蜘蛛程序时,我使用 init 向其中传递了一个名为portal的变量,其中有一个我要抓取的入口URL。

init 中,我还创建规则并进行编译。

我使用Dragnet外部库提取文章的内容。

import scrapy
from scrapy.loader import ItemLoader
from scrapy.spiders import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.project import get_project_settings
from ..items import ArticleExtractorItem

import re
import tldextract
from dragnet import extract_content

class ArticleExtractorSpider(CrawlSpider):
    name = "article_extractor"

    def __init__(self, portal=None, *args, **kwargs):
        super(ArticleExtractorSpider, self).__init__(*args, **kwargs)

        if portal:
            url_escaped = re.escape(portal)
            article_regex = r'^' + url_escaped + \
                r'([a-zA-Z0-9]+-){2,}[a-zA-Z0-9]+\/$'

            ArticleExtractorSpider.rules = (
                Rule(LinkExtractor(allow=[article_regex]),
                     callback='parse_article', follow=True),
            )

            super(ArticleExtractorSpider, self)._compile_rules()

        self.portal = portal

    def parse_article(self, response):
        article = extract_content(response.body)
        portal = tldextract.extract(response.url)[1]

        l = ItemLoader(item=ArticleExtractorItem(), response=response)
        l.add_value('portal', portal)
        l.add_value('url', response.url)
        l.add_xpath('title', './/meta[@name="twitter:title"]/@content')
        l.add_xpath('title', './/meta[@property="og:title"]/@content')
        l.add_xpath('publish_date',
                    './/meta[@property="article:published_time"]/@content')
        l.add_value('article', article)

        yield l.load_item()

启动蜘蛛之后,甚至没有任何请求。零文档已下载。

0 个答案:

没有答案