Scrapy+Splash爬取动态加载js的网页数据

HTML渲染分为两类。动态加载和静态加载。静态加载就是整个HTML文档都是有服务器渲染之后,发送给客户端进行展示。但是随着技术拓展,越来越多的网页上的有效数据是通过js动态加载出来的,如果我们还是用传统的方式爬取,那么结果可想而知。今天介绍Scrapy+Splash模拟浏览器行为,动态加载js之后,获取有效数据。

1、安装Scrapy

C:\Users\Administrator>pip install scrapy

#成功标志
Successfully installed Scrapy-1.5.1

2、创建Scrapy项目

C:\Users\Administrator>scrapy startproject ZhipinSpider

#成功标志,在Administrator文件夹下生成一个ZhipinSpider文件夹,结构如下:
ZhipinSpider
    scrapy.cfg
    ZhipinSpider
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders
            __init__.py
            job_position.py
       

 

3、编写类

3.1、job_position.py

# 导入访问MySQL的模块
import mysql.connector


class ZhipinspiderPipeline(object):
    # 定义构造器,初始化要写入的文件
    def __init__(self):
        self.conn = mysql.connector.connect(user='root',
                                            password='root',
                                            host='192.168.36.58', port='3306',
                                            database='directrecruit',
                                            use_unicode=True)
        self.cur = self.conn.cursor()

    # 重写close_spider回调方法,用于关闭数据库资源
    def close_spider(self, spider):
        print('----------关闭数据库资源-----------')
        # 关闭游标
        self.cur.close()
        # 关闭连接
        self.conn.close()

    def process_item(self, item, spider):
        self.cur.execute("INSERT INTO job_inf VALUES(null, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                         (item['title'], item['salary'], item['company'], item['url'], item['work_addr'], item['industry'], item.get('company_size'), item['recruiter'], item['publish_date']))
        self.conn.commit()

3.2、items.py

import scrapy


class ZhipinspiderItem(scrapy.Item):
    # 工作名称
    title = scrapy.Field()
    # 工资
    salary = scrapy.Field()
    # 招聘公司
    company = scrapy.Field()
    # 工作详细链接
    url = scrap
### 使用 Scrapy 爬取动态加载数据的方法 Scrapy 是一个强大的爬虫框架,能够高效地抓取网页数据。然而,当目标网站使用 JavaScript 动态加载内容时,传统的 Scrapy 请求可能无法直接获取到所需数据。为了解决这一问题,可以采用两种主要方式:使用 Splash 渲染引擎或直接调用 API。 #### 1. 使用 Splash 渲染动态页面 Splash 是一个轻量级的浏览器渲染服务,支持通过 Lua 脚本控制页面加载过程。结合 Scrapy 使用,可以轻松抓取动态加载数据。 - **安装依赖** 首先需要安装 Splash 服务器和 `scrapy-splash` 库[^2]。可以通过以下命令完成安装: ```bash pip install scrapy-splash ``` 同时,确保已启动 Splash 服务,默认监听端口为 8050。 - **配置 Scrapy 项目** 在项目的 `settings.py` 文件中添加以下配置项[^2]: ```python # Splash URL SPLASH_URL = 'http://localhost:8050' # 下载中间件 DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, } # Spider 中间件 SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, } # 去重过滤器 DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' ``` - **编写爬虫代码** 在爬虫类中,需将普通的 `Request` 替换为 `SplashRequest`,以便通过 Splash 渲染页面[^3]。例如: ```python import scrapy from scrapy_splash import SplashRequest class DynamicSpider(scrapy.Spider): name = "dynamic" allowed_domains = ["example.com"] def start_requests(self): yield SplashRequest( url='http://example.com', callback=self.parse, endpoint='render.html', # 使用默认的 HTML 渲染端点 args={'wait': 2} # 等待页面加载完成 ) def parse(self, response): # 提取动态加载数据 items = response.css('selector::text').getall() for item in items: yield {'data': item} ``` #### 2. 使用 API 方式抓取动态数据 许多现代网站会通过 AJAX 请求从后端 API 获取数据。这种方式避免了对前端渲染的依赖,效率更高。 - **分析网络请求** 使用浏览器开发者工具(F12),切换到“Network”标签页,观察页面加载过程中发出的 API 请求。通常这些请求会返回 JSON 格式的数据。 - **模拟 API 请求** 在 Scrapy 中直接发送请求到 API 地址,提取所需的 JSON 数据。例如: ```python import scrapy import json class ApiSpider(scrapy.Spider): name = "api" allowed_domains = ["example.com"] def start_requests(self): api_url = "https://example.com/api/data" yield scrapy.Request(url=api_url, callback=self.parse) def parse(self, response): data = json.loads(response.text) for item in data['items']: yield {'name': item['name'], 'value': item['value']} ``` #### 3. 对比两种方式 - **Splash**:适用于复杂页面,尤其是需要执行 JavaScript 或等待页面加载完成的情况。但性能较低,资源消耗较大。 - **API**:更高效、更简洁,适合目标数据直接暴露在后端接口中的场景。 --- ### 注意事项 - 如果选择 Splash,确保其服务正常运行,并根据需求调整 Lua 脚本逻辑[^4]。 - 在使用 API 抓取时,注意遵守目标网站的robots.txt规则及法律法规。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值