Scrapy:如何修复URL,然后像往常一样抓取该页面?

时间:2013-08-14 15:34:40

标签: python web-scraping scrapy

我正在使用带有两个规则的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)

感谢您的帮助。总而言之,问题是我需要遵循这些“下一页”链接,但链接已被破坏。我可以修复链接,但我不知道如何再次关注它们。

1 个答案:

答案 0 :(得分:1)

我认为你想要的是process_value的{​​{1}}参数(参见this link) 您引用一个从提取的链接中获取SgmlLinkExtractor值的函数,以及在蜘蛛抓取链接之前可以更改其值的位置。

下面,您的第二条规则更改为定义回调,因此href的内置抓取和解析将用于查找新链接。您的CrawlSpider方法已更改为常规函数,该函数在此parse_follow

中引用
Rule