Scrapy Link Extractors

时间:2016-01-06 21:29:47

标签: python regex scrapy

我正在尝试使用scrapy编写一些代码,这些代码将遵循特定的链接来备份adobe breeze Web服务器上的数据。但是,我对scrapy及其用法相当新。代码仍然处于早期阶段,到目前为止,我的大部分内容都是从scrapy教程中拼凑出来的

到目前为止,我最大的问题是在最初登录后抓取链接页面。

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class LoginSpider(CrawlSpider):
    name = 'example.com'
    start_urls = [
    'https://conted.breeze.und.nodak.edu/admin/meeting/folder/list?filter-rows=100&filter-start=0&sco-id=10003&tab-id=10003'
    ]

    def parse(self, response):
        return scrapy.FormRequest.from_response(
            response,
            formdata={'login' : 'jake', 'password' : 'password'},
        callback=self.after_login
    )

    def after_login(self, response):
        # check login succeed before going on
        if "Invalid user or password. Please try again." in response.body:
            self.logger.error("Login failed")
            return

    rules = (
        # Rule(LinkExtractor(deny_domains=['/admin/meeting?sco-id=10003&tab-id=10003',
        #   '/admin/meeting?sco-id=10004&tab-id=10004'])),
        #Rule(LinkExtractor(allow=['/admin/meeting?sco-id=\w+']), callback='parse_item'),
        Rule(LinkExtractor(allow=[r'\w+']), callback='parse_item'),
    )

    def parse_item(self, response):
        self.logger.info('response.url=%s' % response.url)

起始URL是我想要从中抓取链接的实际页面,但服务器将提示用户使用其凭据登录,然后才能访问该特定页面。因此理论上对此页面的响应将包含我正在寻找的链接。虽然我的广泛正则表达式没有收到任何结果。

注释掉代码

注释掉的规则是针对我需要在下一页中找到的链接的说明符。正如您所看到的,我改为添加了一个完全开放的正则表达式来测试页面上的任何链接。这返回了以下result

页面来源

虽然实际页面位于登录后面,但是我尝试从其接收链接的主目录的源HTML可以找到here

1 个答案:

答案 0 :(得分:1)

我建议跳过规则并明确地从after_login()

创建请求

即。 :

def after_login(self, response):
    # check login succeed before going on
    if "Invalid user or password. Please try again." in response.body:
        self.logger.error("Login failed")
    for href in response.selector.xpath('//a/@href').extract():
        url = response.urljoin(href)
        yield request(url, callback=self.parse_item)