使用scrapy

时间:2015-12-28 22:04:38

标签: python web-scraping scrapy

我正在尝试使用scrapy废弃网站。

这是我到目前为止基于http://thuongnh.com/building-a-web-crawler-with-scrapy/编写的代码 (原始代码根本不起作用所以我试图重建它)

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders             import Spider
from scrapy.selector         import HtmlXPathSelector
from nettuts.items            import NettutsItem
from scrapy.http            import Request
from scrapy.linkextractors import LinkExtractor


class MySpider(Spider):
    name = "nettuts"
    allowed_domains = ["net.tutsplus.com"]
    start_urls = ["http://code.tutsplus.com/posts?"]
    rules = [Rule(LinkExtractor(allow = ('')), callback = 'parse', follow = True)]

    def parse(self, response):
        hxs  = HtmlXPathSelector(response)
        item = []

        titles    = hxs.xpath('//li[@class="posts__post"]/a/text()').extract()
        for title in titles:
            item             = NettutsItem()
            item["title"]     = title
            yield item
        return

问题是抓取工具会转到起始页面,但在此之后不会废弃任何页面。

2 个答案:

答案 0 :(得分:9)

以下是一个好主意:

使用scrapy'可以有两个用于递归抓取网站的用例。

<强> A)。我们只想使用表格的分页按钮和获取数据来浏览网站。这是相对简单的。

class TrainSpider(scrapy.Spider):
    name = "trip"
    start_urls = ['somewebsite']
    def parse(self, response):
        ''' do something with this parser '''
        next_page = response.xpath("//a[@class='next_page']/@href").extract_first()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)`

观察最后4行。这里

  1. 我们正在从&#39;下一页&#39;获取下一页链接表格下一页xpath分页按钮。
  2. if条件检查,如果它不是分页的结束。
  3. 使用urljoin
  4. 加入此主链接的链接(我们在步骤1中获得)
  5. 对“解析”的递归调用&#39;回电方法。
  6. B)我们不仅希望跨页面移动,而且还希望从该页面中的一个或多个链接中提取数据。

    class StationDetailSpider(CrawlSpider):
        name = 'train'
        start_urls = [someOtherWebsite]
        rules = (
            Rule(LinkExtractor(restrict_xpaths="//a[@class='next_page']"), follow=True),
            Rule(LinkExtractor(allow=r"/trains/\d+$"), callback='parse_trains')
        )
        def parse_trains(self, response):
            '''do your parsing here'''
    

    在这里,请注意:

    1. 我们正在使用&#39; CrawlSpider&#39; &scath.Spider&#39;的子类。父类

    2. 我们已制定规则&#39;

      a)第一条规则只是检查是否有&#39; next_page&#39;可用并遵循它。

      b)第二条规则要求页面上的所有链接采用格式,例如&#39; / trains / 12343&#39;然后调用&#39; parse_trains&#39;执行和解析操作。

    3. 重要:请注意,我们不想使用常规解析&#39;我们正在使用&#39; CrawlSpider&#39;子类。这个班还有一个解析&#39;方法,所以我们不想覆盖它。请记住将您的回拨方式命名为“解析”之外的其他方法。

答案 1 :(得分:5)

问题在于您使用Spider类作为基础。 scrapy.Spider是一个不支持规则和链接提取器的简单蜘蛛

相反,请使用CrawlSpider

class MySpider(CrawlSpider):