【问题标题】:Crawling a site recursively using scrapy使用scrapy递归爬取网站
【发布时间】:2015-12-28 22:04:38
【问题描述】:

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

问题是爬虫会进入起始页面,但之后不会抓取任何页面。

【问题讨论】:

  • 这个类的示例用法?
  • @Caridorc 这是我们在这里谈论的 Scrapy。它有一个带有不同命令的scrapy cli,它知道如何在项目中获取scrapy spiders并启动它们。谢谢。

标签: python web-scraping scrapy


【解决方案1】:

以下是一个好主意:

“使用 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. 我们正在通过“下一页”分页按钮从下一页 xpath 获取下一页链接。
  2. if 条件检查是否不是分页结束。
  3. 使用 urljoin 将这个链接(我们在第 1 步中得到的)与主 URL 连接起来
  4. 对“解析”回调方法的递归调用。

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. 我们正在使用“scrapy.Spider”父类的“CrawlSpider”子类

  2. 我们已设置为“规则”

    a) 第一条规则只是检查是否有“next_page”可用并遵循它。

    b) 第二条规则请求页面上所有格式为“/trains/12343”的链接,然后调用“parse_trains”执行和解析操作。

  3. 重要提示:请注意,我们不想在这里使用常规的 'parse' 方法,因为我们使用的是 'CrawlSpider' 子类。这个类也有一个 'parse' 方法,所以我们不想重写它。请记住将您的回调方法命名为“解析”以外的其他名称。

【讨论】:

    【解决方案2】:

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

    改为使用CrawlSpider:

    class MySpider(CrawlSpider):
    

    【讨论】:

    • 非常感谢您的回答,非常有帮助。我仍然有问题。我认为“规则”这一行是不正确的。我正在尝试插入不同的值,但它不起作用。我可以要求额外的提示吗?
    • 要抓取的第一页是:code.tutsplus.com/posts?page=1,下一页是:code.tutsplus.com/posts?page=2,依此类推。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多