首页 > 解决方案 > Scrapy中如何下载根据Cookies url生成的文件

问题描述

我正在尝试下载根据某些 Cookie 生成下载链接的文件。我有一个显示在查看器中的 PDF 文件,该查看器有一个下载按钮在此处输入图像描述。当我点击这个图标时,会根据 HTML 中的 hidden_​​document_field_id 输入值生成一个临时下载链接

在此处输入图像描述

所以这种情况下的临时下载链接是三件事的结合:

1.基本网址链接(https://onlineservices.miami-dadeclerk.com/officialrecords/

2.输入值(DocumentHandler.axd/docs/304e6a24-0dbe-489d-b8a1-9a947d447136/rev1)

3.下载单词

完整链接https://onlineservices.miami-dadeclerk.com/officialrecords/DocumentHandler.axd/docs/304e6a24-0dbe-489d-b8a1-9a947d447136/rev1/download

此链接是根据会话 cookie 等一些 Cookie 生成的,这意味着除非您拥有我的 cookie,否则此链接对您无效。

我尝试使用 Scrapy 下载文件,但出现 500 内部服务器错误,我不知道发生了什么,我已经设置了该网站使用的所有 cookie

class TestSpider(scrapy.Spider):
    name = "test_spider"

    def start_requests(self):
        url = "https://onlineservices.miami-dadeclerk.com/officialrecords/StandardSearch.aspx"
        yield scrapy.Request(url=url, callback=self.med)

    def med(self,response):
        yield scrapy.Request(url="https://onlineservices.miami-dadeclerk.com/officialrecords/CFNDetailsHTML5.aspx?QS=5p8%2fNlBjKYBarc%2fJA16mTghonf9CxQ8L9b1X0TFjFkhkowtaD%2b8z7w%3d%3d", callback=self.parse,cookies={'AspxAutoDetectCookieSupport': '1'})

    def parse(self, response):
        cookies = response.request.headers
        print(cookies)
        start_link = "https://onlineservices.miami-dadeclerk.com/officialrecords/"
        body = response.css('#hidden_document_field_id::attr(value)').get()
        end_link = "/download"
        full_link = start_link + body + end_link
        item = MyItem()
        item["file_urls"] = [full_link]
        yield item

代码很短,创建了一个简单的 start_request 以获得基本的 cookie,然后我使用 med 请求添加 AspxAutoDetectCookieSupport cookie,由于某种原因在开始时没有添加最后我建立了完整的链接

我的饼干:

{b'Referer': [b'https://onlineservices.miami-dadeclerk.com/officialrecords/StandardSearch.aspx?AspxAutoDetectCookieSupport=1'], b'Accept': [b'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'], b'Accept-Language': [b'en'], b'User-Agent': [b'Mozilla/5
.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'], b'Accept-Encoding': [b'gzip,deflate'], b'Cookie': [b'AspxAutoDetectCookieSupport=1; NSC_JOohzzemcpqd5cxccsdmkpe5tar0zcM=ffffffff09303a5345525d5f4f58455e445a4a42378b;
 AspxAutoDetectCookieSupport=1; ASP.NET_SessionId=2kudtndycb15ffk2fsjtqyer']}

P'S:我不想修复我的代码。P'S:我意识到网站后端是用 .NET 制作的。

我正在寻找使用 Scrapy 和查看器链接下载文件

标签: python.netcookiesscrapy

解决方案


该错误可能暗示缺少其他内容以完全处理您的请求:

使用requests.getpython 的请求库,您可以在 .旁边添加参数params和标头。您可以通过curl下载来检索这些附加参数,并将 curl 转换为 python 请求。在大多数情况下,这对我有用。curl 模仿网络交互,包括整个浏览器会话。headerscookies

然后,你会得到类似的东西:

    def parse(self, response):
            cookies = { "PHPSESSID" : #your session id}
            headers = { ... } # "User-Agent", "Accept", "Accept-Language", "Referer", "DNT", "Connection"
            ...

    def med(self,response):
            requests.get(url="...",cookies=cookies, headers=headers, params=params}

获取 curl 并将其转换为 python 请求库的参数的说明:https ://curl.trillworks.com/

希望这会有所帮助,即使它会更改您的代码(我不确定如何在scrapy中实现它)。


推荐阅读