程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Scrapy Spider 分页提前结束大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Scrapy Spider 分页提前结束?

开发过程中遇到Scrapy Spider 分页提前结束的问题如何解决?下面主要结合日常开发的经验,给出你关于Scrapy Spider 分页提前结束的解决方法建议,希望对你解决Scrapy Spider 分页提前结束有所启发或帮助;

我正在为一个项目开发一个爬虫蜘蛛。我正在抓取的大多数网站都具有带有列表页面的搜索页面的一般格式。我编写了一个爬虫来从搜索页面和列表页面中为每个列表抓取数据。我遇到的问题是,在抓取我的蜘蛛时,它会抓取所有搜索页面并将要抓取的列表页面排队,但是一旦到达最终搜索页面,蜘蛛就会关闭。有时它也会在到达最后一页之前结束。如果我让它只运行一个搜索页面(无分页),则返回所有列表。我还在学习,所以我确定我错过了一些东西。

我在这里编写了一个示例蜘蛛,使用的结构与我编写的结构相同。

import scrapy

class exampleSpIDer(scrapy.SpIDer):
    name = 'exampleSpIDer'
    
    start_urls = ['eample.com/pages=1']

    custom_setTings={ 'Feed_URI': "example_%(timE)s.csv",'Feed_FORMAT': 'csv'}

    def parse(self,responsE):
        for post in response.CSS('.job-LisTings'):
            url = post.CSS('.job-url::text').get()
            title = post.CSS('.job-title::text').get()
            yIEld scrapy.request(url=url,callBACk=self.parse_LisTing,Meta={'url':url,'title'@R_155_6964@})

        #pagination
        next_page = response.CSS('.pagination li:last-child a::attr(href)').get()
        if next_page is not None:
            next_page = 'example.com' + next_page
            yIEld scrapy.request(url=next_page,callBACk=self.parsE)

    def parse_LisTing(self,responsE):
        yIEld{
              'url': response.Meta['url'],'title': response.Meta['title'],'company': response.CSS('.row:nth-child(1) a::text').get(),'specialty': response.CSS('.row:nth-child(2) a::text').get(),'city': response.CSS('.value span:nth-child(1)::text').get(),'state': response.CSS('.value span+ span::text').get(),'job type': response.CSS('.row:nth-child(4) .value::text').get(),}

这是我在运行蜘蛛后通常得到的输出。例如,这个网站有大约 6000 页,但它只通过了 153。

2021-01-11 17:43:00 [scrapy.core.ENGIne] INFO: Closing spIDer (finished)
2021-01-11 17:43:00 [scrapy.statscollectors] INFO: DumPing Scrapy stats:
{'downloader/requesT_Bytes': 115052,'downloader/request_count': 203,'downloader/request_method_count/GET': 203,'downloader/response_bytes': 2272046,'downloader/response_count': 203,'downloader/response_status_count/200': 173,'downloader/response_status_count/404': 2,'downloader/response_status_count/429': 27,'downloader/response_status_count/500': 1,'elapsed_time_seconds': 223.01121,'finish_reason': 'finished','finish_time': datetiR_652_11845@e.datetiR_652_11845@e(2021,1,11,23,43,37435),'httperror/response_ignored_count': 1,'httperror/response_ignored_status_count/404': 1,'item_scraped_count': 153,'log_count/DEBUG': 356,'log_count/ERROR': 6,'log_count/INFO': 14,'request_depth_max': 13,'response_received_count': 175,'retry/count': 28,'retry/reason_count/429 UnkNown Status': 27,'retry/reason_count/500 Internal Server Error': 1,'robotstxt/request_count': 1,'robotstxt/response_count': 1,'robotstxt/response_status_count/404': 1,'scheduler/dequeued': 202,'scheduler/dequeued/memory': 202,'start_time': datetiR_652_11845@e.datetiR_652_11845@e(2021,39,17,26225)}
2021-01-11 17:43:00 [scrapy.core.ENGIne] INFO: SpIDer closed (finished)

解决方法

我为遇到类似问题的其他人找到了解决我的问题的方法。我发现了 2 个问题。首先,我正在抓取的网站的职位列表布局略有不同。广告和常规帖子有不同的类名,所以一旦我到达第 35 页左右,我的 for 循环就会检查 None 并结束抓取。第二个问题是一些列表页面不再存在,但仍然发布。所以当刮板试图刮它时 None 再次返回。所以这里的教训是使用 try 和 except 语句,因为我的问题与我想象的分页没有任何关系。这是现在对我有用的更新代码。

import scrapy

class exampleSpider(scrapy.Spider):
    name = 'exampleSpider'
    
    start_urls = ['eample.com/pages=1']

    custom_setTings={ 'FEED_URI': "example_%(timE)s.csv",'FEED_FORMAT': 'csv'}

    def parse(self,responsE):
       if(response.css('.job-lisTings') == []):
          try:
             for post in response.css('.job-lisTings-old'):
                url = post.css('.job-url::text').get()
                title = post.css('.job-title::text').get()
                yield scrapy.request(url=url,callBACk=self.parse_lisTing,meta {'url':url,'title'@R_155_6964@})
          except Exception e:
             print(E)
       else:
          try:
             for post in response.css('.job-lisTings'):
                url = post.css('.job-url::text').get()
                title = post.css('.job-title::text').get()
                yield scrapy.request(url=url,'title'@R_155_6964@})
          except Exception e:
             print(E)

        #pagination
        next_page = response.css('.pagination li:last-child a::attr(href)').get()
        if next_page is not None:
            next_page = 'example.com' + next_page
            yield scrapy.request(url=next_page,callBACk=self.parsE)

    def parse_lisTing(self,responsE):
        yield{
              'url': response.meta['url'],'title': response.meta['title'],'company': response.css('.row:nth-child(1) a::text').get(),'specialty': response.css('.row:nth-child(2) a::text').get(),'city': response.css('.value span:nth-child(1)::text').get(),'state': response.css('.value span+ span::text').get(),'job type': response.css('.row:nth-child(4) .value::text').get(),}

大佬总结

以上是大佬教程为你收集整理的Scrapy Spider 分页提前结束全部内容,希望文章能够帮你解决Scrapy Spider 分页提前结束所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: