【问题标题】:Python Scrapy - Ajax Pagination TripadvisorPython Scrapy - Ajax 分页 Tripadvisor
【发布时间】:2017-08-22 20:52:18
【问题描述】:

我正在使用 Python-Scrapy 来删除tripadvisor 会员页面的评论。 这是我正在使用的网址:http://www.tripadvisor.com/members/scottca075

我可以使用 scrapy 获取第一页。我一直无法获取其他页面。在单击“下一步”按钮时,我在浏览器的 Network 选项卡中观察到 XHR 请求。

发送一个 GET 和一个 POST 请求: 在检查 GET 请求的参数时,我看到了:

action : undefined_Other_ClickNext_REVIEWS_ALL
gaa : Other_ClickNext_REVIEWS_ALL
gal : 50
gams : 0
gapu : Vq85qQoQKjYAABktcRMAAAAh
gass : members`

请求的url是

 `http://www.tripadvisor.com/ActionRecord?action=undefined_Other_ClickNext_REVIEWS_ALL&gaa=Other_ClickNext_REVIEWS_ALL&gal=0&gass=members&gapu=Vq8xPAoQLnMAAUutB9gAAAAJ&gams=1`

参数gal代表偏移量。每页有 50 条评论。通过单击下一步按钮移动到第二页时,参数gal 设置为50。然后,100,150,200..等等。

我想要的数据是 json 格式的 POST 请求。 Image of JSON data in POST request。 post请求上的请求url是http://www.tripadvisor.com/ModuleAjax?

我对如何在 scrapy 中发出请求以获取数据感到困惑。 我尝试使用FormRequest 如下:

pagination_url = "http://www.tripadvisor.com/ActionRecord"
form_date = {'action':'undefined_Other_ClickNext_REVIEWS_ALL','gaa':'Other_ClickNext_REVIEWS_ALL', 'gal':'0','gams':'0','gapu':'Vq8EngoQL3EAAJKgcx4AAAAN','gass':'members'}
FormRequest(url=self.pagination_url, formdata=formdata, callback=self.parseItem)

我也尝试在 FormRequest 中设置标题选项

headers = {'Host':'www.tripadvisor.com','Referer':'http://www.tripadvisor.com/members/prizm','X-Requested-With': 'XMLHttpRequest'}

如果有人能解释我所缺少的并指出我正确的方向,那就太好了。我的想法已经用完了。

而且,我知道我可以使用硒。但我想知道是否有更快的方法来做到这一点。

【问题讨论】:

    标签: python ajax pagination web-scraping scrapy


    【解决方案1】:

    使用 ScrapyJS - Scrapy+JavaScript 集成

    要在您的项目中使用 ScrapyJS,您首先需要启用中间件:

    DOWNLOADER_MIDDLEWARES = {
        'scrapyjs.SplashMiddleware': 725,
    }
    

    例如,如果我们想检索页面呈现的 HTML,我们可以这样做:

        import scrapy
    
        class MySpider(scrapy.Spider):
        start_urls = ["http://example.com", "http://example.com/foo"]
    
        def start_requests(self):
            for url in self.start_urls:
                yield scrapy.Request(url, self.parse, meta={
                    'splash': {
                        'endpoint': 'render.html',
                        'args': {'wait': 0.5}
                    }
                })
    
        def parse(self, response):
            # response.body is a result of render.html call; it
            # contains HTML processed by a browser.
            # …
    

    一个常见的场景是用户需要在页面显示之前点击一个按钮。我们可以使用带有 Splash 的 jQuery 来处理这个问题:

    function main(splash)
        splash:autoload("https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js")
        splash:go("http://example.com")
        splash:runjs("$('#some-button').click()")
        return splash:html()
    end
    

    更多详情check here

    【讨论】:

      【解决方案2】:

      所以你做得对, 在 FormRequest 前面添加 yield 为:

      yield FormRequest(''')
      

      其次关注gal的值,因为它是这里唯一改变的参数,不要保持gal = "0"。

      求评论总数,从 50 到总页面数,每次请求增加 50。

      form_date = {'action':'undefined_Other_ClickNext_REVIEWS_ALL','gaa':'Other_ClickNext_REVIEWS_ALL', 'gal':reviews_till_this_page,'gams':'0','gapu':'Vq8EngoQL3EAAJKgcx4AAAAN','gass':'members'}
      

      【讨论】:

        猜你喜欢
        • 2017-12-25
        • 2015-02-14
        • 1970-01-01
        • 2023-03-13
        • 2017-10-30
        • 1970-01-01
        • 2015-07-23
        • 2021-01-04
        • 1970-01-01
        相关资源
        最近更新 更多