Python Scrapy需要抓取网站上的所有下一个链接,并转到下一页

Python Scrapy需要抓取网站上的所有下一个链接,并转到下一页,python,web-scraping,scrapy,web-crawler,scrapy-spider,Python,Web Scraping,Scrapy,Web Crawler,Scrapy Spider,我需要我的scrapy进入下一页请给我规则的正确代码,如何编写 from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.selector import Selector from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from delh.items import DelhItem class criticspider(CrawlSpide

我需要我的scrapy进入下一页请给我规则的正确代码,如何编写

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

from delh.items import DelhItem

class criticspider(CrawlSpider):
    name ="delh"
    allowed_domains =["consumercomplaints.in"]
    #start_urls =["http://www.consumercomplaints.in/?search=delhivery&page=2","http://www.consumercomplaints.in/?search=delhivery&page=3","http://www.consumercomplaints.in/?search=delhivery&page=4","http://www.consumercomplaints.in/?search=delhivery&page=5","http://www.consumercomplaints.in/?search=delhivery&page=6","http://www.consumercomplaints.in/?search=delhivery&page=7","http://www.consumercomplaints.in/?search=delhivery&page=8","http://www.consumercomplaints.in/?search=delhivery&page=9","http://www.consumercomplaints.in/?search=delhivery&page=10","http://www.consumercomplaints.in/?search=delhivery&page=11"]
    start_urls=["http://www.consumercomplaints.in/?search=delhivery"]
    rules = (Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="pagelinks"]/a/@href',)),           
              callback="parse_gen", follow= True),
    )
    def parse_gen(self,response):
        hxs = Selector(response)
        sites = hxs.select('//table[@width="100%"]')
        items = []

        for site in sites:
            item = DelhItem()
            item['title'] = site.select('.//td[@class="complaint"]/a/span/text()').extract()
            item['content'] = site.select('.//td[@class="compl-text"]/div/text()').extract()
            items.append(item)
        return items
spider=criticspider()

据我所知,您试图刮取两种类型的页面,因此您应该使用两种不同的规则:

  • 分页列表页,包含指向n个项目页和后续列表页的链接
  • 项目页面,您可以从中刮取项目
然后,您的规则应该如下所示:

rules = (
    Rule(LinkExtractor(restrict_xpaths='{{ item selector }}'), callback='parse_gen'),
    Rule(LinkExtractor(restrict_xpaths='//div[@class="pagelinks"]/a[contains(text(), "Next")]/@href')),
)
说明:

  • 第一个规则匹配项目链接,并使用项目解析方法(
    parse\u gen
    )作为回调。生成的响应不会再次执行这些规则
  • 第二条规则与“pagelinks”匹配,并且没有指定回调,生成的响应将由这些规则处理
注意:

  • SgmlLinkExtractor
    已过时,您应该使用
    lxmlinkextractor
    (或其别名
    LinkExtractor
    )代替()
  • 发送请求的顺序确实很重要,在这种情况下(清除未知的、可能大量的页面/项目),您应该设法减少在任何给定时间处理的页面数。为此,我以两种方式修改了您的代码:
    • 在请求下一个项目之前,从当前列表页面中刮取项目,这就是项目规则在“页面链接”规则之前的原因
    • 避免对页面进行多次爬网,这就是为什么我在“页面链接”规则中添加了
      [contains(text(),“Next”)]
      选择器。这样,每个“列表页”只被请求一次

@ason很抱歉,我会在我的机器上运行这个,我会让你知道的