【问题标题】:Can't follow links when web-scraping网络抓取时无法跟踪链接
【发布时间】:2013-06-03 00:49:58
【问题描述】:

我意识到其他人已经讨论过类似的主题,但是阅读了这些帖子,我仍然无法解决我的问题。

我正在使用 Scrapy 编写一个抓取搜索结果页面的爬虫。一个例子可能是 CraigsList.org 上海湾地区所有 1 居室公寓的结果。它们可以在这里找到:

http://sfbay.craigslist.org/search/apa?zoomToPosting=&query=&srchType=A&minAsk=&maxAsk=&bedrooms=1

这显示了湾区的前 100 套一居室公寓。第 201 至 300 套公寓在此页面上

http://sfbay.craigslist.org/search/apa?bedrooms=1&srchType=A&s=100

对于接下来的 100 个,“&s=100”将更改为“&s=200”等。假设我想要每个页面上第一个帖子的名称以及结果。我知道这不是很有意义,但这只是举一个简单的例子。

我的问题是如何编写规则以使“&s=100”递增到“&s=200”等。这就是我所拥有的:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field

class Torrent(Item):
    name = Field()

class MySpiderSpider(CrawlSpider):

    name = 'MySpider'
    allowed_domains = ['http://sfbay.craigslist.org']
    start_urls = ['http://sfbay.craigslist.org/search/apa?zoomToPosting=&query=&srchType=A&minAsk=&maxAsk=&bedrooms=1']
    rules = [Rule(SgmlLinkExtractor(allow=[r'&s=\d+']), 'parse_torrent', follow=True)]

    def parse_torrent(self, response):
        x = HtmlXPathSelector(response)
        torrent = Torrent()
        torrent['name'] = x.select("id('toc_rows')/p[2]/span[1]/a/text()").extract()
        return torrent

任何人都可以直接设置我的规则,以便我获得每个结果页面的第一个帖子的名称吗?

谢谢!

【问题讨论】:

  • 你应该发布错误信息
  • @bwbrowning:好的,只是觉得会太长。

标签: python web-scraping screen-scraping scrapy


【解决方案1】:

在您只是从每个索引页面中提取信息的基础上,您可以生成一个适当的起始 url 列表,然后使用 BaseSpider 代替。无需任何规则,使用起来更简单。

from scrapy.spider import BaseSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field

class Torrent(Item):
    name = Field()

class MySpiderSpider(BaseSpider):
    name = 'MySpider'
    allowed_domains = ['http://sfbay.craigslist.org']
    start_urls = ['http://sfbay.craigslist.org/search/apa?bedrooms=1&srchType=A&s=%d' %n for n in xrange(0, 2500, 100)]

    def parse(self, response):
        x = HtmlXPathSelector(response)
        torrent = Torrent()
        torrent['name'] = x.select("id('toc_rows')/p[2]/span[1]/a/text()").extract()
        return torrent

【讨论】:

  • 谢谢,这样就可以了!我特别喜欢不需要使用规则的简单性。我很好奇是否有一种简单的方法可以迭代页数n,而不必知道最大页数(2500)?
  • 这是我之前给出的答案,它有一个初始解析函数来确定页数,然后为每个附加页产生请求:stackoverflow.com/questions/14417512/…
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多