智慧旅游网站源码分享?智慧旅游平台解决方案

今天给各位分享智慧旅游网站源码分享的知识,其中也会对智慧旅游平台解决方案进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

Scrapy是一个使用Python语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘、监测和自动化测试。安装使用终端命令pipinstallScrapy即可。

Scrapy比较吸引人的地方是:我们可以根据需求对其进行修改,它提供了多种类型的爬虫基类,如:BaseSpider、sitemap爬虫等,新版本提供了对web2.0爬虫的支持。

1Scrapy介绍

1.1组成

ScrapyEngine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。Scheduler(调度器):负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列、入队,当引擎需要时,交还给引擎。Downloader(下载器):负责下载ScrapyEngine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给ScrapyEngine(引擎),由引擎交给Spider来处理。Spider(爬虫):负责处理所有Responses,从中解析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。ItemPipeline(管道):负责处理Spider中获取到的Item,并进行后期处理,如:详细解析、过滤、存储等。DownloaderMiddlewares(下载中间件):一个可以自定义扩展下载功能的组件,如:设置代理、设置请求头等。SpiderMiddlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件,如:自定义request请求、过滤response等。

总的来说就是:Spider和ItemPipeline需要我们自己实现,DownloaderMiddlewares和SpiderMiddlewares我们可以根据需求自定义。

1.2流程梳理

1)Spider将需要发送请求的URL交给ScrapyEngine交给调度器;

2)ScrapyEngine将请求URL转给Scheduler;

3)Scheduler对请求进行排序整理等处理后返回给ScrapyEngine;

4)ScrapyEngine拿到请求后通过Middlewares发送给Downloader;

5)Downloader向互联网发送请求,在获取到响应后,又经过Middlewares发送给ScrapyEngine。

6)ScrapyEngine获取到响应后,返回给Spider,Spider处理响应,并从中解析提取数据;

7)Spider将解析的数据经ScrapyEngine交给ItemPipeline,ItemPipeline对数据进行后期处理;

8)提取URL重新经ScrapyEngine交给Scheduler进行下一个循环,直到无URL请求结束。

1.3Scrapy去重机制

Scrapy提供了对request的去重处理,去重类RFPDupeFilter在dupefilters.py文件中,路径为:Python安装目录\\Lib\\site-packages\\scrapy,该类里面有个方法request_seen方法,源码如下:

defrequest_seen(self,request):\n判断指纹是否已经存在\niffpinself.fingerprints:\n不存在,加入到指纹集合中\nself.fingerprints.add(fp)\nifself.file:\nself.file.write(fp+os.linesep)

它在Scheduler接受请求的时候被调用,进而调用request_fingerprint方法(为request生成一个指纹),源码如下:

defrequest_fingerprint(request,include_headers=None):\nifinclude_headers:\ninclude_headers=tuple(to_bytes(h.lower())\nforhinsorted(include_headers))\ncache=_fingerprint_cache.setdefault(request,{})\nifinclude_headersnotincache:\nfp=hashlib.sha1()\nfp.update(to_bytes(request.method))\nfp.update(to_bytes(canonicalize_url(request.url)))\nfp.update(request.bodyorb&39;)\nifinclude_headers:\nforhdrininclude_headers:\nifhdrinrequest.headers:\nfp.update(hdr)\nforvinrequest.headers.getlist(hdr):\nfp.update(v)\ncache[include_headers]=fp.hexdigest()\nreturncache[include_headers]

在上面代码中我们可以看到

fp=hashlib.sha1()\n…\ncache[include_headers]=fp.hexdigest()

它为每一个传递过来的URL生成一个固定长度的唯一的哈希值。再看一下__init__方法,源码如下:

def__init__(self,path=None,debug=False):\nself.file=None\nself.fingerprints=set()\nself.logdupes=True\nself.debug=debug\nself.logger=logging.getLogger(__name__)\nifpath:\nself.file=open(os.path.join(path,&39;),&39;)\nself.file.seek(0)\nself.fingerprints.update(x.rstrip()forxinself.file)

我们可以看到里面有self.fingerprints=set()这段代码,就是通过set集合的特点(set不允许有重复值)进行去重。

去重通过dont_filter参数设置,如图所示

dont_filter为False开启去重,为True不去重。

2实现过程

制作Scrapy爬虫需如下四步:

创建项目:创建一个爬虫项目明确目标:明确你想要抓取的目标(编写items.py)制作爬虫:制作爬虫开始爬取网页(编写xxspider.py)存储内容:设计管道存储爬取内容(编写pipelines.py)

我们以爬取去哪儿网北京景区信息为例,如图所示:

2.1创建项目

在我们需要新建项目的目录,使用终端命令scrapystartproject项目名创建项目,我创建的目录结构如图所示:

spiders存放爬虫的文件items.py定义数据类型middleware.py存放中间件piplines.py存放数据的有关操作settings.py配置文件scrapy.cfg总的控制文件

2.2定义Item

Item是保存爬取数据的容器,使用的方法和字典差不多。我们计划提取的信息包括:area(区域)、sight(景点)、level(等级)、price(价格),在items.py定义信息,源码如下:

importscrapy\n\nclassTicketspiderItem(scrapy.Item):\narea=scrapy.Field()\nsight=scrapy.Field()\nlevel=scrapy.Field()\nprice=scrapy.Field()\npass

2.3爬虫实现

在spiders目录下使用终端命令scrapygenspider文件名要爬取的网址创建爬虫文件,然后对其修改及编写爬取的具体实现,源码如下:

importscrapy\nfromticketSpider.itemsimportTicketspiderItem\n\nclassQunarSpider(scrapy.Spider):\nname=&39;\nallowed_domains=[&39;]\nstart_urls=[&39;]\n\ndefparse(self,response):\nsight_items=response.css(&search-list.sight_item&39;area&39;::attr(data-districts)&39;sight&39;::attr(data-sight-name)&39;level&39;.level::text&39;price&39;.sight_item_priceem::text&翻页\nnext_url=response.css(&39;).extract_first()\nifnext_url:\nnext_url=&34;+next_url\nyieldscrapy.Request(\nnext_url,\ncallback=self.parse\n)

简单介绍一下:

name:爬虫名allowed_domains:允许爬取的域名atart_urls:爬取网站初始请求的url(可定义多个)parse方法:解析网页的方法response参数:请求网页后返回的内容

yield

在上面的代码中我们看到有个yield,简单说一下,yield是一个关键字,作用和return差不多,差别在于yield返回的是一个生成器(在Python中,一边循环一边计算的机制,称为生成器),它的作用是:有利于减小服务器资源,在列表中所有数据存入内存,而生成器相当于一种方法而不是具体的信息,占用内存小。

爬虫伪装

通常需要对爬虫进行一些伪装,关于爬虫伪装可通过【Python爬虫(一):爬虫伪装】做一下简单了解,这里我们使用一个最简单的方法处理一下。

使用终端命令pipinstallscrapy-fake-useragent安装在settings.py文件中添加如下代码:

DOWNLOADER_MIDDLEWARES={\n39;scrapy.downloadermiddlewares.useragent.UserAgentMiddleware&开启\n&39;:400,\n}

2.4保存数据

我们将数据保存到本地的csv文件中,csv具体操作可以参考:CSV文件读写,下面看一下具体实现。

首先,在pipelines.py中编写实现,源码如下:

importcsv\n\nclassTicketspiderPipeline(object):\ndef__init__(self):\nself.f=open(&39;,&39;,encoding=&39;,newline=&39;)\nself.fieldnames=[&39;,&39;,&39;,&39;]\nself.writer=csv.DictWriter(self.f,fieldnames=self.fieldnames)\nself.writer.writeheader()\ndefprocess_item(self,item,spider):\nself.writer.writerow(item)\nreturnitem\n\ndefclose(self,spider):\nself.f.close()

然后,将settings.py文件中如下代码:

ITEM_PIPELINES={\n&39;:300,\n}

放开即可。

2.5运行

我们在settings.py的同级目录下创建运行文件,名字自定义,放入如下代码:

fromscrapy.cmdlineimportexecute\nexecute(&39;.split())

这个爬虫名就是我们之前在爬虫文件中的name属性值,最后在Pycharm运行该文件即可。

作者:程序员野客出处:https://www.cnblogs.com/ityard

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平