【问题标题】:Duplicates in asp.net pagination when scraping?抓取时在asp.net分页中重复?
【发布时间】:2018-04-26 07:02:16
【问题描述】:

我正在抓取这个 asp.net 站点,因为请求 url 是相同的,所以 Scrapy dupefilter 不起作用。结果,我得到了大量重复的 url,这使我的蜘蛛无限运行。我该如何处理?

我的代码如下所示。

if '1' in page:

            target =  response.xpath("//a[@class = 'dtgNormalPage']").extract()[1:]
            for i in target:
                i = i.split("'")[1]
                i = i.replace('$',':')
                yield  FormRequest.from_response(response,url,  callback = self.pages, dont_filter = True,
                formdata={'__EVENTTARGET':  i,

                            })  

我尝试添加一组来跟踪页码,但不知道如何处理导致接下来 10 页的“...”。

if '1' in page:

            target =  response.xpath("//a[@class = 'dtgNormalPage']")
            for i in target[1:]:
                page =  i.xpath("./text()").extract_first()
                if page in self.pages_seen:
                    pass
                else:
                    self.pages_seen.add(page)
                    i = i.xpath("./@href").extract_first()
                    i = i.split("'")[1]
                    i = i.replace('$',':')
                    yield  FormRequest.from_response(response,url,  callback = self.pages, dont_filter = True,
                    formdata={'__EVENTTARGET':  i,

                                }) 
              self.pages_seen.remove('[ ... ]')   

我设置的线程越多,我收到的副本就越多。 所以看起来到目前为止唯一的解决方案是将 thread_count 减少到 3 或更少。

【问题讨论】:

  • 我认为在这里收集 url 不是最好的方法,当你点击另一个页面时页面 url 通常会发生变化,如果没有,请打开网络选项卡,单击链接,查看提出的请求并将其复制到scrapy中。如果您提供链接,我很乐意查看它
  • @Rafael Almeida 感谢您的回复。我没有收集网址。我正在收集页码,这是我能想到的唯一唯一标识符。看起来它到目前为止有效。

标签: asp.net python-2.7 web-scraping scrapy


【解决方案1】:

我不确定我是否理解正确,但 asp.net 通常非常依赖 cookie 来提供内容。所以在爬asp.net网站的时候要使用scrapy的cookiejar功能:

class MySpider(Spider):
    name = 'cookiejar_asp'

    def start_requests():
        for i, url in enumerate(start_urls):
            yield Request(url, meta={'cookiejar': i})

    def parse(self, response):
        # Keep in mind that the cookiejar meta key is not “sticky”. You need to keep passing it along on subsequent requests. For example:
        return Request(
            "http://www.example.com/otherpage",
            callback=self.parse_other_page
            meta={'cookiejar': response.meta['cookiejar']},  # <--- carry over cookiejar
        )

在此处阅读有关 cookiejar 的更多信息: https://doc.scrapy.org/en/latest/topics/downloader-middleware.html?highlight=cookiejar#multiple-cookie-sessions-per-spider

【讨论】:

  • OP 询问如何在FormRequest.from_responseFormRequest.from_response 时防止重复的表单帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2021-03-31
  • 1970-01-01
  • 2011-09-02
  • 2013-01-23
  • 2011-12-07
相关资源
最近更新 更多