Python基础与大数据应用-第八章-Python爬虫框架课件_第1页
Python基础与大数据应用-第八章-Python爬虫框架课件_第2页
Python基础与大数据应用-第八章-Python爬虫框架课件_第3页
Python基础与大数据应用-第八章-Python爬虫框架课件_第4页
Python基础与大数据应用-第八章-Python爬虫框架课件_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章Python爬虫框架第八章Python爬虫框架1目录

Contents01常见爬虫框架02Scrapy安装03Scrapy爬虫框架04Scrapy常用工具命令0506Scrapy爬虫实战项目训练07小结目录01常见爬虫框架02Scrapy03Scrapy爬虫2常见爬虫框架01常见爬虫框架010102030405爬虫框架Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等。ScrapyCrawley能高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。CrawleyPortia是一个用Python编写无需任何编程知识,就能可视化爬取网站数据的开源工具。Portia是运行在Web浏览器中,Portia提供了可视化的Web页面,只需通过简单单击,标注页面上需提取的相应数据,即可完成爬取规则的开发,这些规则还可在Scrapy中使用,用于抓取页面。PortiaPySpider是一个强大的网络爬虫系统,并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。PySpiderBeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。BeautifulSoup会帮你节省数小时甚至数天的工作时间。在获取html元素时,都是用bs4完成的。BeautifulSoup常见爬虫框架06Grab框架,可以构建各种复杂的网页抓取工具,从简单的5行脚本到处理数百万个网页的复杂异步网站抓取工具。Grab提供一个API用于执行网络请求和处理接收到的内容。Grab07Cola是一个分布式的爬虫框架,对于用户来说,只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。Cola0102030405爬虫框架Scrapy是Python开发的Scrapy安装02Scrapy安装02第一步

如Python和pip的版本比较低,需要将其升级。Python3.7安装方法按照第一章方法安装即可。pip3安装命令为【apt-getinstallPython3-pip】安装scrapy的依赖包【sudoapt-getinstallpython3python3-devpython-piplibxml2-devlibxslt1-devlibffi-devlibssl-devzlib1q-dev】在/home目录下用mkdir命令建立scrapy文件夹利用pip3命令安装scrapy【pipinstallscrapy】scrapy安装第二步第三步查看版本第四步【cd/home】【mkdirscrapy】第一步如Python和pip的版本比较低,需要将其升级。PScrapy爬虫框架03Scrapy爬虫框架03Scrapy爬虫框架Scrapy框架组件功能Scrapy引擎(ScrapyEngine)负责处理整个系统的数据流,并在相应动作时触发事件(框架核心)调度器(Scheduler)接受引擎发过来的Request请求,并加入队列中,并在引擎再次发来Request请求的时候提供给引擎下载器(Downloader)负责获取网页内容并将网页内容返回给蜘蛛spider爬虫(Spiders)Scrapy用户编写用于分析Response并提取Item的类项目管道(ItemPipeline)位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应下载器中间件(DownloaderMiddlewares)位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应爬虫中间件(SpiderMiddlewares)介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛(Spiger)的响应输入(Response)和请求输出(Item和Request)调度中间件(SchedulerMiddewares)介于Scrapy引擎和调度之间的中间件,处理从Scrapy引擎发送到调度的请求和响应Scrapy爬虫框架Scrapy框架组件功能Scrapy数据流运行过程step1引擎打开一个网站,找到处理该网站的Spider并向该Spider请求第一个要抓取的URL。step2引擎从Spider中获取第一个要爬取的URL并通过调度器(Scheduler)和Request进行调度。step3引擎从调度器请求下一个要爬取的URLstep4调度器返回下一个要爬取的URL给引擎,引擎将URL封装成一个请求(Request),通过下载中间件转发给下载器step5页面下载完毕后,下载器把资源封装成应答包(Response),并将其通过下载中间件发送给引擎step6引擎从下载器中接收到Response并通过Spider中间件发送给Spider处理step7Spider处理Response并返回爬取到的Item和新的Request发送给引擎step8引擎将爬取到的Item交给ItemPipeline,将Request给调度器Scrapy数据流运行过程step1step2step3stScrapy常用工具命令04Scrapy常用工具命令04创建一个Scrapy项目

在爬取之前,需先创建一个新的Scrapy项目。在Ubuntu16.04、Python3.7环境中,在/home/scapy/路径下建立一个文件夹,命令为【mkdirpyscr】,接下来进入该文件夹,在终端输入命令【scrapystartprojectpyscr】,即可创建一个名为pyscr的项目,如图所示。创建一个Scrapy项目在爬取之前,需先创建一个新的Scr11创建一个Scrapy项目pyscr项目内容:scrapy.cfg:项目配置文件pyscr/:项目Python模块,代码将从这里导入pyscr/items.py:项目items文件pyscr/middlewares.py:定义spider中间件和downloader中间件pyscr/pipelines.py:项目管道文件pyscr/settings.py:项目设置文件pyscr/spiders:放置Spider的目录【tree】命令查看项目结构,pyscr项目中包含如图所示内容创建一个Scrapy项目pyscr项目内容:【tree】命令12Scrapy全局命令在Scrapy框架中,提供了两种类型的命令:一种是针对项目的命令(即需要有项目,该命令才能成功运行);另一种为全局命令,这些命令不需要有项目就能运行(在有项目的情况下,这些命令也能运行)。全局命令一共有8个,具体如下:

startprojectsettingsrunspidershellfetchviewversionbenchScrapy全局命令在Scrapy框架中,提供了两种类型的命13Scrapy全局命令startproject命令语法:scrapystartproject<project_name>功能:在目录project_name下创建一个名为project_name的Scrapy项目。用法示例:

【scrapystartprojectmyproject】settings命令语法:

scrapy

settings

[options]功能:查看scrapy对应的配置信息,如果在项目目录内使用该命令,查看的是对应项目的配置信息,如果在项目外使用查看的是scrapy默认配置信息。用法示例:【scrapysettings--getBOT_NAME】获取得到蜘蛛项目的名称,如果没有获取结果则返回none输出结果:scrapybotScrapy全局命令startproject命令14Scrapy全局命令runspider命令语法:

scrapy

runspider

<spider_file.py>功能:在未创建项目的情况下,运行一个编写好的Python文件中的spider。用法示例:【scrapyrunspidermyspider.py】输出结果:[...spiderstartscrawling...]shell命令语法:

scrapy

shell

[url]功能:以给定的URL(如果给出)或者空(没有给出URL)启动Scrapyshell。用法示例:【scrapyshell】运行结束后,在终端屏幕上会出现抓取的控制信息Scrapy全局命令runspider命令15Scrapy全局命令fetch命令语法:scrapy

fetch

<url>功能:使用Scrapy下载器(downloader)下载给定的URL,并将获取到的内容送到标准输出。该命令以spider下载页面的方式获取页面。如果实际在项目中运行,fetch将会使用项目中spider的属性访问,如果该命令不在项目中运行,则会使用默认Scrapydownloader设定。用法示例:【scrapyfetch--nolog】【scrapyfetch--nolog--headers】view命令语法:

scrapy

view

<url>功能:在浏览器中打开给定的URL,并以Scrapyspider获取到的形式展现。有时候spider获取到的页面和普通用户看到的并不相同,此该命令可以用来检查spider所获取到的页面,并确认与用户看到的一致。应用示例:【scrapyview】Scrapy全局命令fetch命令16Scrapy全局命令version命令语法:

scrapy

version

[-v]功能:输出Scrapy版本。配合-v运行时,该命令同时输出Python,Twisted以及平台的信息,方便bug提交。应用示例:【scrapyversion–v】bench命令语法:scrapy

bench功能:运行benchmark测试,测试Scrapy在硬件上的效率。Scrapy全局命令version命令17Scrapy项目命令项目命令需要在有Scrapy项目的情况下,这些命令才能运行。项目命令主要有以下几个:crawlchecklisteditparsedeploygenspiderScrapy项目命令项目命令需要在有Scrapy项目的情况下18Scrapy项目命令crawl命令语法:

scrapy

crawl

<spider>功能:运行Scrapy项目,使用spider进行爬取。应用示例:【scrapycrawlpyscr】check命令语法:

scrapy

check

[-l]

<spider>功能:运行contract检查。应用示例:【scrapycheck–l】Scrapy项目命令crawl命令19Scrapy项目命令list命令语法:scrapy

list功能:列出当前项目中所有可用的spider。每行输出一个spider。应用示例:【scrapylist】edit命令语法:scrapy

edit

<spider>功能:使用EDITOR中设定的编辑器编辑给定的spider。该命令仅仅是提供一个快捷方式。开发者可以自由选择其它工具或者IDE来编写调试spider。应用示例:【scrapyeditspider1】Scrapy项目命令list命令20Scrapy项目命令parse命令语法:【scrapy

parse

<url>

[options]】功能:获取给定的URL并使用相应的spider分析处理。如果提供--callback选项,则使用spider中的解析方法处理,否则使用parse。支持的选项:--spider=SPIDER:跳过自动检测spider并强制使用特定的spider--a

NAME=VALUE:设置spider的参数(可能被重复)--callback

or

–c:spider中用于解析返回(response)的回调函数--pipelines:在pipeline中处理item--rulesor-r:使用CrawlSpider规则来发现用来解析返回(response)的回调函数--noitems:不显示爬取到的item--nolinks:不显示提取到的链接--nocolour:避免使用pygments对输出着色--depth

or

–d:指定跟进链接请求的层次数(默认1)--verbose

or

–v:显示每个请求的详细信息应用示例:【scrapyparse“/”-cparse_item】Scrapy项目命令parse命令21Scrapy项目命令deploy命令语法:scrapy

deploy[<target:project>|-l<target>|-L]功能:将项目部署到Scrapyd服务。genspider命令语法:scrapygenspider[-ttemplate]<name><domain>功能:在当前项目中创建一个新的的spiders。这仅是创建spider的一种快捷方式,该方法可以使用提前定义好的模板来生成spider,也可自己创建spider的源码文件,应用示例如图所示。Scrapy项目命令deploy命令22Scrapy爬虫实战05Scrapy爬虫实战05Scrapy爬虫实战

在Ubuntu16.04,Python3.7环境下,创建一个Scrapy项目,爬取“糗事百科”中“穿越”网页中网友发表的糗事内容,并将内容保存在文本文件中。1.创建Scrapy项目qsbk在爬取之前,必须创建一个新的Scrapy项目。在/home/scrapy目录下建立qsbk目录,并在/home/scrapy/qsbk目录下用【scrapy

startproject

qsbk】命令创建项目,如下图所示。Scrapy爬虫实战在Ubuntu16.04,Python24Scrapy爬虫实战2.设置settings.py文件settings.py文件是项目的配置文件,常用的参数有:BOT_NAME='qsbk',Scrapy项目的名字,使用startproject命令创建项目时被自动赋值;SPIDER_MODULES=['qsbk.spiders'],Scrapy搜索spider的模块列表,创建项目时被自动赋值;NEWSPIDER_MODULE='qsbk.spiders',使用genspider命令创建新spider的模块,创建项目时被自动赋值;ROBOTSTXT_OBEY=True,是否遵守robots.txt协议,默认遵守robots.txt协议。robots.txt是遵循Robot协议的一个文件,它保存在网站的服务器中,作用是告诉搜索引擎爬虫,本网站哪些目录下的网页不希望被爬取收录。在Scrapy启动后,会在第一时间访问网站的robots.txt文件,然后决定该网站的爬取范围。在某些情况下希望获取的是被robots.txt所禁止访问的,此时可将此配置项设置为False来获取数据;Scrapy爬虫实战2.设置settings.py文件25Scrapy爬虫实战CONCURRENT_REQUESTS=16,开启线程数量,默认16;AUTOTHROTTLE_START_DELAY=3,开始下载时限速并延迟时间;AUTOTHROTTLE_MAX_DELAY=60,高并发请求时最大延迟时间;DEFAULT_REQUEST_HEADERS={‘Accept’:‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’,‘Accept-Language’:‘en’,},这个参数是设置浏览器请求头,很多网站都会检查客户端的headers,可以在该参数里设置模拟浏览器;ITEM_PIPELINES={'demo1.pipelines.Demo1Pipeline':300,},Pipeline的路径,300表示优先级,范围(0-1000),值越小级别越高;具体设置qsbk项目的settings.py文件:(1)设置ROBOTSTXT_OBEY参数:ROBOTSTXT_OBEY=False(2)设置AUTOTHROTTLE_START_DELAY参数:删除参数前的“#”,AUTOTHROTTLE_START_DELAY=3(3)设置ITEM_PIPELINES参数:删除该参数中所有“#”(4)设置DEFAULT_REQUEST_HEADERS参数:删除该参数中所有“#”,并添加“‘User-Agent’:‘Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/48.0.2564.116Safari/537.36’,”,伪装成浏览器访问Scrapy爬虫实战CONCURRENT_REQUESTS26Scrapy爬虫实战3.设置items.py文件items.py负责数据模型的建立,是项目中的Item对象。Item对象是保存爬取到的数据的容器;其使用方法和Python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。Item使用简单的class定义语法和Field对象声明。在新建的qsbk项目中,使用items.py来定义存储的Item类,这个类需要继承scrapy.Item。其代码下图所示。Scrapy爬虫实战3.设置items.py文件27Scrapy爬虫实战4.创建spider爬虫文件爬虫模块的代码都放置与spiders文件夹中。爬虫模块是用于从单个网站或多个网站爬取数据的类,其中应包含初始页面的URL、跟进网页链接、分析页面内容、提取数据方法。为了创建一个Spider爬虫,必须继承scrapy.Spider类,且定义以下三个属性:name:

用于区别Spider。该名字必须是唯一的,不可为不同的Spider设定相同的名字start_urls:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取parse():是spider的一个方法。被调用时,每个初始URL完成下载后生成的

response对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(responsedata),提取数据(生成item)以及生成需要进一步处理的URL的Request对象。Scrapy爬虫实战4.创建spider爬虫文件28Scrapy爬虫实战在spiders文件夹(cd/spiders)下创建qsbk.py文件(vimqsbk.py),qsbk.py中的代码如图所示。需要注意的是,这段代码中不仅需要下载网页数据,还需要对这些数据进行提取。Scrapy有自己的数据提取机制--选择器(selector基于lxml库),它通过Xpath或者CSS表达式来提取HTML文件中的内容。Scrapy爬虫实战在spiders文件夹(cd/spid29Scrapy爬虫实战(1)XpathXPath是XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某部分位置的语言。Xpath使用路径表达式来选取XML文档中的节点或者节点集。这些路径表达式和在常规的电脑文件系统中看到的表达式非常相似。节点是通过沿着路径(path)或者步(steps)来选取的。在Xpath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML文档是被作为节点树来对待的,树的根被称为文档节点或者根节点。示例XML文档如下:<?xmlversion="1.0"encoding="ISO-8859-1"?><bookstore><book><titlelang="en">HarryPotter</title><author>JK.Rowling</author><year>2005</year><price>29.99</price></book></bookstore>上面XML文档中的节点:<bookstore>(文档节点)、<author>JK.Rowling</author>(元素节点)、lang="en"(属性节点)。节点有:父、子、同胞、先辈、后代,5种关系。按照上方的xml文件book就是title的父节点,title就是book的子节点,author和title是同胞,bookstore是author和title的先辈,反之author是bookstore的后代。Scrapy爬虫实战(1)Xpath30选取节点Xpath使用路径表达式在XML文档中选取节点。节点是通过沿着路径或者step来选取的。表8-1列出了最有用的路径表达式。对上面XML代码进行节点选取,其表达式如下表所示。Scrapy爬虫实战表达式描

述nodename选取此节点的所有子节点/从根节点选取//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.选取当前节点..选取当前节点的父节点@选取属性路径表达式结

果bookstore选取bookstore元素的所有子节点/bookstore选取根元素bookstore。假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径!bookstore/book选取属于bookstore的子元素的所有book元素//book选取所有book子元素,而不管它们在文档中的位置bookstore//book选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置//@lang选取名为lang的所有属性选取节点Scrapy爬虫实战表达式描述31选取未知节点XPath通配符可用来选取未知的XML元素。常用的通配符如下表所示。对上述XML代码,下表列出了一些路径表达式,以及这些表达式的结果。Scrapy爬虫实战通配符描

述*匹配任何元素节点@*匹配任何属性节点node()匹配任何类型的节点路径表达式结

果/bookstore/*选取bookstore元素的所有子元素//*选取文档中的所有元素//title[@*]选取所有带有属性的title元素选取未知节点Scrapy爬虫实战通配符描述*匹配任何32Scrapy爬虫实战下面,以糗事百科网站为例,初始网站为/history/,需要抓取网页中的“糗事”。首先分析这张网页中的元素。用浏览器打来该网页,右击打开快捷菜单,选择“检查”(谷歌浏览器)或“查看元素”(火狐浏览器)或“检查元素”(IE浏览器)命令,查看页面元素,如图所示。Scrapy爬虫实战下面,以糗事百科网站为例,初始网站为h33Scrapy爬虫实战

从下图可以看出,网友发表“糗事”所有信息都放置在<divclass=“col1”>中,根据Xpath的编写规则,其xpath路径表达式可以写为“//div[@class=’col1’]/div”。而需要爬取的“糗事”文字内容都存放在<divclass="content"><span>*******************</span>中(****为具体的“糗事”,如图8-14所示),因此其xpath可以写为“.//div[@class='content']/span//text()”。Scrapy爬虫实战从下图可以看出,网友发表“糗事”所有信34Scrapy爬虫实战(2)选择器(Selector)有了Xpath路径表达式还不能直接进行网页数据提取,还需要一个提取机制。而在Scrapy框架中有一套自己的数据提取机制,称为选择器(selector),它通过特定的Xpath或CSS表达式来选择HTML文件中的某个部分。Scrapy选择器构建于lxml库之上,因此它们在速度和解析准确性上非常相似。Selector选择器有四个基本的方法:xpath(表达式):传入Xpath表达式,返回该表达式对应的节点列表。css(表达式):传入CSS表达式,返回该表达式对应的节点列表。extract():返回被选择元素的unicode字符串的列表。Extract()表示所有的元素,extract_first()表示第一个元素。re(表达式):返回通过正则表达式提取的unicode字符串列表。选择器在使用方式上很方便,可以使用传入的response直接调用,如response.xpath(表达式)、response.css(表达式)。调用方法很简单,而构建xpath和css比较复杂。Scrapy框架中提供了一种简便的方式来查看Xpath表达式是否正确有用。Scrapy爬虫实战(2)选择器(Selector)35Scrapy爬虫实战在终端窗口输入命令【scrapyshellURL】,成功运行就会有返回结果。如【scrapyshell】,其返回结果如图所示。

从图中看到response就是访问以上网址获得的响应,接下来输入【response.xpath(“.//div[@class='content']/span//text()”).extract()】,验证Xpath表达式的正确性,如果正确就能抽取当前网页中所有糗事的内容,如不正确,则返回值为空。Scrapy爬虫实战在终端窗口输入命令【scr36Scrapy爬虫实战

5.设置pipelines文件pipelines文件负责对spider返回数据进行处理,可以将数据写入数据库,也可以写入到文件等。该项目中将数据写入到文本文件。代码如图所示。Scrapy爬虫实战5.设置pipelines文件37Scrapy爬虫实战

6.运行Scrapy项目在qsbk目录下,用crawl命令运行Scrapy项目。【scrapycrawlqsbk】运行结束后,在该目录下生成文本文件qsbk.txt,使用命令【catqsbk.txt】查看其内容。项目运行及结果见下面2个图所示。项目运行的结果由于网页在变动,因此结果不尽相同。Scrapy爬虫实战6.运行Scrapy项目项目运38项目训练:用Scrapy爬取豆瓣图书保存到MySQL数据库文件06项目训练:用Scrapy爬取豆瓣图书保存到MySQL数据库文用Scrapy爬取豆瓣图书保存到MySQL数据库文件

(1)用Scrapy框架抓取把豆瓣网(/tag/中国文学)中的图书信息(包括书名、作者、类别、评价、评价人数、图书类别);(2)将抓取的数据保存到MySQL数据库中。

训练目标通过对Scarpy爬取项目的设计与实现,掌握Scrapy框架的用法和MySQL的基本操作,会用Scrapy框架爬取网页数据并保存至数据库。训练内容用Scrapy爬取豆瓣图书保存到(1)用Scrap40

(1)任务分析Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言——结构化查询语言(SQL)进行数据库管理。本项目使Scrapy框架首先抓取豆瓣网上的图书信息,通过创建项目、设置items.py文件和pipelines.py文件、创建spider.py文件等操作进行抓取。然后将抓取的信息通过创建数据库、创建存放图书信息的数据表等操作存储到MySQL数据库中。本项目的关键是Xpath表达式的构建。项目需要抓取的URL为/tag/中国文学,抓取网页中图书的书名、作者、评价、评价人数、图书信息。通过浏览器的元素分析,可以知道这些信息的xpath路径为:每本图书的信息都保存在class=“info”的div里面,其对应的xpath路径为‘//div[@class=“info”]’;书名h2的下一个a标签里面,其对应的xpath路径为‘./h2/a/text()’;作者在class=“pub”的div标签里面,其对应的xpath路径为‘./div[@class=’pub‘]/text()’;评分在第二个div标签下的第二个span标签里面,其对应的xpath路径为‘./div[2]/span[2]/text()’;评价人数在第二个div标签下的第三个span标签里面,其对应的xpath路径为‘./div[2]/span[3]/text()’;后页的链接在class=“paginator”div标签下的属性为class=‘next’的span标签下面的一个a标签里面的href属性里面,其对应的xpath路径为'div[@class='paginator']/span[@class='next']/a/@href'。训练步骤用Scrapy爬取豆瓣图书保存到MySQL数据库文件(1)任务分析训练步骤用Scrapy爬取豆瓣图书保41

(2)项目实施①新建Scrapy项目douban在Ubuntu的终端依次完成以下操作:【cd/home】切换到home目录;【ls】查看该目录下的所有内容;【mkdirscrapy】在home目录下创建scrapy文件夹;【cdscrapy】进入scrapy文件夹;【scrapystartprojectdouban】创建Scrapy项目douban;【ls】查看创建成功的scrapy项目douban。②设置settings.py文件在Ubuntu的终端依次完成以下操作:【cd/home/scrapy/douban/douban】进入douban目录;【ls】查看该目录下的所有内容,找到settings.py文件;【vimsettings.py】打开setting.py文件并编辑,修改如下数据:ROBOTSTXT=False、删除ITEM_PIPELINES参数前“#”、USER_AGENT参数前“#”去掉,并将参数值改为“USER_AGENT='Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/48.0.2564.116Safari/537.36'”,保存退出。用Scrapy爬取豆瓣图书保存到MySQL数据库文件训练步骤(2)项目实施用Scrapy爬取豆瓣图书保存到训练42项目训练

③设置items.py文件【vimitems.py】打开并编辑文件,添加如下数据(将pass改成以下5行):book_name=scrapy.Field()author=scrapy.Field()grade=scrapy.Field()count=scrapy.Field()introduction=scrapy.Field()保存退出用Scrapy爬取豆瓣图书保存到MySQL数据库文件用Scrapy爬取豆瓣图书保存到MySQL数据库文件训练步骤④爬虫编写【cd/home/scrapy/douban/douan/spiders】切换至spiders目录下;【vimdoubanspider.py】创建与编辑爬虫文件,导入要爬取的数据项,构建爬虫所需的name、URL及爬取的内容,添加代码如下:importscrapyfromdouban.itemsimportDoubanItem

classDoubanspiderSpider(scrapy.Spider):name='doubanspider'allowed_domains=['']defstart_requests(self):url="/tag/%E4%B8%AD%E5%9B%BD%E6%96%87%E5%AD%A6"yieldscrapy.Request(url,callback=self.parse

,dont_filter=True)项目训练③设置items.py文件用Scrapy爬43

defparse(self,response):item=DoubanItem()info_list=response.xpath("//div[@class='info']")forinfoininfo_list:

item['book_name']=info.xpath("./h2/a/text()").extract_first().strip()item['author']=info.xpath("./div[@class='pub']/text()").extract_first().strip().split('/')[0]

item['grade']=info.xpath("./div[2]/span[2]/text()").extract_first()item['count']=info.xpath("./div[2]/span[3]/text()").extract_first()item['introduction']=info.xpath("./p/text()").extract_first()yielditemnext_temp_url=response.xpath("//div[@id='subject_list']/div[@class='paginator']/span[@class='next']/a/@href").extract_first()ifnext_temp_url:next_url=response.urljoin(next_temp_url)yieldscrapy.Request(next_url)

用Scrapy爬取豆瓣图书保存到MySQL数据库文件训练步骤用Scrapy爬取豆瓣图书保存到训练步骤44项目训练

代码如图所示用Scrapy爬取豆瓣图书保存到MySQL数据库文件训练步骤项目训练代码如图所示用Scrapy爬取豆瓣图书保存45项目训练

⑤运行爬虫并将其保存至csv文件【cd/home/scrapy/douban】返回douban目录下;【ls】查看其中文件,确保有douban文件夹和scrapy.cfg文件后;【scrapycrawldoubanspider–odoubanread.csv】运行爬虫;【ls】查看其中文件,发现生成doubanread.csv文件【catdoubanread.csv】查看文件内容结果。⑥创建MySQL数据库douban和数据表doubanread【mysql-uroot-p】终端输入命令后,在Enterpassword:后输入密码******,进入MySQL数据库;创建名为douban的数据库:mysql>createdatabasedouban;显示所有的数据库:mysql>showdatabases;选择douban数据库:mysql>usedouban;在MySQL数据库里创建表doubanread,命令如下:mysql>CREATETABLEdoubanread(idint(11)PRIMARYKEYNOTNULLAUTO_INCREMENT,

book_namevarchar(255)DEFAULTNULL,authorvarchar(255)DEFAULTNULL,gradevarchar(255)DEFAULTNULL,countvarchar(255)DEFAULTNULL,

introductionvarchar(255)DEFAULTNULL)ENGINE=InnoDBAUTO_INCREMENT=1409DEFAULTCHARSET=utf8;mysql>exit;退出数据库。用Scrapy爬取豆瓣图书保存到MySQL数据库文件训练步骤项目训练⑤运行爬虫并将其保存至csv文件用Scra46项目训练

⑦设置pipelines.py文件【cd/home/scrapy/douban/douban】【vimpipelines.py】编辑pipelines.py文件,导入MySQLdb数据库,配置数据库相关的信息,代码如下:importMySQLdbclassDoubanPipeline(object):def__init__(self):#参数依次是:服务器主机名、用户名、密码、数据库、编码类型 self.db=MySQLdb.connect('localhost',’root’,'','douban',charset='utf8')self.cursor=self.db.cursor()defprocess_item(self,item,spider):book_name=item.get("book_name","N/A")author=item.get("author","N/A")grade=item.get("grade","N/A")count=item.get("count","N/A")introduction=item.get("introduction","N/A")sql="insertintodoubanread(book_name,author,class_,grade,count,introduction)values(%s,%s,%s,%s,%s,%s)"self.cursor.execute(sql,(book_name,author,class_,grade,count,introduction))mit()defcolse_spider(self,spider):self.cursor.close()self.db.close()用Scrapy爬取豆瓣图书保存到MySQL数据库文件训练步骤项目训练⑦设置pipelines.py文件用Scr47

⑧再次运行爬虫【scrapycrawldoubanspider】⑨查看MySQL数据库中保存的数据【mysql–uroot-p】输入密码,进入MySQL数据库;mysql>usedouban;使用豆瓣数据库mysql>selectcount(*)fromdoubanread计数统计mysql>select*fromdoubanread;查询全部记录查询结果如图所示。用Scrapy爬取豆瓣图书保存到MySQL数据库文件训练步骤⑧再次运行爬虫用Scrapy爬取豆瓣图书保存到训练48项目训练

项目小结:使用Scrapy框架的爬取网络信息的流程如下在spider(爬取数据文件)中传入了初始url,并通过引擎传递给scheduler调度队列生成request请求,并通过downloadermiddleware进入downloader从互联网上下载数据,返回一个response对象。response是一个scrapy.http.response.html.HtmlResponse对象,可以通过css和xpath语法来提取数据提取出的数据是一个Selector或SelectorList对象,并通过downloadermiddle经引擎传递给spider(爬取数据文件)中的parse函数进行解析,通过extract()或getall()获取了字符串列表类型。get()方法返回第一个值为str类型,xtract_first()返回列表中的第一个值为str类型解析后使用yield将函数转换为一个生成器,不断的从中抽数据,并传递给pipeline进行处理在Itempipeline中使用三个核心方法和初始化函数,首先在__init__()或open_spider()打开数据,接着使用核心方法process_item进行数据处理,最后使用了close_spider()方法关闭了打开的数据,如需把数据保存至MySQL数据库时创建数据库和数据表,在Python3.7连接MySQL数据库,需要用到pymysql或者是MySQLdb模块。最后运行爬虫项目,得到目标结果Scrapy框架爬取数据时,要注意反爬虫headers的设置。用Scrapy爬取豆瓣图书保存到MySQL数据库文件项目训练项目小结:使用Scrapy框架的爬取网络信49小结07小结07小结

Scrapy框架中由Scrapy引擎(ScrapyEngine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spiders)、项目管道(ItemPipeline)、下载器中间件(DownloaderMiddlewares)、爬虫中间件(SpiderMiddlewares)、调度中间件(SchedulerMiddewares)组件组成。Scrapy项目创建后,该项目中包含项目配置文件scrapy.cfg、项目items文件items.py、定义spider中间件和downloader中间件的middlewares.py、项目管道文件pipelines.py、项目设置文件settings.py、放置Spider的目录spiders等文件、文件夹。创建Scrapy项目的命令为scrapystartproject项目名称;运行项目命令为scrapycrawl项目名称。命令scrapyshellURL与选择器(selector)配合使用,可以测试抽取数据的xpath或css表达式的正确性。创建Scrapy项目后,需要修改items.py、settings.py、pipelins.py文件和创建爬取数据****(项目名称).py文件(这个文件在spiders目录下)。小结Scrapy框架中由Scrapy引擎(Sc51THANKS!THANKS!52第八章Python爬虫框架第八章Python爬虫框架53目录

Contents01常见爬虫框架02Scrapy安装03Scrapy爬虫框架04Scrapy常用工具命令0506Scrapy爬虫实战项目训练07小结目录01常见爬虫框架02Scrapy03Scrapy爬虫54常见爬虫框架01常见爬虫框架010102030405爬虫框架Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等。ScrapyCrawley能高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。CrawleyPortia是一个用Python编写无需任何编程知识,就能可视化爬取网站数据的开源工具。Portia是运行在Web浏览器中,Portia提供了可视化的Web页面,只需通过简单单击,标注页面上需提取的相应数据,即可完成爬取规则的开发,这些规则还可在Scrapy中使用,用于抓取页面。PortiaPySpider是一个强大的网络爬虫系统,并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。PySpiderBeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。BeautifulSoup会帮你节省数小时甚至数天的工作时间。在获取html元素时,都是用bs4完成的。BeautifulSoup常见爬虫框架06Grab框架,可以构建各种复杂的网页抓取工具,从简单的5行脚本到处理数百万个网页的复杂异步网站抓取工具。Grab提供一个API用于执行网络请求和处理接收到的内容。Grab07Cola是一个分布式的爬虫框架,对于用户来说,只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。Cola0102030405爬虫框架Scrapy是Python开发的Scrapy安装02Scrapy安装02第一步

如Python和pip的版本比较低,需要将其升级。Python3.7安装方法按照第一章方法安装即可。pip3安装命令为【apt-getinstallPython3-pip】安装scrapy的依赖包【sudoapt-getinstallpython3python3-devpython-piplibxml2-devlibxslt1-devlibffi-devlibssl-devzlib1q-dev】在/home目录下用mkdir命令建立scrapy文件夹利用pip3命令安装scrapy【pipinstallscrapy】scrapy安装第二步第三步查看版本第四步【cd/home】【mkdirscrapy】第一步如Python和pip的版本比较低,需要将其升级。PScrapy爬虫框架03Scrapy爬虫框架03Scrapy爬虫框架Scrapy框架组件功能Scrapy引擎(ScrapyEngine)负责处理整个系统的数据流,并在相应动作时触发事件(框架核心)调度器(Scheduler)接受引擎发过来的Request请求,并加入队列中,并在引擎再次发来Request请求的时候提供给引擎下载器(Downloader)负责获取网页内容并将网页内容返回给蜘蛛spider爬虫(Spiders)Scrapy用户编写用于分析Response并提取Item的类项目管道(ItemPipeline)位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应下载器中间件(DownloaderMiddlewares)位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应爬虫中间件(SpiderMiddlewares)介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛(Spiger)的响应输入(Response)和请求输出(Item和Request)调度中间件(SchedulerMiddewares)介于Scrapy引擎和调度之间的中间件,处理从Scrapy引擎发送到调度的请求和响应Scrapy爬虫框架Scrapy框架组件功能Scrapy数据流运行过程step1引擎打开一个网站,找到处理该网站的Spider并向该Spider请求第一个要抓取的URL。step2引擎从Spider中获取第一个要爬取的URL并通过调度器(Scheduler)和Request进行调度。step3引擎从调度器请求下一个要爬取的URLstep4调度器返回下一个要爬取的URL给引擎,引擎将URL封装成一个请求(Request),通过下载中间件转发给下载器step5页面下载完毕后,下载器把资源封装成应答包(Response),并将其通过下载中间件发送给引擎step6引擎从下载器中接收到Response并通过Spider中间件发送给Spider处理step7Spider处理Response并返回爬取到的Item和新的Request发送给引擎step8引擎将爬取到的Item交给ItemPipeline,将Request给调度器Scrapy数据流运行过程step1step2step3stScrapy常用工具命令04Scrapy常用工具命令04创建一个Scrapy项目

在爬取之前,需先创建一个新的Scrapy项目。在Ubuntu16.04、Python3.7环境中,在/home/scapy/路径下建立一个文件夹,命令为【mkdirpyscr】,接下来进入该文件夹,在终端输入命令【scrapystartprojectpyscr】,即可创建一个名为pyscr的项目,如图所示。创建一个Scrapy项目在爬取之前,需先创建一个新的Scr63创建一个Scrapy项目pyscr项目内容:scrapy.cfg:项目配置文件pyscr/:项目Python模块,代码将从这里导入pyscr/items.py:项目items文件pyscr/middlewares.py:定义spider中间件和downloader中间件pyscr/pipelines.py:项目管道文件pyscr/settings.py:项目设置文件pyscr/spiders:放置Spider的目录【tree】命令查看项目结构,pyscr项目中包含如图所示内容创建一个Scrapy项目pyscr项目内容:【tree】命令64Scrapy全局命令在Scrapy框架中,提供了两种类型的命令:一种是针对项目的命令(即需要有项目,该命令才能成功运行);另一种为全局命令,这些命令不需要有项目就能运行(在有项目的情况下,这些命令也能运行)。全局命令一共有8个,具体如下:

startprojectsettingsrunspidershellfetchviewversionbenchScrapy全局命令在Scrapy框架中,提供了两种类型的命65Scrapy全局命令startproject命令语法:scrapystartproject<project_name>功能:在目录project_name下创建一个名为project_name的Scrapy项目。用法示例:

【scrapystartprojectmyproject】settings命令语法:

scrapy

settings

[options]功能:查看scrapy对应的配置信息,如果在项目目录内使用该命令,查看的是对应项目的配置信息,如果在项目外使用查看的是scrapy默认配置信息。用法示例:【scrapysettings--getBOT_NAME】获取得到蜘蛛项目的名称,如果没有获取结果则返回none输出结果:scrapybotScrapy全局命令startproject命令66Scrapy全局命令runspider命令语法:

scrapy

runspider

<spider_file.py>功能:在未创建项目的情况下,运行一个编写好的Python文件中的spider。用法示例:【scrapyrunspidermyspider.py】输出结果:[...spiderstartscrawling...]shell命令语法:

scrapy

shell

[url]功能:以给定的URL(如果给出)或者空(没有给出URL)启动Scrapyshell。用法示例:【scrapyshell】运行结束后,在终端屏幕上会出现抓取的控制信息Scrapy全局命令runspider命令67Scrapy全局命令fetch命令语法:scrapy

fetch

<url>功能:使用Scrapy下载器(downloader)下载给定的URL,并将获取到的内容送到标准输出。该命令以spider下载页面的方式获取页面。如果实际在项目中运行,fetch将会使用项目中spider的属性访问,如果该命令不在项目中运行,则会使用默认Scrapydownloader设定。用法示例:【scrapyfetch--nolog】【scrapyfetch--nolog--headers】view命令语法:

scrapy

view

<url>功能:在浏览器中打开给定的URL,并以Scrapyspider获取到的形式展现。有时候spider获取到的页面和普通用户看到的并不相同,此该命令可以用来检查spider所获取到的页面,并确认与用户看到的一致。应用示例:【scrapyview】Scrapy全局命令fetch命令68Scrapy全局命令version命令语法:

scrapy

version

[-v]功能:输出Scrapy版本。配合-v运行时,该命令同时输出Python,Twisted以及平台的信息,方便bug提交。应用示例:【scrapyversion–v】bench命令语法:scrapy

bench功能:运行benchmark测试,测试Scrapy在硬件上的效率。Scrapy全局命令version命令69Scrapy项目命令项目命令需要在有Scrapy项目的情况下,这些命令才能运行。项目命令主要有以下几个:crawlchecklisteditparsedeploygenspiderScrapy项目命令项目命令需要在有Scrapy项目的情况下70Scrapy项目命令crawl命令语法:

scrapy

crawl

<spider>功能:运行Scrapy项目,使用spider进行爬取。应用示例:【scrapycrawlpyscr】check命令语法:

scrapy

check

[-l]

<spider>功能:运行contract检查。应用示例:【scrapycheck–l】Scrapy项目命令crawl命令71Scrapy项目命令list命令语法:scrapy

list功能:列出当前项目中所有可用的spider。每行输出一个spider。应用示例:【scrapylist】edit命令语法:scrapy

edit

<spider>功能:使用EDITOR中设定的编辑器编辑给定的spider。该命令仅仅是提供一个快捷方式。开发者可以自由选择其它工具或者IDE来编写调试spider。应用示例:【scrapyeditspider1】Scrapy项目命令list命令72Scrapy项目命令parse命令语法:【scrapy

parse

<url>

[options]】功能:获取给定的URL并使用相应的spider分析处理。如果提供--callback选项,则使用spider中的解析方法处理,否则使用parse。支持的选项:--spider=SPIDER:跳过自动检测spider并强制使用特定的spider--a

NAME=VALUE:设置spider的参数(可能被重复)--callback

or

–c:spider中用于解析返回(response)的回调函数--pipelines:在pipeline中处理item--rulesor-r:使用CrawlSpider规则来发现用来解析返回(response)的回调函数--noitems:不显示爬取到的item--nolinks:不显示提取到的链接--nocolour:避免使用pygments对输出着色--depth

or

–d:指定跟进链接请求的层次数(默认1)--verbose

or

–v:显示每个请求的详细信息应用示例:【scrapyparse“/”-cparse_item】Scrapy项目命令parse命令73Scrapy项目命令deploy命令语法:scrapy

deploy[<target:project>|-l<target>|-L]功能:将项目部署到Scrapyd服务。genspider命令语法:scrapygenspider[-ttemplate]<name><domain>功能:在当前项目中创建一个新的的spiders。这仅是创建spider的一种快捷方式,该方法可以使用提前定义好的模板来生成spider,也可自己创建spider的源码文件,应用示例如图所示。Scrapy项目命令deploy命令74Scrapy爬虫实战05Scrapy爬虫实战05Scrapy爬虫实战

在Ubuntu16.04,Python3.7环境下,创建一个Scrapy项目,爬取“糗事百科”中“穿越”网页中网友发表的糗事内容,并将内容保存在文本文件中。1.创建Scrapy项目qsbk在爬取之前,必须

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论