Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scrapy:从按钮单击查找HTTP调用_Scrapy - Fatal编程技术网

Scrapy:从按钮单击查找HTTP调用

Scrapy:从按钮单击查找HTTP调用,scrapy,Scrapy,我正试图用Scrapy从Flip.com/weekly\u广告中抓取传单。在抓取传单之前,我需要输入我的区号,然后搜索本地传单(在网站上,这是通过单击按钮完成的) 我试图输入一个值,并使用Scrapy模拟“单击按钮” 最初,我认为我可以使用FormRequest.from_响应来搜索表单,并输入我的区号作为值。但是,按钮是用javascript编写的,这意味着找不到表单 因此,我尝试通过Inspect Element>Developer Tools>Network>XHR查找HTTP调用,以查看

我正试图用Scrapy从Flip.com/weekly\u广告中抓取传单。在抓取传单之前,我需要输入我的区号,然后搜索本地传单(在网站上,这是通过单击按钮完成的)

我试图输入一个值,并使用Scrapy模拟“单击按钮”

最初,我认为我可以使用FormRequest.from_响应来搜索表单,并输入我的区号作为值。但是,按钮是用javascript编写的,这意味着找不到表单

因此,我尝试通过Inspect Element>Developer Tools>Network>XHR查找HTTP调用,以查看是否有任何调用会加载带有新输入的区号(我的区号)的等效Flip页面

现在,我对Scrapy和HTTP请求/响应非常陌生,因此我不确定我找到的链接是否正确(例如,带有新区号的响应)

这是我找到的请求:

我对请求使用了任意邮政编码(90210)

我怀疑这是不正确的请求,但如果我错了,这是正确的:

在维护新区号的同时,如何从此请求导航到-flip.com/weekly_ads/groceries

如果这是不正确的:

如何输入javascript按钮的值,并使用Scrapy获得结果

import scrapy
import requests
import json

class flippSpider(scrapy.Spider):
    name = "flippSpider"
    postal_code = "M1T2R8"
    start_urls = ["https://flipp.com/weekly_ads"]

    def parse(self, response): #Input value and simulate button click
        return Request() #Find http call to simulate button click with correct field/value parameters

    def parse_formrequest(self, response):
        yield scrapy.Request("https://flipp.com/weekly_ads/groceries", callback= self.parse_groceries)

def parse_groceries(self, response):
        flyers = []
        flyer_names = response.css("class.flyer-name").extract()
        for flyer_name in flyer_names:
            flyer = FlippspiderItem()
            flyer["name"] = flyer_name
            flyers.append(flyer)
            self.log(flyer["name"])
            print(flyer_name)
        return flyers
我希望在XHR链接中找到实际的javascript按钮请求,但我找到的那个似乎不正确

编辑:我不想使用Selenium,它很慢,而且我不想在执行spider时弹出浏览器

我怀疑这是不正确的请求,但如果我错了,这是正确的:

这是正确的URL,以获取该网站所需的数据;当你进入
flip.com/weekly\u ads/groceries
时,你在屏幕上看到的东西就是用HTML打包数据

在维护新区号的同时,如何从此请求导航到-flip.com/weekly_ads/groceries

我敢肯定你问错了问题。你不需要——事实上,导航到
flip.com/weekly\u ads/groceries
无论如何都不会做你想做的事。您可以观察到,当您单击“杂货店”时,内容会发生变化,但浏览器不会导航到任何新页面,也不会发出新的XHR请求。因此,您需要的一切都在JSON中。现在的情况是,他们正在使用
传单。*.categories
(包含
“食品杂货”
)来缩小129张传单的范围,只返回与食品杂货相关的传单

至于“维护新的区号”,这是一个类似的“错误问题”,因为XHR返回的每一条数据都与所讨论的邮政编码有关。因此,您不需要重新提交任何内容,我也不希望从您的
邮政编码=90210
请求返回的任何数据包含
30309
(或任何)数据


信不信由你,你实际上处于一个很好的位置:你不需要处理复杂的CSS或XPath查询来将数据从HTML的牢笼中解放出来:它们非常友好,可以为你的数据提供一个API。您只需将内容从其结构中解压到您自己的结构中即可。

谢谢您的回答,我有正确的URL,这让我非常放心。2个快速跟进问题:我注意到URL中的“sid”参数,我假设它是某种标识唯一用户的ID。我是否能够更改邮政编码值以使用此“sid”从任意邮政编码中刮取传单?其次,如果这个程序被多个用户使用,他们是否也可以使用这个URL来抓取传单,但使用他们的邮政编码?我实际上在请求中找不到任何其他对该
sid
的引用,因此它也可能是一个“缓存破坏”参数。当然,试着把它放下,看看会发生什么。我猜
邮政编码
sid
是不相关的,但只有实验才能确定。是的,我希望任何数量的人都可以使用这个URL,因为根据定义,当他们在浏览器中加载站点时,他们已经在做了,只是在没有“sid”参数的情况下尝试了它,除了HTML开头的几行之外,似乎完全一样。但我不知道它能做什么。谢谢你的帮助!