c爬虫抓取网页数据(一个_selector.xpath.u去重与增量爬取)
优采云 发布时间: 2021-11-11 00:12c爬虫抓取网页数据(一个_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,项目处理完毕后,需要对其进行处理。进行过滤处理。
3) 去重和增量爬取
去重和增量爬取对服务器来说意义重大,可以减轻服务器压力,保证数据的准确性。如果不进行去重,被爬取的内容会爬取大量重复的内容,大大降低了爬虫效率。事实上,重复数据删除的过程非常简单。核心是在每次发出请求时判断该请求是否在爬取队列中。如果它已经存在,则丢弃当前请求。
具体实施步骤:
(1)从要爬取的队列中获取url
(2) 判断请求的URL是否已经被抓取,如果已经被抓取,则忽略该请求,不抓取,继续其他操作,将URL插入到抓取队列中
(3) 重复步骤 1
这里我们使用了scrapy-redis去重组件,所以没有实现,但是原理还是需要理解的,具体可以看源码。
4)爬虫中间件
爬虫中间件可以帮助我们在scrapy爬虫过程中自由扩展我们的程序。以下是爬虫反屏蔽中间件、下载器异常状态中间件和非200状态中间件。
(1)爬虫反屏蔽组件的实现
在访问网站的网页时,会给网站带来一定的负载,爬虫程序模拟了我们正常访问网页的过程,但是。大型爬虫会给网站增加很大的负载,影响普通用户的访问。为了保证网页可以被大多数正常用户访问,大多数网站都有相应的反爬虫策略。一旦访问行为被认定为爬虫,网站会采取一定的措施限制您的访问,比如提醒您访问过于频繁,请您输入验证码,如果比较严重,您的ip会被封禁,禁止你访问网站。本系统在有针对性的抓取网页数据时,会持续访问网站的内容。
本系统采用以下方法防止爬虫被拦截:
1.模拟不同的浏览器行为
2. 一定频率更换代理服务器和网关
3. 符合君子协议,降低爬虫爬取网页的频率,减少并发爬取的进程,限制每个IP的并发爬取次数,牺牲一定的效率来换取系统的稳定性。
4.禁用cookies,网站会在cookie中插入一些信息来判断用户访问时是否是机器人。我们屏蔽和调整cookie,这也有利于我们的身份不同意暴露。
5. 手动编码,这应该是无懈可击的反禁措施。所有的系统都不比人工操作好,但它们降低了自动化,效率不高,但它们确实是最有效的措施。当爬虫被禁止时,它会被重定向到一个验证码页面。输入验证码重新访问页面。为此,我添加了一个电子邮件提醒模块。当爬虫被封禁时,我会发邮件提醒管理员解封。同时将重定向的请求重新加入到下载队列中进行爬取,保证数据的完整性。
爬虫预防网站屏蔽的原理如下图所示:
(一)模拟不同浏览器行为的实现思路和代码
原理:从scrapy的介绍可以知道scrapy有下载中间件。在这个中间件中,我们可以自定义请求和响应,类似于spring面向方面的编程,就像在程序运行前后嵌入一个钩子。核心是修改请求的属性
首先是扩展下载中间件,首先在seetings.py中添加中间件,
其次,扩展中间件,主要是写一个useragent列表,将常用的浏览器请求头保存为一个列表,如下图:
让请求的头文件从列表中随机选择一个代理值,然后下载到下载器。
综上所述,每次发出请求,都是模拟使用不同的浏览器访问目标网站。
(B) 使用代理ip爬取的实现思路和代码。
首先,将中间件添加到seetings.py。扩展下载组件请求的头文件会从代理ip池中随机取出一个代理值,然后下载到下载器。
1.代理ip池的设计开发流程如下:
一种。获取免费代理ip网站。
湾 存储和验证代理ip
C。验证存储在数据库中
d. 如果达到最大ip数,停止爬取,一定时间后验证数据ip的有效性,删除无效ip
e. 直到数据库ip小于0,继续爬取ip,重复步骤a。
这里的代理ip模块使用的是七夜代理ip池的开源项目
代理ip爬虫运行截图:
(三)爬虫异常状态组件的处理
爬虫运行时没有被阻塞,访问网站并不总是200请求成功,而是有各种状态,比如上面爬虫被ban的时候,返回的状态其实是302,就是为了防止阻塞组件 捕获要实现的 302 状态。同时,异常情况的处理有利于爬虫的鲁棒性。
扩展中间件在设置中捕捉到异常情况后,将请求重新加入等待下载队列的过程如下:
(D) 数据存储模块
数据存储模块主要负责存储从端爬取解析的页面。使用 Mongodb 存储数据。
Scrapy 支持 json、csv 和 xml 等数据存储格式。用户可以在运行爬虫时进行设置,例如:scrapy crawl spider -o items.json -t json,也可以在Scrapy项目文件ItemPipline文件中定义,同时Scrapy也支持数据库存储,如如Monogdb、Redis等。当数据量很大到一定程度时,可以使用Mongodb或Reids集群来解决。本系统的数据存储如下图所示:
(E) 抓斗设计
本文以网络房屋数据为爬取目标,slave端分析抓取现场数据。因此,采集到的内容必须能够客观、准确地反映网络房屋数据的特点。
以58个同城网络房源数据为例,通过分析网页结构,定义字段的详细信息如下表所示。
序号字段名称字段含义
1title 帖子标题
2money 租金
3method租借方式
4area区域
5community所在的社区
6targeturl 帖子详情
7city所在的城市
8Pub_time 发布发布时间
现场选择主要是基于本系统的应用研究,因为系统开发单机配置比较低,没有图片文件下载到本机。减轻单机压力。
(F) 数据处理
1)对象定义程序
Item 是定义捕获数据的容器。它是通过创建一个 scrapy.item.Item 类来声明的。定义属性为scrapy.item.Field对象,通过实例化需要的item来控制获取的站点数据。系统定义了九个抓取对象,分别是:帖子标题、租金、租赁方式、位置、社区、城市、帖子详情页链接、发布时间。这里的字段定义是根据数据处理端的需要来定义的。关键代码如下:
类 TcZufangItem(Item):
#帖子名称
标题=字段()
#租
钱=字段()
#出租方式
方法=字段()
#您所在的地区
区域=字段()
#地点
社区=字段()
#发布详情网址
目标网址=字段()
#发布发布时间
pub_time=字段()
#位置城市
城市=字段()
2)数据处理程序
Pipeline 类定义了数据保存和输出方法。Spider的parse方法返回的Item,在处理完ITEM_PIPELINES列表中Pipeline类对应的数据后,会以top格式输出数据。本系统返回管道的数据存储在Mongodb中。关键代码如下:
def process_item(self, item, spider):
如果 item['pub_time'] == 0:
raise DropItem("发现重复项:%s"% 项)
如果项目['方法'] == 0:
raise DropItem("发现重复项:%s"% 项)
如果项目['社区']==0:
raise DropItem("发现重复项:%s"% 项)
如果 item['money']==0:
raise DropItem("发现重复项:%s"% 项)
如果 item['area'] == 0:
raise DropItem("发现重复项:%s"% 项)
如果项目['城市'] == 0:
raise DropItem("发现重复项:%s"% 项)
zufang_detail = {
'title': item.get('title'),
'钱':item.get('钱'),
'方法':item.get('方法'),
'area': item.get('area',''),
'社区': item.get('社区',''),
'targeturl': item.get('targeturl'),
'pub_time': item.get('pub_time',''),
'city':item.get('city','')
}
result = self.db['zufang_detail'].insert(zufang_detail)
打印'[成功]'+item['targeturl']+'写入MongoDB数据库'
归还物品
(G) 数据可视化设计
数据的可视化,其实就是把数据库的数据转换成我们用户容易观察的形式。本系统使用Mongodb来存储数据。数据可视化基于Django+Semantiui,效果如下图所示:
四、系统操作
系统以58同城租赁平台为爬取目标。运行十个小时后,系统继续抓取网页上总共数万个列表数据。
Master运行截图:
Slave 运行截图:
五、系统部署
环境部署,因为分布式部署需要的环境类似。如果一个服务器部署程序需要配置环境,那就很麻烦了。这里使用docker镜像部署爬虫程序,使用Daocloud上的scrapy-env对。程序已经部署完毕,具体的docker部署过程可以参考网上。