如何下载一个文件,下载按钮会弹出一个带有刮刀的弹出窗口?

时间:2017-05-19 11:54:00

标签: python web-scraping scrapy

我正在尝试从https://www.apkmirror.com/apk/google-inc/youtube/youtube-12-19-56-release/youtube-12-19-56-android-apk-download/等网站下载APK。当您单击“下载APK”按钮时,在Tor浏览器中会弹出一个弹出窗口,让您可以选择打开或保存文件(参见下文)。

enter image description here

我想保存文件。

到目前为止,我已尝试使用以下蜘蛛使用Scrapy:

import scrapy
from apkmirror.items import ApkmirrorItem

class ApkmirrorScraperSpider(scrapy.Spider):
    name = "apkmirror-scraper"
    allowed_domains = ["apkmirror.com"]
    # start_urls = ['https://www.apkmirror.com/apk/google-inc/youtube/youtube-12-19-56-release/youtube-12-19-56-android-apk-download/']

    custom_settings = {'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'}

    def start_requests(self):
        urls = ['https://www.apkmirror.com/apk/google-inc/youtube/youtube-12-19-56-release/youtube-12-19-56-android-apk-download/']
        for url in urls:
            request = scrapy.Request(url=url, callback=self.parse)
            request.meta['proxy'] = "http://localhost:8118"
            yield request

    def parse(self, response):
        item = ApkmirrorItem()

        icon_relative_link = response.css('.siteTitleBar').xpath('.//img/@src').extract_first()
        icon_link = response.urljoin(icon_relative_link)
        item['image_urls'] = [icon_link]

        download_relative_link = response.css('.downloadButton').xpath('.//@href').extract_first()
        download_link = response.urljoin(download_relative_link)
        item['file_urls'] = [download_link]

        yield item

我在后台运行rdsubhas/tor-privoxy容器以确保匿名。 (如果您在'proxy'中注释掉start_requests行,或者在start_urls行中发表评论并注释掉整个start_requests方法,那么蜘蛛也应该在没有代理的情况下工作。

items.py我已根据https://doc.scrapy.org/en/latest/topics/media-pipeline.html包含了必填字段:

import scrapy

class ApkmirrorItem(scrapy.Item):
    image_urls = scrapy.Field()
    images = scrapy.Field()

    file_urls = scrapy.Field()
    files = scrapy.Field()

并在settings.py我已启用管道,如下所示:

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1,
    'scrapy.pipelines.files.FilesPipeline': 1
}

IMAGES_STORE = '/tmp/apkmirror_test/images'
FILES_STORE = '/tmp/apkmirror_test/files'

问题是文件下载不起作用。在scrapy crawl apkmirror-scraper之后,/tmp/apkmirror_test目录如下所示:

.
├── files
└── images
    └── full
        └── 5b3da62a528963315dd0b608528a04adb061a592.jpg

因此,虽然已下载图像,但APK文件尚未下载。

为什么Scrapy的FilePipeline在这种情况下不起作用?我怎么去下载文件?

1 个答案:

答案 0 :(得分:1)

这对于正确答案来说还不够,但我无法发表评论,所以......

我会检查的事情:

  1. 您正在使用Tor浏览器并说当您单击下载按钮时它会为您提供下载选择框。对我来说,它会打开“https://www.apkmirror.com/apk/google-inc/youtube/youtube-12-19-56-release/youtube-12-19-56-android-apk-download/download/”(注意/下载/结尾),等待几秒钟。也许试着刮一下?
    1. 如果您主要想要的是下载,您可以尝试浏览所述/ download / page的元素,或者甚至可能根据帖子ID自行生成链接,例如:
  2. 我们知道页面的类是:<body class="apps_post-template-default single single-apps_post postid-215041 single-author sidebar" role="document">

    因此postid是215041

    然后,我们可以使用下载页面<a rel="nofollow" data-google-vignette="false" href="/wp-content/themes/APKMirror/download.php?id=215041">here</a>

    上的链接

    直接从https://www.apkmirror.com/wp-content/themes/APKMirror/download.php?id=215041

    窃取它

    但是......如果我们用另一个链接尝试这个,它会失败,给我们403 Forbidden。因此,cookie或推荐人可能会发生一些事情。我注意到_gid是唯一改变的cookie,但这并不意味着它是罪魁祸首。

    所以也许你需要一些中间件。