scrapy分页抓取网页(一个_selector.xpath.u去重与增量爬取)
优采云 发布时间: 2022-03-17 02:01scrapy分页抓取网页(一个_selector.xpath.u去重与增量爬取)
response_selector.xpath(u'//div[contains(@class,"house-title")]/p[contains(@class,"house-update-info c_888 f12")]/text()').extract( )
因为有些数据不能被Xpath提取出来,所以也需要定期匹配。如果有异常,必须处理。一般当页面无法匹配到对应字段时,应设置为0,待到item后处理。过滤处理。
3)去重和增量爬取
去重和增量爬取对服务器来说意义重大,可以减轻服务器的压力,保证数据的准确性。如果不采用去重,爬取的内容会爬取大量的重复内容,大大降低爬虫的效率。事实上,重复数据删除的过程非常简单。核心是判断每个请求是否在已经爬取的队列中。如果它已经存在,则丢弃当前请求。
具体实施步骤:
(1)从待爬取队列中获取url
(2)判断要请求的url是否被爬取,如果已经爬取则忽略该请求,不被爬取,继续其他操作,将url插入爬取队列
(3)重复步骤 1
这里我们使用了scrapy-redis的去重组件,所以还没有实现,但是原理还是需要了解的,具体可以看源码。
4)爬虫中间件
爬虫中间件可以帮助我们在scrapy爬取过程中自由扩展自己的程序。以下是爬虫反屏蔽中间件、下载器异常状态中间件和非200状态中间件。
(1)爬虫类反屏蔽组件的实现
当访问一个网站网页时,会给网站带来一定的负载,爬虫程序模拟了我们正常访问网页的过程,但是。大型爬虫会给网站增加很大的负载,影响正常用户的访问。为了保证大部分普通用户可以访问网页,大部分网站都有相应的反爬策略。一旦访问行为被识别为爬虫,网站会采取一定的措施限制你的访问,比如访问过于频繁会提示你输入验证码。您访问 网站。当系统有针对性的抓取网页数据时,会不断的访问网站的内容。如果不采取伪装措施,很容易被网站识别为爬虫行为
系统采用以下方法防止爬虫被屏蔽:
1.模拟不同的浏览器行为
2.一定频率更换代理服务器和网关
3.本着君子的约定,降低爬取网页的频率,减少并发爬取的进程,限制每个ip的并发爬取数量,牺牲一定的效率来换取系统的稳定性。
4.禁用cookies,网站会在用户访问时在cookie中插入一些信息来判断是否是机器人。我们屏蔽了cookies的调整,这也有利于我们的身份分歧。
5.人工编码,这应该是无可挑剔的反禁令措施,所有系统都比人工操作好不了多少,只是降低了自动化,效率不高,但确实是最有效的措施。当爬虫被禁止时,它会被重定向到一个验证码页面。输入验证码以重新访问该页面。为此,我添加了一个邮件提醒模块。当爬虫被封禁时,会发送邮件提醒管理员解除封禁。同时将重定向的请求重新加入下载队列进行爬取,以保证数据的完整性。
防爬虫网站屏蔽原理如下图所示:
(a) 模拟不同浏览器行为的实现思路和代码
原理:从scrapy的介绍可以知道scrapy有下载中间件,在其中我们可以自定义请求和响应,类似于spring面向切面的编程,就像程序运行前后嵌入的一个hook。核心是修改请求的属性
首先是扩展下载中间件。首先,将中间件添加到seeings.py。
二、扩展中间件,主要是写一个useragent列表,将常用的浏览器请求头保存为列表,如下图:
然后让请求的头文件在列表中随机取一个代理值,然后下载到下载器。
总之,每次发出请求时,都会使用不同的浏览器访问目标网站。
(b) 使用代理ip进行爬取的实现思路和代码。
首先在seeings.py中添加中间件,展开下载组件请求的头文件,从代理ip池中随机抽取一个代理值,然后下载到下载器中。
1.代理ip池的设计开发流程如下:
一种。抓取免费代理 ip网站。
湾。存储并验证代理 ip
C。通过存储到数据库中进行验证
d。如果达到最大ips数,停止爬取,一定时间后验证数据ips的有效性,删除无效ips
e. 直到数据库ip小于0,继续爬取ip,重复步骤a。
代理ip模块这里使用七夜代理ip池的开源项目
代理ip爬虫运行截图:
(c)爬虫异常状态组件的处理
当爬虫没有被阻塞并运行时,访问网站并不总是200请求成功,而是有各种状态,比如上面的爬虫被禁止时,返回的状态实际上是302,阻塞组件这是通过捕获 302 状态来实现的。同时,异常状态的处理有利于爬虫的健壮性。
设置中的扩展中间件捕获异常后,将请求重新加入待下载队列的过程如下:
(d) 数据存储模块
数据存储模块主要负责存储slave端爬取和解析的页面。数据使用 Mongodb 存储。
Scrapy 支持 json、csv 和 xml 等数据存储格式。用户可以在运行爬虫时设置,例如:scrapy crawl spider -o items.json -t json,也可以在Scrapy项目文件和ItemPipline文件中定义。同时Scrapy还支持数据库存储,比如Monogdb、Redis等,当数据量大到一定程度时,可以使用Mongodb或者Reids的集群来解决问题。本系统的数据存储如下图所示:
(e) 抓取场地设计
本文以网络房屋数据为捕获目标,从机端解析捕获现场数据。因此,捕获的内容必须能够客观、准确地反映网络房屋数据的特征。
以抓取58同城的在线房屋数据为例,通过分析网页结构,定义字段的详细信息如下表所示。
序列号
字段名称
字段含义
1
标题
帖子标题
2
钱钱
租
3
方法
租
4
区域
您所在的地区
5
社区
您所在的社区
6
目标网址
发布详细信息
7
城市
城市
8
Pub_time
发布时间
现场选择主要是根据本系统的应用研究,因为系统开发单机配置比较低,没有图片文件下载到本机。降低单机压力。
(f) 数据处理
1)对象定义器
Item 是定义抓取数据的容器。通过创建一个 scrapy.item.Item 类来声明。将该属性定义为一个scrapy.item.Field对象来控制通过实例化所需item获得的站点数据。系统定义了九个抓取对象,分别是:帖子标题、租金、租赁方式、地点、社区、城市、帖子详情页链接、发布时间。这里对字段的定义是根据数据处理端的需要来定义的。关键代码如下:
类 TcZufangItem(项目):
#帖子名称
标题=字段()
#租
钱=字段()
#租
方法=字段()
#你的地区
面积=字段()
#地点
社区=字段()
#发布详细信息网址
targeturl=字段()
#post 发布时间
pub_time=字段()
#地点城市
城市=字段()
2)数据处理程序
保存和输出数据的方法在 Pipeline 类中定义。从 Spider 的 parse 方法返回的 Item 中,数据将被处理并以 ITEM_PIPELINES 列表中 Pipeline 类对应的顶层格式输出。系统发回管道的数据使用Mongodb存储。关键代码如下:
def process_item(self, item, spider):
如果项目['pub_time'] == 0:
raise DropItem("发现重复项:%s" % item)
如果项目['方法'] == 0:
raise DropItem("发现重复项:%s" % item)
如果项目['社区'] == 0:
raise DropItem("发现重复项:%s" % item)
如果项目['钱']==0:
raise DropItem("发现重复项:%s" % item)
如果项目['区域'] == 0:
raise DropItem("发现重复项:%s" % item)
如果项目['城市'] == 0:
raise DropItem("发现重复项:%s" % item)
zufang_detail = {
'title': item.get('title'),
'钱':item.get('钱'),
'方法':item.get('方法'),
'区域': item.get('区域', ''),
'社区': item.get('社区', ''),
'targeturl': item.get('targeturl'),
'pub_time': item.get('pub_time', ''),
'城市': item.get('城市','')
}
结果 = self.db['zufang_detail'].insert(zufang_detail)
print '[success] the '+item['targeturl']+'写入MongoDB数据库'
归还物品
(g) 数据可视化设计
数据的可视化,其实就是将数据库的数据转换成便于我们用户观察的形式。本系统使用 Mongodb 存储数据。数据的可视化基于Django+Semantiui,效果如下图所示:
四、系统操作
系统以58同城租赁平台为抓拍目标。运行十个小时后,它继续在网络上捕获数以万计的列表。
Master运行截图:
从端运行截图:
五、系统部署
环境部署,因为分布式部署所需的环境类似,如果一个服务器部署程序需要配置环境,就很麻烦了。这里使用docker镜像部署爬虫,使用Daocloud上的scrapy-env pair。该程序已部署。具体的docker部署过程可以参考网上。
代码放在gayhub上,有兴趣的可以查一下
更多!