我正在使用带有两个规则的CrawlSpider。一条规则将文章链接从页面上移除并发送出去以存储在CSV中。另一个找到“下一页”链接并跟随它。
然而,下一页链接总是有点混乱。所以,我需要修复URL(我可以做),然后抓取该页面以获取更多链接(我不知道该怎么做)。
从我所看到的,似乎我需要创建一个请求,但不幸的是我真的不明白这是如何工作的。请求是否意味着提供给它的页面将像所有其他页面一样被抓取?我的CrawlSpider规则是否仍然应用于该页面上的链接?
我尝试过使用Request(),但似乎没有遵循链接。我检查了链接并且工作正常,并且该页面上有链接。
以下是代码:
class MySpider(CrawlSpider):
name = 'ContentSpider'
allowed_domains = ['bbc.co.uk']
start_urls = ['http://www.bbc.co.uk/search/news/?q=credit card']
rules = (
Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="cmWidget news"]/div[@id="news-content"]'), allow=('http\:\/\/www\.bbc\.co\.uk\/news\/.')), callback='parse_item', follow=False),
Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="pagination"]'), allow=()), callback='parse_follow'),
)
def __init__(self, **kwargs):
CrawlSpider.__init__(self, **kwargs)
logfile = open('testlog.log', 'w')
log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
log_observer.start()
log.start(loglevel=logging.DEBUG)
def parse_item(self, response):
item = CreditcrawlerItem()
item['url'] = response.url
return item
def parse_follow(self, response):
marker1 = response.url.find("?") + 1
marker2 = response.url.find("page")
fixed_url = response.url[:marker1] + response.url[marker2:] + "&" + response.url[marker1:marker2 - 1]
fixed_url = fixed_url.replace("+"," ")
return Request(fixed_url)
感谢您的帮助。总而言之,问题是我需要遵循这些“下一页”链接,但链接已被破坏。我可以修复链接,但我不知道如何再次关注它们。
答案 0 :(得分:1)
我认为你想要的是process_value
的{{1}}参数(参见this link)
您引用一个从提取的链接中获取SgmlLinkExtractor
值的函数,以及在蜘蛛抓取链接之前可以更改其值的位置。
下面,您的第二条规则更改为不定义回调,因此href
的内置抓取和解析将用于查找新链接。您的CrawlSpider
方法已更改为常规函数,该函数在此parse_follow
Rule