我目前正在尝试创建一个蜘蛛,该蜘蛛以递归方式跟随我给出的页面。其目的是从新闻门户网站上抓取文章的内容。对其实施很重要的两件事:
需要蜘蛛参数,因为我想为每个要爬网的门户创建一个蜘蛛。
规则和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()
启动蜘蛛之后,甚至没有任何请求。零文档已下载。