我正在尝试使用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
答案 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)