Scrapy 爬取动态网站

温馨提示:本文要求对 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 版权协议

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个强大的Python爬虫框架,可用于从互联网上抓取、提取和存储数据。对于爬取招聘网站Scrapy是一个非常理想的选择。 首先,我们需要创建一个Scrapy项目。我们可以使用命令行在所选目录下运行`scrapy startproject job_crawler`来创建一个名为job_crawler的项目。 接下来,我们需要创建一个Spider来定义我们要爬取网站和如何提取数据。在我们的项目中,我们可以使用`scrapy genspider`命令来创建一个基本的Spider模板。例如,我们可以使用命令`scrapy genspider zhaopin zhaopin.com`来创建一个名为zhaopin的Spider,以爬取zhaopin.com网站。 一旦我们有了Spider,我们需要定义如何提取所需的数据。我们可以在Spider中编写响应的代码来提取职位标题、公司名称、薪水等信息。例如,我们可以使用XPath或正则表达式来定位和提取元素。然后,我们可以将提取到的数据存储到本地文件或数据库中,以供后续分析和使用。 当我们完成了Spider的编写,我们可以使用`scrapy crawl`命令来运行爬虫。例如,我们可以使用命令`scrapy crawl zhaopin`来运行我们之前创建的名为zhaopin的Spider,并开始爬取zhaopin.com网站的数据。 最后,我们可以配置Scrapy的一些参数来优化爬虫的性能和效率。例如,我们可以设置下载延迟、并发请求数、UA伪装等来防止反爬虫策略。 总的来说,使用Scrapy爬取招聘网站非常方便和高效,它提供了许多强大的功能和工具,使爬取数据变得简单而灵活。通过编写Spider和配置参数,我们可以轻松地从招聘网站获取所需的职位信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值