龙空技术网

Python 爬虫之强大的 Scrapy

跟风散人 284

前言:

目前姐妹们对“scrapy对接selenium”都比较关注,朋友们都需要了解一些“scrapy对接selenium”的相关文章。那么小编在网摘上汇集了一些有关“scrapy对接selenium””的相关知识,希望各位老铁们能喜欢,小伙伴们快快来了解一下吧!

#python编程##python##黑客攻击##scrapy爬虫#

一、Scrapy 简介与优势

介绍 Scrapy 是一个强大的 Python 爬虫框架,具有高速度、灵活性和易用性等特点。

(一)多种框架对比显优势

Scrapy 作为 Python 爬虫框架中的佼佼者,与其他框架相比具有显著优势。与 Beautiful Soup 相比,Scrapy 是一个框架,而 Beautiful Soup 是一个 HTML 和 XML 解析库。Scrapy 具有高性能、可扩展性强、内置多种数据格式支持以及优秀的 SEO 能力等特点。Beautiful Soup 则更适合对小规模的 HTML 和 XML 文件进行针对性解析,它可以将 HTML 和 XML 文件转换为 Python 的数据结构,并使用类似于正则表达式的语法来查找和提取数据,还能解决一些 HTML 和 XML 中的格式问题。

与 Selenium 相比,Scrapy 主要用于抓取网站数据并提取结构化数据,而 Selenium 是一个用于 Web 应用程序测试的工具,虽然也能用于爬虫,但更擅长模拟用户在浏览器中的操作,处理动态网页、JavaScript 渲染等方面具有独特优势。例如,在模拟登录网站时,Selenium 更加方便,因为它擅长寻找元素并操作它们,而 Scrapy 在这方面可能会变得相当复杂。

与 PyQuery 相比,Scrapy 功能更加强大,不仅可以处理静态网页,还能应对动态网页和复杂的网站结构。PyQuery 则类似于 jQuery 的风格,适合处理静态页面,但对于动态页面可能不够强大,且功能相对较为简单。

(二)Scrapy 的独特之处

Scrapy 采用异步 IO 的方式进行网络请求,这使得它能够同时发送多个异步请求,并立即返回所有响应,大大提高了爬虫的速度和效率。例如,在处理大量数据和更新时,采用异步 IO 模型能够提高数据处理的效率和准确率。

Scrapy 的可扩展性强,其架构非常灵活,并且易于编写和添加模块。通过自定义管道和中间件,使得 Scrapy 可以扩展到各种不同的应用场景。比如,可以根据具体需求添加数据处理管道,对爬取到的数据进行清洗、过滤和存储等操作。

此外,Scrapy 直接支持多种数据格式,包括 JSON、XML、CSV,甚至还支持各种脚本语言的解析以及自定义数据格式的解析。这使得用户在存储和处理数据时更加方便,可以根据不同的需求选择合适的数据格式。

Scrapy 还具有使用方便的特点,它拥有优秀的文档和清晰的 API,使得其易于学习和使用。独特的调试功能和自定义错误处理,可使开发人员轻松地编写和调试 Scrapy 爬虫。

二、Scrapy 的安装与使用(一)安装步骤详解

Scrapy 的安装可以通过两种主要方法进行。一种是使用 pip install scrapy 的命令安装方式,但这种方式可能会因为缺少某些依赖而安装失败。另一种是通过下载特定的 .whl 文件进行安装。首先,确保安装了 Python,推荐使用 Python 2.7,因为 Scrapy 在 Python 2.7 上的兼容性较好。安装 Python 2.7 后,还需要安装一些必要的库,如 pywin32、lxml、OpenSSL 等。

在安装过程中,可能会遇到各种问题。例如,安装时可能会提示缺少 Microsoft Visual C++ 14.0,此时可以通过下载安装 Microsoft Visual C++ Build Tools 来解决,或者尝试安装 twisted 的 .whl 文件。如果遇到 openssl 安装失败,可以通过设置环境变量 CRYPTOGRAPHY_OSX_NO_LINK_FLAGS=1 和 LDFLAGS、CFLAGS 来解决。对于 lxml 安装失败的问题,可以尝试运行 xcode-select --install 来安装 xcode command tools。

(二)使用四步走创建项目:在命令行中使用 scrapy startproject [项目名] 可以创建一个 Scrapy 项目。例如,scrapy startproject my_project 会创建一个名为 my_project 的项目,该项目包含了一些必要的文件和目录,如 settings.py、items.py、pipelines.py 和 spiders 目录等。生成爬虫:进入项目目录后,使用 scrapy genspider [爬虫名] [域名] 可以生成一个爬虫。例如,scrapy genspider my_spider example.com 会生成一个名为 my_spider 的爬虫,该爬虫可以爬取 example.com 域名下的网页。提取数据:在生成的爬虫文件中,可以使用 xpath 或 css 选择器来提取网页中的数据。例如,可以使用 response.xpath('//div[@class="item"]//a/span[1]/text()').extract() 来提取网页中所有 div 标签的 class 属性为 item 的子元素 a 标签下的第一个 span 标签的文本内容。保存数据:Scrapy 提供了多种保存数据的方式。可以使用 scrapy 内置的方式,如 JSON、JSON lines、CSV、XML 等,通过命令 scrapy crawl [爬虫名] -o [文件名].[格式] 来保存数据。也可以自定义管道来保存数据,例如,可以在 pipelines.py 文件中定义一个管道类,实现 process_item 方法来处理爬取到的数据,并将其保存到数据库或文件中。三、Scrapy 的实战案例(一)爬取去哪儿酒店城市列表

首先,使用scrapy startproject qunar创建项目,接着进入项目目录使用scrapy genspider hotel bnb.qunar.com创建爬虫。项目创建好后,创建一个新的Item方便保存所爬取的数据,从爬取页面可以看出,需要两个数据,一个是城市名称,另一个是城市对应的URL。

分析HTML时,按F12进入开发者工具,再按Ctrl + Shift + c进入元素查找状态,找到包裹要爬取内容的div。可以发现,首先要找到包裹所有内容class=”b_allcity”的div,再从这个div中找到所有class=”e_city_list”的div,然后从中找到所有 “li” 标签中的 “a” 标签,爬取 “a” 标签中的文本及 “href” 属性。

然后打开spiders中的hotel.py文件,对系统创建的关键代码进行改动,并写出对HTML解析的代码。这里使用 “BeautifulSoup” 来对HTML代码进行解析,安装代码为pip install bs4。

最后在命令窗口输入python entrypoint.py运行代码,就可以将爬取的内容展示出来。

(二)爬取腾讯招聘信息

1. 首先创建一个scrapy项目,使用命令scrapy startproject tencent。创建完成后,项目目录结构如下:

scrapy.cfg:项目的配置文件。tencent:该项目的python模块,包含以下文件:items.py:主要用来写需要抓取的数据,定义了需要获取的内容字段,如职位名称、职位详情链接、职位类别、招聘人数、工作地点、发布时间等。pipelines.py:管道文件,用于保存数据。settings.py:设置文件,需要启用一些配置,如取消注释一些需要的选项。spiders:放置爬虫文件的目录。

2. 主要编写文件包括items、pipelines、tencentPosition、settings:

items文件定义了需要抓取的数据字段,使用scrapy.Item类来实现。tencentPosition爬虫主要操作文件,初始化模型对象,通过xpath从网页中提取所需信息,每次处理完一页的数据之后,重新发送下一页页面请求,实现翻页操作。pipelines管道文件,保存数据到文本文件中,使用json.dumps将数据转换为json格式并写入文件。settings设置文件,启用一些配置选项,如设置下载延迟、禁用cookies等。

3. 运行爬虫后,可以得到腾讯招聘信息的结果数据。

(三)爬取天涯小说

1. 首先,scrapy框架的工作流程是由引擎爬虫程序索要第一个要爬取的URL,交给调度器去入队列,调度器处理请求后出队列,通过下载器中间件交给下载器去下载,下载器得到响应对象后,通过蜘蛛中间件交给爬虫程序,爬虫程序进行数据提取,数据交给管道文件取入库处理,对于需要跟进的URL,再次交给调度器入队列,依次循环。

2. 编写items.py文件,主要是用来定义爬取的文件和保存,定义需要抓取的数据字段,如文章名称、文章内容、文章作者等。

3. 编写spiders爬虫文件,构造新的requests对象,告诉引擎新的请求需要传入的参数,让引擎拿到正确的requests对象交给下载器处理。下载器得到响应对象后,爬虫程序进行数据提取,再把数据转成json格式,得到单个的postid,即岗位号。再将postid带到第二个要爬取的URL中,最后得到该id下的相关信息,循环得到想要的信息。通过定义data中的pageIndex:1爬取第一页的postid,再通过data['pageIndex'] += 1进行翻页操作。最后将得到的信息封装成item=TenxunItem()。

4. 编写管道文件pipeline来连接数据库,最后导入数据库中。运行爬虫后,可以将天涯小说全文保存为本地记事本文件。

(四)爬取今日头条数据

1. 案例一:

Scrapy框架简介:Scrapy是一个强大、灵活、可扩展的爬虫框架,采用事件驱动和异步IO的机制,具有自动请求处理和多线程爬取的特点,支持自定义扩展和中间件,可以方便地进行反反爬虫处理。安装Scrapy框架:参考官方网站的安装指南,使用pip或conda包管理工具进行安装。创建Scrapy爬虫项目:使用命令scrapy startproject toutiao创建项目,生成特定的目录结构,包括配置文件、数据结构定义文件、中间件文件、数据处理管道文件和爬虫脚本目录等。创建Scrapy爬虫脚本:在spiders目录中创建toutiao_spider.py文件,定义爬虫类,通过继承scrapy.Spider类来定义新的爬虫,设置爬虫名称、允许爬取的域名和起始爬取链接。在parse方法中解析爬取的网页数据,获取前十条新闻的标题和链接,并使用yield关键字将数据传递给后续的处理管道。为了保存爬取的数据,需要在项目目录下创建items.py文件,定义数据结构。运行Scrapy爬虫:在命令行中使用特定命令运行爬虫,并将爬取结果保存为指定格式的文件。

2. 案例二:

准备工作:安装Selenium和PhantomJS,Selenium用于驱动浏览器,PhantomJS是无界面的浏览器,效率更高。创建Scrapy项目:创建一个名为toutiao的scrapy项目。使用Item封装数据:在项目的items.py文件中添加新闻字段,定义数据结构。创建Spider源文件及Spider类:在Spider文件夹中新建toutiao_spier.py文件,定义爬虫类,包括构造函数、获取初始Request的方法和数据解析方法。构造函数中生成PhantomJS的对象driver,获取初始Request的方法生成初始请求对象,数据解析方法暂不实现。实现下载器中间件:在middlewares.py的源文件中的ToutiaoDownloaderMiddleware类中实现使用Selenium请求和下载页面,处理从爬虫发送过来的HTTP请求,通过Selenium获取指定的URL页面,设置等待时间,等待新闻列表的div容器加载完成,然后使用JS命令将页面滚动到底部,获取加载完整的页面文档构造一个Response对象,返回给爬虫。开启下载器中间件:在settings.py中将对应的注释放开,开启下载器中间件。解析数据:在ToutiaoSpider类的parse()方法中实现数据的解析,通过Selenium获取页面信息,解析出所需的数据。

3. 案例三:

使用scrapy+selenium+PhantomJS的方式获取今日头条推荐的内容。首先,分析今日头条的推荐新闻接口地址,得到数据格式为json数据。然后,在spiders中的toutiao_example.py文件中编写核心代码,通过scrapy的Request和parse方法,解析json数据,获取新闻的标题和链接,再访问链接获取新闻的详细内容。

4. 通过多个案例展示了如何使用Scrapy爬取今日头条的热点新闻数据,包括分析数据接口、编写爬虫代码、对接IP代理池和随机切换User-Agent等步骤,以提高爬虫的效率和稳定性。

四、Scrapy 的原理与组件(一)运行原理解析

Scrapy 的运行原理可以通过以下流程来理解:

引擎(Scrapy Engine):引擎负责控制整个系统的数据流处理,触发事务,是 Scrapy 的核心。它接收来自爬虫的请求,将请求传递给调度器,并接收来自下载器和爬虫的响应,进行相应的处理。调度器(Scheduler):调度器接收引擎发过来的请求,将请求压入队列中,并在引擎再次请求的时候返回。它可以想象成一个 URL 的优先队列,决定下一个要抓取的网址,同时去除重复的网址。下载器(Downloader):下载器用于下载网页内容,并将网页内容返回给爬虫。它建立在高效的异步模型 twisted 之上,能够快速下载网页。爬虫(Spiders):爬虫是主要干活的部分,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让 Scrapy 继续抓取下一个页面。项目管道(Pipeline):负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。中间件:包括下载器中间件和爬虫中间件。下载器中间件位于引擎和下载器之间,处理请求和响应,可以进行请求预处理、异常处理、数据过滤等操作。爬虫中间件位于引擎和爬虫之间,处理爬虫的输入和输出,可以在爬虫处理响应之前和之后进行数据处理。

以下是 Scrapy 的运行流程图:

爬虫向引擎传入初始 URL,引擎将初始 URL 传递给调度器,调度器将 URL 写入队列中。调度器将处理好的 requests 请求返回给引擎,引擎将得到的 requests 请求再次传递给下载器。下载器根据事先设置好的下载中间件访问网页进行获取数据。如果下载失败,下载器会记录后重新访问。下载器获得响应数据后,将 response 传回引擎,引擎将 response 传递给爬虫进行处理。爬虫处理完数据之后获得 item 和新的 URL,将这些再次传递给引擎。引擎将 item 传递到管道中,将新获得的 URL 传递给调度器,重复步骤 2 之后的操作,直到获得全部信息。当调度器中的请求为空,程序才会停止。(二)主要组件介绍引擎(Scrapy Engine):引擎是 Scrapy 的核心组件,它负责控制整个系统的数据流处理,触发事务。它协调调度器、下载器、爬虫和项目管道之间的通信,确保数据在各个组件之间正确流动。例如,当爬虫将提取的 URL 传递给引擎时,引擎会将这些 URL 转发给调度器进行排队等待下载。调度器(Scheduler):调度器就像一个 URL 的优先队列,它负责接收引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。它决定下一个要抓取的网址,同时去除重复的网址,确保爬虫不会重复抓取相同的页面。调度器的高效管理可以提高爬虫的效率,避免不必要的资源浪费。下载器(Downloader):下载器是 Scrapy 中负责下载网页内容的组件。它建立在 twisted 这个高效的异步模型上,能够快速下载网页内容,并将响应返回给引擎。下载器的性能直接影响爬虫的速度,通过设置下载延迟和并发下载数等参数,可以优化下载器的性能。爬虫(Spiders):爬虫是用户自定义的部分,用于从特定的网页中提取自己需要的信息,即实体(Item)。爬虫通过定义解析规则,从网页中提取数据,并将提取的数据封装成 Item 对象返回给引擎。同时,爬虫还可以提取链接,让 Scrapy 继续抓取下一个页面。项目管道(Pipeline):项目管道负责处理爬虫从网页中抽取的实体。它可以进行数据的持久化、验证实体的有效性、清除不需要的信息等操作。例如,可以将爬取到的数据存储到数据库中,或者对数据进行清洗和过滤,确保数据的质量。中间件:下载器中间件(Downloader Middlewares):位于引擎和下载器之间,处理请求和响应。它可以进行请求预处理,如添加或修改请求头信息、设置代理等;处理异常情况,如捕获并处理下载过程中的异常;进行数据过滤,筛选无用或重复的数据,提高数据质量;记录爬虫活动的日志,方便调试和监控。爬虫中间件(Spider Middlewares):位于引擎和爬虫之间,处理爬虫的输入和输出。它可以在爬虫处理响应之前进行预处理,如修改响应内容;在爬虫处理结果之后进行后处理,如过滤或修改提取的 Item 对象;处理爬虫过程中的异常情况,如捕获并处理爬虫抛出的异常。五、Scrapy 的配置与扩展(一)配置文件说明

Scrapy 的配置文件 scrapy.cfg在项目中起着重要的作用。它主要用于配置项目的部署信息和一些全局设置。这个文件通常包含了项目的名称、版本号以及一些与部署相关的配置。

在 scrapy.cfg中,可以指定不同的部署环境,例如开发环境、测试环境和生产环境。通过配置不同的环境,可以方便地在不同的环境中进行部署和测试。

此外,scrapy.cfg还可以用于配置项目的存储路径、日志级别等全局设置。这些设置可以影响整个项目的运行行为。

修改配置文件可以满足不同的项目需求。例如,如果需要将项目部署到不同的服务器上,可以在 scrapy.cfg中修改服务器的地址和端口号。如果需要调整项目的日志级别,可以在配置文件中修改相应的设置。

(二)项目设置详解

Scrapy 的项目设置文件 settings.py是一个非常重要的文件,它包含了许多可以调整的参数,以满足不同的项目需求。

请求头设置:USER_AGENT:用于模拟浏览器发送请求时的用户代理 (User-Agent) 字符串。可以设置为常见浏览器的 User-Agent,以模拟真实的浏览器请求。例如,USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"。代理设置:如果需要通过代理来进行爬取,可以在 settings.py文件中设置 PROXIES参数。例如:PROXIES = [';,';,';]。然后,在 Spider 中随机选择一个代理进行请求发送。下载延迟设置:DOWNLOAD_DELAY:下载延迟,即发送两个连续请求之间的等待时间,用于控制爬取速度。可以设置为一个浮点数,单位为秒。设置这个的原因是减少对浏览器的冲击,如果不设置,容易被检测出来,一般来说设置 3 秒即可。

此外,settings.py文件还可以设置是否启用 cookie、默认请求头、导出字段、重定向和 refer、进程并发、下载超时、管道、中间件等参数。

(三)扩展 Scrapy 功能

Scrapy 提供了丰富的扩展接口和插件机制,可以通过添加自定义的中间件、管道和下载器等扩展来增强其功能。

中间件扩展:下载器中间件:处理引擎和下载器之间的请求 / 响应。可以编写自定义的下载器中间件来实现一些特定的处理逻辑,比如修改请求头、代理设置、重试逻辑等。例如,可以创建一个自定义的下载器中间件类,在 process_request方法中添加自定义的请求头信息。爬虫中间件:处理爬虫和引擎之间的请求 / 响应 / Item。可以编写自定义的爬虫中间件来实现一些特定的处理逻辑,比如修改响应内容、过滤 Item 对象等。例如,可以创建一个自定义的爬虫中间件类,在 process_spider_output方法中过滤掉不符合条件的 Item 对象。管道扩展:Scrapy 的管道用于处理爬取到的数据,在数据存储之前进行处理。用户可以编写自定义的管道来实现数据的处理和存储逻辑,比如数据清洗、去重、存储到数据库等。例如,可以创建一个自定义的管道类,在 process_item方法中对爬取到的数据进行清洗和去重操作,然后将处理后的数据存储到数据库中。下载器扩展:下载器扩展与普通中间件类似,不同之处在于下载器扩展只在请求被下载器处理时生效。用户可以编写自定义的下载器扩展来实现一些下载相关的特定处理逻辑,比如设置下载延迟、处理异常等。例如,可以创建一个自定义的下载器扩展类,在 download_request方法中设置下载延迟,并处理下载过程中的异常情况。

通过以上方式,可以根据具体需求扩展 Scrapy 的功能,实现更加灵活和定制化的爬虫功能。

六、Scrapy 的总结与展望(一)Scrapy 的特点与优势总结

Scrapy 作为一个强大的 Python 爬虫框架,具有众多显著的特点和优势。

在效率方面,Scrapy 采用异步 IO 的方式进行网络请求,能够同时发送多个异步请求并立即返回所有响应,大大提高了爬虫的速度和效率。例如,在处理大规模数据抓取任务时,Scrapy 的异步特性能够显著缩短抓取时间,提高数据获取的及时性。

可扩展性是 Scrapy 的另一大优势。其架构非常灵活,通过自定义管道和中间件,可以轻松扩展到各种不同的应用场景。无论是添加特定的数据处理逻辑,还是应对复杂的反爬措施,都能通过扩展 Scrapy 来实现。例如,当需要对爬取到的数据进行复杂的清洗和过滤操作时,可以编写自定义的管道类来满足需求。

Scrapy 直接支持多种数据格式,包括 JSON、XML、CSV 等,甚至还支持各种脚本语言的解析以及自定义数据格式的解析。这使得用户在存储和处理数据时更加方便,可以根据不同的需求选择合适的数据格式进行存储和分析。

此外,Scrapy 拥有优秀的文档和清晰的 API,使得其易于学习和使用。独特的调试功能和自定义错误处理,为开发人员提供了便利,能够轻松地编写和调试 Scrapy 爬虫。

(二)Scrapy 面临的挑战

尽管 Scrapy 具有诸多优势,但在使用过程中也可能会遇到一些挑战。

一方面,随着网站反爬措施的不断升级,Scrapy 需要不断应对各种反爬机制。例如,一些网站可能会设置验证码、限制访问频率、使用 JavaScript 加密等反爬手段,这给 Scrapy 的爬取工作带来了一定的困难。需要开发人员不断探索新的应对策略,如设置合理的请求间隔、使用代理 IP、编写验证码识别算法等。

另一方面,对于动态网页的爬取,Scrapy 虽然可以与 Selenium 等工具集成,但这种方式会增加爬虫的复杂性和运行成本。如何更高效地处理动态网页,仍然是一个需要不断探索的问题。

(三)Scrapy 的未来发展前景

随着技术的不断发展,Scrapy 的未来发展前景广阔。

在功能方面,预计 Scrapy 将不断增强对动态网页的处理能力,提供更加高效和便捷的解决方案。同时,随着人工智能和机器学习技术的发展,Scrapy 可能会集成更多智能化的功能,如自动识别反爬机制并采取相应的应对措施,提高爬虫的智能化水平。

在性能方面,Scrapy 将继续优化其异步 IO 模型,提高爬虫的速度和效率。同时,通过不断改进中间件和管道的设计,进一步提升数据处理的性能。

此外,随着大数据和云计算技术的发展,Scrapy 有望与这些技术更好地融合,实现大规模分布式爬虫,满足日益增长的数据抓取需求。

(四)鼓励读者深入学习和应用 Scrapy

Scrapy 作为一个高效、可扩展且稳定的 Python 爬虫框架,在数据抓取和处理方面具有重要的作用。无论是对于数据分析师、开发者还是研究人员来说,掌握 Scrapy 都能够为他们的数据获取和分析工作带来极大的便利。

对于初学者来说,Scrapy 的优秀文档和丰富的教程资源为他们提供了良好的学习途径。通过逐步学习和实践,可以快速掌握 Scrapy 的基本用法,并逐步深入了解其高级功能。

对于有经验的开发者来说,Scrapy 的可扩展性和灵活性为他们提供了广阔的发挥空间。可以根据具体需求进行定制化开发,实现更加复杂和高效的爬虫功能。

总之,鼓励读者深入学习和应用 Scrapy,充分发挥其强大的功能,为自己的数据抓取和处理工作带来更多的价值。

标签: #scrapy对接selenium #scrapy结合selenium #scrapy结合selenium高级用法