深度剖析Selenium与Scrapy的黄金组合:实现动态网页爬虫

亿牛云 (2).png 在当今互联网时代,大量网站采用动态网页技术呈现信息,这给爬虫技术提出了新的挑战。本文将带您深入探讨如何应对动态网页的爬取难题,结合Python爬虫框架Scrapy和自动化测试工具Selenium进行实战,为您揭示动态网页爬取的技术奥秘。

动态网页与传统爬虫的对比

传统爬虫主要通过直接请求页面获取静态源代码,但动态网页通过JavaScript等技术在浏览器中进行数据加载,导致源代码不完整。解决这一问题的利器是结合Scrapy和Selenium,使我们能够模拟浏览器操作,获取完整渲染后的页面数据。

Scrapy与Selenium的黄金组合

Scrapy是Python中强大的爬虫框架,拥有强大的页面解析和异步处理功能。结合Selenium,我们能够模拟用户在浏览器中的交互,获取动态加载后的页面内容。这两者的协同工作,为动态网页爬取提供了一种高效可行的解决方案。

实战经验总结

在实际应用中,首先确保Scrapy和Selenium已正确安装,并配置好ChromeDriver等必要工具。接着,创建Scrapy项目,添加Selenium中间件,进而实现动态网页的爬取。

具体实现过程

Selenium中间件:穿越动态网页的障碍

在middlewares.py文件中,我们设置了Selenium的中间件,为Scrapy赋予了穿越动态网页障碍的能力。这段代码展示了如何利用Selenium模拟浏览器操作,获取完整渲染后的页面数据。让我们逐步解析这个神奇的中间件。

# 在middlewares.py文件中设置Selenium的中间件
from scrapy import signals
from scrapy.http import HtmlResponse
from selenium import webdriver

class SeleniumMiddleware:
    @classmethod
    def from_crawler(cls, crawler):
        middleware = cls()
        crawler.signals.connect(middleware.spider_opened, signals.spider_opened)
        return middleware

    def process_request(self, request, spider):
        driver = webdriver.Chrome()
        driver.get(request.url)
        body = driver.page_source
        return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)

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

  • process_request方法中,我们创建了一个Chrome浏览器的实例,加载目标网页,获取完整的页面源代码,然后封装成HtmlResponse对象返回给Scrapy。
  • spider_opened方法用于在Spider启动时输出一条日志信息,以便我们追踪Spider的运行情况。
动态网页爬虫:解析并收割信息的艺术

动态网页爬虫的代码段展示了如何创建一个名为dynamic_spider.py的文件,实现基于Scrapy框架的动态网页爬取。这个Spider将从’example.com’开始,通过XPath表达式解析页面,提取标题和内容,并将结果保存在指定的item中。

import scrapy
from scrapy.http import Request
from dynamic_spider.items import DynamicSpiderItem

class DynamicSpider(scrapy.Spider):
    name = 'dynamic_spider'
    start_urls = ['http://example.com']

    def start_requests(self):
        proxyHost = "www.16yun.cn"
        proxyPort = "5445"
        proxyUser = "16QMSOML"
        proxyPass = "280651"

        proxy_url = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
        yield Request(self.start_urls[0], callback=self.parse, meta={'proxy': proxy_url})

    def parse(self, response):
        item = DynamicSpiderItem()
        item['title'] = response.xpath('//h1/text()').get()
        item['content'] = response.xpath('//p/text()').get()
        yield item

  • parse方法中,我们使用XPath表达式提取了目标网页中的标题和内容,然后将结果封装成一个item,并通过yield语句传递给Scrapy框架。
实际应用:将代码放置于Scrapy项目中

在实际应用中,将上述两段代码分别放置在Scrapy项目的middlewares.py和spiders文件夹下的dynamic_spider.py文件中,即可运行动态网页爬虫。

5. 性能优化与注意事项

  • 设置合理的爬取速度控制爬取速度,避免对目标网站造成不必要的负担,同时可以设置随机的User-Agent来模拟不同用户的访问。
  • 处理动态加载的数据使用Selenium等待特定的元素加载完成,确保数据完全呈现在页面上再进行提取。
  • 应对反爬手段一些网站采用反爬虫技术,通过设置User-Agent、Cookie等信息来检测爬虫行为,需要在爬虫中模拟真实用户的访问行为。
---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

### Thymeleaf入门指南 #### 什么是Thymeleaf? Thymeleaf 是一种现代服务器端 Java 模板引擎,用于生成动态 Web 内容。它支持 HTML、XML、JavaScript 和 CSS 文件中的模板处理[^1]。 --- #### 如何配置Thymeleaf? 在 Spring Boot 中,默认已经集成了 Thymeleaf 的依赖项。如果需要自定义配置,可以在 `application.properties` 或 `application.yml` 文件中设置属性。例如: ```properties spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.mode=HTML spring.thymeleaf.cache=false ``` 上述配置中,`spring.thymeleaf.cache=false` 表示关闭页面缓存功能,这有助于开发阶段实时查看页面修改效果。 --- #### 数据传递至前端的方式 通过控制器向模型添加数据后,在 Thymeleaf 页面中可以通过 `${}` 占位符访问这些变量。例如: ```java @Controller public class HelloController { @GetMapping("/greeting") public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) { model.addAttribute("name", name); return "greeting"; } } ``` 对应的 Thymeleaf 页面代码如下: ```html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Greeting</title> </head> <body> <p th:text="'Hello, ' + ${name} + '!'" /> </body> </html> ``` 此方法允许将后台传来的数据嵌入到静态 HTML 文档中并渲染给客户端[^3]。 --- #### JavaScriptThymeleaf集成 当需要将后端数据传递到前端的 JavaScript 脚本时,可以利用 Thymeleaf 提供的特殊标签实现。以下是两种常见方式: ##### 方法一:直接赋值 ```html <script th:inline="javascript"> var size = [[${test.size()}]]; console.log(size); </script> ``` 此处 `[[]]` 结构表示将表达式的计算结果注入到脚本中[^2]。 ##### 方法二:条件判断 对于更复杂的逻辑操作,比如仅在特定条件下执行某些脚本语句,则可采用以下形式: ```html <script th:inline="javascript"> /*[# th:if="${test.size() eq 3}"]*/ console.info('Size is three'); /*[/]*/ </script> ``` 这种写法类似于 JSP EL 表达式中的 `<c:if>` 标签。 --- #### 控制器编写实例 下面展示了一个简单的 Controller 类,演示如何返回视图以及携带消息参数: ```java import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HelloController { @GetMapping("/hello") public String hello(Model model){ model.addAttribute("message", "你好,世界!"); return "index"; // 返回名为 index.html 的模板文件 } } ``` 这里的关键在于使用 `Model` 对象存储要共享的数据,并指定目标视图名称以便加载相应的模板资源。 --- #### 总结 以上介绍了关于 Thymeleaf 基础概念及其基本应用技巧的内容,包括但不限于基础配置调整、前后端交互机制探讨等方面的知识点。希望对你有所帮助! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值