|
基于构建强大网络爬虫框架实例探究
更新时间为2024年1月4日,具体时刻是08:48:42,作者是涛哥聊
这篇文章主要为大家做了介绍,内容是基于构建强大网络爬虫框架的实例探究,有需要的朋友可以借鉴参考,希望能有所帮助,祝大家多多进步,早日升职加薪。
目录
它是一个强大的网络爬虫框架,该框架是基于特定基础构建的,专门用来从网页里提取数据,其功能以及优势让它成为众多数据挖掘工程师与开发者的首选工具。
的功能优势适用场景
它具有功能和优势,这使它成为一个强大的网络爬虫框架,它适用于许多不同的领域和需求,涵盖从简单的数据抓取到复杂的网络爬取任务。
与其他爬虫框架的对比
异步架构是基于异步框架的,它允许进行异步处理请求,进而提高效率。与一些同步框架相比,它能够更快速地处理多个请求。
灵活性方面,和一些基于规则配置的爬虫框架相比,它提供了更多自定义选项。它具有灵活性,用户能够依据自身需要对请求进行定制化,能够对数据处理进行定制化,还能够对存储进行定制化。
它是一个全功能的爬虫框架,其内置了各种功能模块,像中间件、管道、扩展等,这些模块能够方便地进行扩展以及定制。
数据处理能力:相较于某些框架,能提供更多数据处理工具,例如XPath和CSS选择器,还具备数据清洗、存储等功能。
社区提供支持,文档资料丰富,这让学习变得更加容易,也让解决问题变得更加容易。
它提供了强大的功能,不过其学习曲线或许对部分新手而言较为陡峭,相比之下,一些别的框架可能更容易上手。
定位对象适合有一定编程基础的用户,对爬虫框架有一定了解的用户使用起来会更友好。
在功能和灵活性方面存在明显优势,然而在特定情形下,其他一些框架或许更契合某些需求。比如说,针对那些仅需开展简单、快速数据抓取的任务,有可能会挑选一些更为简易的爬虫框架。选择适宜的框架取决于具体需求以及个人技术水平。
安装及其他依赖
在开始使用之前,首先要进行安装,还要安装其依赖。打开命令行界面,也就是命令提示符或者macOS和Linux的终端,接着执行以下命令:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">pip install scrapy
</pre></p>
此命令会使用pip安装框架,pip是包管理器。它会自动安装所需的其他依赖项。
创建虚拟环境
虚拟环境能够保证在不一样的项目里运用不一样的包以及其版本,防止包之间产生冲突,能够借助或venv来创建虚拟环境。
使用创建虚拟环境:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">如果没有安装virtualenv,那么执行pip install virtualenv
创建一个虚拟环境,其名为myenv 。
激活虚拟环境,在Windows上需使用myenv\Scripts\activate,在其他系统上使用source myenv/bin/activate 。
</pre></p>
使用venv创建虚拟环境( 3自带的):
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">使用python -m venv命令,创建一个名为myenv的虚拟环境。
source myenv/bin/activate # 激活虚拟环境 (在Windows上使用 myenv\Scripts\activate)
</pre></p>
安装 Shell及其他有用工具
提供了用于测试和调试网站抓取的Shell,安装后Shell会自带,你可以在命令行中直接键入shell来启动它。
除了Shell之外,还提供了别的有用工具与命令,比如crawl用来运行爬虫,还有用于创建新项目等。这些工具都随着一起被安装,不需要额外的安装步骤。
基础架构:组件和工作原理
架构是基于异步网络框架的,它由各种组件构成,其中包括引擎、调度器、下载器、中间件、爬虫等,这些组件协同工作,可完成从发送HTTP请求到处理响应数据的整个过程,引擎负责协调各组件工作,它从调度器获取请求并将其发送给下载器,之后下载器获取响应并将其发送回进行处理。中间件能让用户在这个过程里进行拦截,中间件还能让用户在这个过程中操作数据,通过这样做来实现一些自定义的功能。
的数据流(/)
在其中,数据流依据请求()和响应()来开展。生成一个初始请求后,该请求被发送给引擎,引擎接着把请求发送给调度器。调度器对请求进行排队,并将其发送给下载器,下载器下载网页后返回一个响应,响应随后被发送给处理环节。对响应中的数据加以分析并生成新的请求,此过程循环往复直至完成所有任务。
的选择器:XPath和CSS
具备强大的选择器功能,支持XPath选择器,也支持CSS选择器,这些选择器能让用户以简单且灵活的方式从HTML页面提取数据,XPath是用于选择XML文档中节点的语言,CSS选择器是通过类似CSS的选择器定位元素,开发者可依需求挑选更合适的选择器提取数据。
中的:创建自定义的
它是一个核心概念,此概念定义了抓取某个(些)网站信息的方式。用户能够编写自定义内容,用以指定抓取某个网站的方式,以及解析页面内容提取数据的方式。通过继承相关类,并实现自定义解析方法,能够创建适应不同网站结构的爬虫。
定制的
提供了一组可配置的设置,这些设置允许用户自定义爬虫的行为,设置包括并发请求的数量、下载延迟、用户代理等,通过调整这些设置,用户可以对爬虫的行为进行微调,以适应特定的网站或需求。
网站爬取实战
当涉及代码示例时,下面给出一个简单示例,用于解释网站爬取实战中提到的概念:
创建爬虫项目:新建项目、定义Item和
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">scrapy startproject myproject
</pre></p>
在items.py中定义Item:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">import scrapy
class MyItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
publish_date = scrapy.Field()
</pre></p>
在.py中编写(示例存储为JSON文件):
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">import json
class MyPipeline(object):
定义一个方法,该方法名为open_spider ,参数为spider
打开文件data.json,以写入模式,将其赋值给self.file 。
定义一个名为close_spider的方法,该方法接收两个参数,分别是self和spider 。
self.file.close()
定义一个方法,该方法名为process_item,它接受三个参数,分别是self、item和spider 。
将字典形式的“item”转换为 JSON 格式的字符串,然后加上换行符,赋值给变量“line” 。
self.file.write(line)
return item
</pre></p>
解析网页数据:XPath/CSS选择器、正则表达式
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">import scrapy
定义一个名为MySpider的类,该类继承自scrapy.Spider
name = 'myspider'
起始网址为,'http://example.com'
def parse(self, response):
对于响应中通过xpath('//div[@class="post"]')获取到的每个帖子
yield {
'title'的值,是通过对post进行xpath操作,选取h2/a元素,获取其文本内容得到的 。
“link”的值为,通过对“post”使用“xpath”方法,选取“h2/a/@href”路径所获取到的值 。
'publish_date'的值,是通过对post运用xpath方法,选取span标签下的文本内容而得到的 。
}
</pre></p>
处理数据:清洗和存储数据到数据库或文件
在.py中启用:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline',其值为300 ,
}
</pre></p>
在中进行页面跟踪和跟随链接
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://example.com']
def parse(self, response):
for post in response.xpath('//div[@class="post"]'):
yield {
'title': post.xpath('h2/a/text()').get(),
'link': post.xpath('h2/a/@href').get(),
'publish_date': post.xpath('span/text()').get()
}
# 页面跟踪和跟随链接示例
下一页的链接,是从响应中通过xpath表达式选取class属性为next_page的a标签的href属性值获取到的 。
if next_page is not None:
产生响应,跟随下一页,回调函数为self.parse 。
</pre></p>
这些示例代码包含了从创建项目开始的流程,包括定义、使用选择器提取数据,处理数据以及跟踪链接。在实际状况中,需要依据要爬取的网站结构和需求编写更为具体的代码。
进阶应用借助中间件进行扩展,用于处理User - Agent,也用于处理IP代理等
设置随机的User - Agent,借助中间件来完成,目的是模拟不同浏览器或设备的请求头,进而避免被网站识别为爬虫 。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">from scrapy import signals
从fake_useragent模块中导入UserAgent类
类,随机用户代理中间件:
def __init__(self):
self.ua = UserAgent()
@classmethod
定义一个类方法,方法名为from_crawler,参数为crawler
middleware = cls()
爬虫的信号连接到中间件的蜘蛛打开方法,连接的信号是蜘蛛打开信号 。
return middleware
定义一个方法,方法名为spider_opened,该方法接收两个参数,分别是self和spider 。
pass
定义一个方法,该方法名为process_request,它接受三个参数,分别是request,spider 。
将 'User - Agent' 的默认值设置为 self.ua.random,存于 request.headers 中 。</pre></p>
IP代理设置:通过中间件设置IP代理,隐藏真实IP地址。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">class ProxyMiddleware:
def process_request(self, request, spider):
将“http://your_proxy_address”赋值给“request.meta['proxy']”
</pre></p>
模拟登录:如何进行模拟登录以获取需要授权的内容
使用模拟登录:在中发送登录POST请求,获取登录后的信息。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">import scrapy
定义一个名为LoginSpider的类,它继承自scrapy.Spider
name = 'login_spider'
起始网址为,'http://example.com/login'
def parse(self, response):
返回,Scrapy的表单请求,从响应中获取 。
response,
表单数据为,用户名是“your_username”,密码是“your_password”,
callback=self.after_login
)
定义一个名为after_login的方法,该方法接收一个名为response的参数 。
# 检查登录是否成功并进行下一步请求
如果“Welcome”在响应体中 ,
生成一个Scrapy请求,请求的URL是'http://example.com/protected_page',回调函数是self.parse_protected 。
定义一个名为parse_protected的方法,该方法接收一个名为response的参数
# 处理登录后的保护页面
pass</pre></p>
与动态网页:处理渲染的页面
处理渲染页面:使用或等工具,对动态生成的内容进行爬取。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">从scrapy_selenium中导入SeleniumRequest
class MySpider(scrapy.Spider):
name = 'js_spider'
start_urls = ['http://example.com']
def start_requests(self):
for url in self.start_urls:
生成一个Selenium请求,该请求的URL为url,回调函数为self.parse 。
def parse(self, response):
# 处理JavaScript渲染后的页面
pass</pre></p>
这些代码片段展示了进阶应用,其中包括处理请求头,包括IP代理设置,还包括模拟登录,以及处理动态网页。根据实际需要,开发者可以进一步定制代码,也可以进一步调整代码,以此来满足特定的爬虫需求。
调试与优化使用 Shell进行调试
Shell是一个交互式控制台,它能够让你在爬虫运行之前对代码进行测试,还能进行调试。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">使用scrapy shell工具,访问网址"http://example.com"
</pre></p>
在Shell中,可以使用fetch命令获取页面,也可以使用fetch命令运行选择器来提取数据,还可以使用fetch命令测试请求和响应逻辑。
优化爬虫:避免被封、降低被检测的风险
设置下载延迟,能避免对目标网站发出过多请求,其实现方式是通过设置下载延迟。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;"># 在 settings.py 中设置下载延迟
DOWNLOAD_DELAY = 2
</pre></p>
使用前面提到的中间件,设置随机User - Agent,设置IP代理,以此来防止被识别为爬虫。
避免过多重复请求:使用来避免重复请求。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">在 settings.py 里进行 DUPEFILTER_CLASS 的设置
DUPEFILTER_CLASS 等于 'scrapy.dupefilters.BaseDupeFilter'
</pre></p>
管理大规模数据:分布式爬取、集群
采用分布式爬取方式,利用分布式爬取框架,例如Redis,能够使多个爬虫实例共同分享相同的任务队列 。
部署多个爬虫实例,对任务调度进行管理,对数据存储进行管理,以此来提高爬取效率,这就是集群 。
管理大规模数据,这涉及更复杂的架构与设置,需要更多代码及配置,以此确保多个爬虫实例能有效协同工作,避免数据冗余,避免任务重复执行。
实际案例商品价格比较网站
假设想要创建一个商品价格比较网站。该网站要能够轻松从多个电子商务网站抓取商品价格。之后在网站上展示这些价格。以便用户可以比较不同网站的价格。
代码与分析创建
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">import scrapy
定义一个名为PriceComparisonSpider的类,该类继承自scrapy.Spider
name = 'price_spider'
起始网址为,'http://example.com/products'
def parse(self, response):
products等于通过response的xpath方法选取的,路径为//div[@class="product"]的内容
for product in products:
yield {
'name'的值为,product通过xpath('h2/a/text()')获取到的内容 。
'price'的值,是通过product.xpath('span[@class="price"]/text()')获取到的 。
}
</pre></p>
数据处理与存储
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="brush:py;">class CleanDataPipeline:
def process_item(self, item, spider):
将商品信息中的价格,用自身的清理价格方法进行处理,处理后的结果赋值给商品信息中的价格 。
return item
def clean_price(self, price):
# 实现价格数据清洗的逻辑
return cleaned_price
</pre></p>
数据展示
可以使用Flask等框架来创建Web应用,把抓取到的数据展示给用户。
总结
是一个网络爬虫框架,它功能强大且灵活,可用于从网页中提取数据。本篇文章涵盖多个方面,涉及从基础概念到进阶应用,还有实际案例的应用。首先介绍了其基本架构、工作原理和数据流,包括选择器的使用、它的创建以及如何对其进行定制。随后,深入探讨了怎样在实战当中创建爬虫项目,怎样解析网页数据,怎样处理和存储数据,以及怎样进行页面跟踪和跟随链接。
进阶部分介绍了一些高级应用,这些应用包括使用中间件扩展,还包括模拟登录获取授权内容,以及处理动态网页。同时,讨论了调试和优化方法,这些方法包括使用Shell进行调试,优化爬虫以避免被封禁,并且提出了管理大规模数据的解决方案,比如分布式爬取和集群。
最后,通过一个实际案例,展示了如何创建一个商品价格比较网站,该网站使用从多个电商网站抓取的商品价格数据,对数据进行清洗并存储,最终通过Web框架展示给用户。其具有强大功能、灵活性和丰富的生态系统,使其成为处理网页抓取和数据提取的理想选择,能够满足各种爬虫需求。 |
|