CrawlSpider无法在Scrapy中解析多页

时间:2017-04-04 13:39:10

标签: python scrapy

我创建的CrawlSpider并没有正确地完成它的工作。它解析第一页然后停止而不进入下一页。我做错了但无法察觉的东西。希望有人在那里给我一个暗示我该怎么做才能纠正它。

" items.py"包括:

from scrapy.item import Item, Field
class CraigslistScraperItem(Item):
    Name = Field()
    Link = Field()

CrawlSpider名称" craigs.py"其中包含:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.selector import Selector
from craigslist_scraper.items import CraigslistScraperItem

class CraigsPySpider(CrawlSpider):
    name = "craigs"
    allowed_domains = ["craigslist.org"]
    start_urls = (
        'http://sfbay.craigslist.org/search/npo/',
    )
    rules=(Rule(LinkExtractor(allow = ('sfbay\.craigslist\.org\/search\/npo/.*',
    ),restrict_xpaths = ('//a[@class="button next"]')),callback = 'parse',follow = True),)
    def parse(self, response):
        page=response.xpath('//p[@class="result-info"]')
        items=[]
        for title in page:
            item=CraigslistScraperItem()
            item["Name"]=title.xpath('.//a[@class="result-title hdrlnk"]/text()').extract()
            item["Link"]=title.xpath('.//a[@class="result-title hdrlnk"]/@href').extract()
            items.append(item)
        return items

最后,我用来获取CSV输出的命令是:

scrapy crawl craigs -o items.csv -t csv

顺便说一下,我尝试使用" parse_item"首先,但没有找到任何回应,这就是我使用"解析"方法而不是。提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用scrapy.CrawlSpider时,请不要将回调方法命名为as。 来自Scrapy documentation

  

编写爬网蜘蛛规则时,请避免使用parse作为回调   CrawlSpider使用parse方法本身来实现其逻辑。   因此,如果您覆盖解析方法,则爬行蜘蛛将不再存在   工作

此外,您不需要将项目追加到列表中,因为您已经使用Scrapy Items并且可以简单地生成项目。 这段代码应该有效:

parse

最后以csv格式输出:# -*- coding: utf-8 -*- from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from craigslist_scraper.items import CraigslistScraperItem class CraigsPySpider(CrawlSpider): name = "craigs" allowed_domains = ["craigslist.org"] start_urls = ( 'http://sfbay.craigslist.org/search/npo/', ) rules = ( Rule(LinkExtractor(allow=('\/search\/npo\?s=.*',)), callback='parse_item', follow=True), ) def parse_item(self, response): page = response.xpath('//p[@class="result-info"]') for title in page: item = CraigslistScraperItem() item["Name"] = title.xpath('.//a[@class="result-title hdrlnk"]/text()').extract_first() item["Link"] = title.xpath('.//a[@class="result-title hdrlnk"]/@href').extract_first() yield item