2015-10-19 60 views
1

我试图递归地从https://iowacity.craigslist.org/search/jjj中删除作业的标题。也就是说,我希望蜘蛛能够抓住第1页的所有职位,然后按照底部的“下一步>”链接去抓下一页,等等。我模仿迈克尔赫尔曼的教程写我的蜘蛛。 http://mherman.org/blog/2012/11/08/recursively-scraping-web-pages-with-scrapy/#.ViJ6rPmrTIU递归挖掘后没有数据抓取

这里是我的代码:

import scrapy 
from craig_rec.items import CraigRecItem 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 


class CraigslistSpider(CrawlSpider): 
    name = "craig_rec" 
    allowed_domains = ["https://craigslist.org"] 
    start_urls = ["https://iowacity.craigslist.org/search/jjj"] 

    rules = (
     Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True), 
) 

    def parse_items(self, response): 
     items = [] 
     for sel in response.xpath("//span[@class = 'pl']"): 
      item = CraigRecItem() 
      item['title'] = sel.xpath("a/text()").extract() 
      items.append(item) 
     return items 

我发布的蜘蛛,但没有数据被刮掉。任何帮助?谢谢!

+0

为什么你需要两次提出同样的问题,如果解决方案对于你的两只蜘蛛都是一样的? – GHajba

回答

1

当您将allowed_domains设置为“https://craigslist.org”时,由于异地请求到子域“iowacity.craigslist.org”,它会停止抓取。

你必须将其设置为:

allowed_domains = ["craigslist.org"] 

按照docsallowed_domains是一个包含了蜘蛛可以抓取域字符串列表。它预计它的格式为domain.com,它允许域本身和所有子域由蜘蛛解析。

您也可以是特定的,只允许少数子域或通过将该属性留空来允许所有请求。

+0

André,谢谢你的回答!我改变了我的蜘蛛,现在它运作良好。但是,我还是不太明白'allowed_domains = [“craigslist.org”]和'allowed_domains = [“http://craigslist.org”]之间的区别。你介意多解释一下吗?我对Scrapy非常陌生。非常感谢! –

+0

我不确定为什么Scrapy不能很好地处理包含https前缀的问题。根据这个例子不应这样做。不知道它是否只启用了根域,或者它是否将整个“http:// craigslist”字符串作为域。 –

1

迈克尔赫尔曼的教程是伟大的,但对于旧版本的scrapy。这段代码避免了一些废弃警告,并且还开启parse_page到发电机:

import scrapy 
from craig_rec.items import CraigRecItem 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 


class CraiglistSpider(CrawlSpider): 
    name = "craiglist" 
    allowed_domains = ["craigslist.org"] 
    start_urls = (
     'https://iowacity.craigslist.org/search/jjj/', 
    ) 

    rules = (
     Rule(LinkExtractor(restrict_xpaths=('//a[@class="button next"]',)), 
      callback="parse_page", follow=True), 
    ) 

    def parse_page(self, response): 
     for sel in response.xpath("//span[@class = 'pl']"): 
      item = CraigRecItem() 
      item['title'] = sel.xpath(".//a/text()").extract() 
      yield item 

post也对Craigslist的拼抢一些伟大的秘诀。

+0

我感谢你的伟大答案,Luiz! –