Skip to main content
 首页 » 编程设计

Python Scrapy之Ajax 分页 Tripadvisor

2024年10月24日38TianFang

我正在使用 Python-Scrapy 来删除 tripadvisor 成员(member)页面的评论。 这是我正在使用的网址: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` 

请求地址为

 `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 中设置 header 选项

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

如果有人能解释我遗漏的内容并为我指明正确的方向,那就太好了。我已经没有想法了。

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

请您参考如下方法:

使用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