网络抓取时无法关注链接

时间:2013-06-06 20:42:04

标签: python web-scraping screen-scraping scrapy

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

我正在使用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

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

谢谢!

1 个答案:

答案 0 :(得分: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