我正在尝试从https://www.apkmirror.com/apk/google-inc/youtube/youtube-12-19-56-release/youtube-12-19-56-android-apk-download/等网站下载APK。当您单击“下载APK”按钮时,在Tor浏览器中会弹出一个弹出窗口,让您可以选择打开或保存文件(参见下文)。
我想保存文件。
到目前为止,我已尝试使用以下蜘蛛使用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
在这种情况下不起作用?我怎么去下载文件?
答案 0 :(得分:1)
这对于正确答案来说还不够,但我无法发表评论,所以......
我会检查的事情:
我们知道页面的类是:<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,但这并不意味着它是罪魁祸首。
所以也许你需要一些中间件。