我创建的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"首先,但没有找到任何回应,这就是我使用"解析"方法而不是。提前谢谢。
答案 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