python - 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.下载单词
此链接是根据会话 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 和查看器链接下载文件
解决方案
该错误可能暗示缺少其他内容以完全处理您的请求:
使用requests.get
python 的请求库,您可以在 .旁边添加参数params
和标头。您可以通过curl下载来检索这些附加参数,并将 curl 转换为 python 请求。在大多数情况下,这对我有用。curl 模仿网络交互,包括整个浏览器会话。headers
cookies
然后,你会得到类似的东西:
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中实现它)。
推荐阅读
- html - HTML:在多列中拆分列表
- django - 如何根据 django 模型中的总购买价格计算积分?
- java - 问一个关于http请求头的问题:connections: keep alive
- c - Visual Studio 2019 中的乱码字符
- c# - System.Text.Json 抛出 TypeInitializationError
- linux - opensuse 13 企业 crontab 不会执行 jar 文件
- python - 使用 Python 和 Paramiko 连接到自定义 SSH 子系统(HP NonStop 上的 TACL 进程)
- java - 如何在注释处理器中访问封闭元素的变量注释?
- android - 使用 Google 登录无法在 Android 上运行(仅在 iOS 上) - Flutter
- xamarin - 当我使用对象属性(get-set)时,Xamarin 表单崩溃的 android 项目