开发者社区> luneice> 正文

Scrapy 爬取动态网站

简介: scrapy + selenium + headless 爬取动态网站,完美解决了因调用 chrome headless 导致内存泄漏
+关注继续查看

温馨提示:本文要求对 scrapy 有一定基础认识

在原 scrapy 中,爬取的页面是文本,也就是单纯的文字。而对于动态网站而言,需要执行一些 javascript 脚本,才能加载出真正的页面,比如网易云音乐,而想要爬取这些网站通常需要借助一些可以执行 javascript 脚本的中间件来完成,本文使用的是 Chrome ,换成其他也无压力

scrapy + selenium + headless

selenium 似乎是被用来做自动化测试的 Python 库
headless 是 Chrome 的没有 UI 的浏览器,用来提高爬取速度去掉 UI,不需要额外安装只需安装较高版本的 Chrome 就可以使用 headlessle, 但是需要额外安装驱动,即 chromedriver ,没有安装 chromedriver 会报错,如何安装 chromedriver 请阅读其他博客。

爬取动态网站时,需要开启中间件,官方文档是这样激活中间件的,在 settings.py 中找到

# Enable or disable downloader middlewares
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
# DOWNLOADER_MIDDLEWARES = {
    # #'yourprojectname.middlewares.yourprojectnameDownloaderMiddleware': 543,
#}

然后去掉注释

# Enable or disable downloader middlewares
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
 DOWNLOADER_MIDDLEWARES = {
  'yourprojectname.middlewares.yourprojectnameDownloaderMiddleware': 543,
 }

最开始我是在中间件中实例化 chrome 导致,爬虫开启一次就实例化一次,如果 browser 用完就关闭,使用时实例化,爬取的速度很慢,每一个 request 请求都会调用 process_request 方法,导致操作系统频繁打开关闭 chrome,而不这么做,久而久之内存泄漏导致电脑卡死。为了解决完美解决这一点,实例化 chrome headless 时,放在 spider 中,具体做法如下:

进入 middlewares.py 定义自己的下载中间件

.
.
.
class BrowserDownloaderMiddleware(object):
    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)
        pass

    def process_request(self, request, spider):
        # 如果爬虫的名字为music则请求在这里处理
        if spider.name == 'spider_name':
            browser = spider.browser
            browser.get(request.url)  # 打开这个页面
            body = browser.page_source.encode('utf8')
            return HtmlResponse(url=request.url, body=body)  # 将下载好的页面返回出去
        else:
            return None

    def process_response(self, request, response, spider):
        return response
.
.
.

进入 /spiders/yourspider.py 定义自己的下载中间件
官方文档中给出:close 方法,在爬虫关闭时掉用,而 __init__方法在类实例化时自动调用,不知道为何 __del__ 在 scrapy 中没有调用。

.
.
.
    def __init__(self, *args, **kwargs):
        super(YourSpider, self).__init__(*args, **kwargs)
        options = webdriver.ChromeOptions()
        options.add_argument("--headless")
        options.add_argument("--disable-gpu")
        self.browser = webdriver.Chrome(chrome_options=options)
        pass

    def close(self, reason):
        self.browser.close()
        pass
.
.
.

这样一来,通过 spider 对象将 browser 携带给中间件,完美解决了内存泄漏问题,同时爬取的速度也很快。

luneice 版权协议

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
基于Scrapy爬取伯乐在线网站
标题中的英文首字母大写比较规范,但在python实际使用中均为小写。 2018年7月20日笔记 Scrapy官方文档网址:https://doc.scrapy.
996 0
Scrapy爬取makepolo网站数据深入详解
题记 之前对爬虫只是概念了解多,实战少。知道网上流行的有号称免费的八爪鱼等(实际导出数据收费)。 大致知道,所有爬虫要实现爬取网页信息,需要定义正则匹配规则。
62 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28021 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20124 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23538 0
Scrapy 爬取动态网站
scrapy + selenium + headless 爬取动态网站,完美解决了因调用 chrome headless 导致内存泄漏
2516 0
如何为网站制作Sitemap
如何为网站制作Sitemap要点 1、对于内容比较少的网站,可以采用最简单的txt格式sitemap进行,如:https://www.fgba.net/sitemap.txt 把能找到的URL一一罗列其中即可。
92 0
经典网页设计:20个美丽的 iPhone App 网站设计
  经常能看到很多精心设计的精美 iPhone 应用程序网站。似乎设计师都很喜欢 Apple 风格的设计,创造干净,简单和优雅的网站。设计师创造鼓舞人心的布局,用漂亮的图片,大量的空白和漂亮的版式,而不是简单地创建一个随机的页面来显示他们的应用程序。
1079 0
+关注
luneice
知我者谓我心忧,不知我者谓我何求。
9
文章
9
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载