开发工具:
文件大小: 5mb
下载次数: 0
上传时间: 2019-03-23
详细说明:
scrapy1.5中文文档,自己翻译,github账号:https://github.com/v5yangzai/scrapy1.5-chinese-documentScrape
教程( Scrap Tutorial)
在这个教程,我们将假定你的系统上面已经安装好了 Scrap。如果不是这种情况,参考安装指导
我们将继续解剖quotes.scrape.com,一个列出许多名人引用的网站
这个教程将指导你一步一步完成以下任务:
1.创建一个新的 Scrap项目
2.写一个爬虫去爬取网站和提取数据
3.用命令行导出已爬取的数据
4.改变爬虫递归地爬取下一页
5.使用爬虫参数
Scrap是用 python写的。如果你对这个语言不熟悉,你需要先更多地了解这门语言是怎样的,以便于充分使用 Scrap。
如果你已经熟悉其他语言了,想要快速学习 pyhton,我们推荐阅读《 Dive Into Python3》。或者,你可以按照 python教程操作
如果你不熟悉编程,想从 pyhton开始,你可以找到有用的在线书籍《 Learn Python The Hard Way》。你也可以看看《 this list of Python resources for
non- programmers》
创建一个项目 Creating a project
在你开始爬取之前,你将必须建立一个新的 Scrap项目。进入你想要存储代码的目求,然后运行
scrapy startproject tutorial
这将创建一个 tutoria1的目录,内容如下:
tutorial/
scrap. cfg
deploy configuration file
tutorial/
projects python module, youll import your code from here
items.py
project items definition file
middlewares. py project middlewares file
li
project pipelines file
t settings file
spiders/
#t a directory where you' ll later put your spiders
init.py
我们的第一个爬虫( Our first spider)
爬虫是你定义的类, Scrapγ使用它从一个网站或者一组网站中爬取信息。它们必须继承自 scrap. Spider,必须定义生成初始的请求,怎么定位这个
页面的链接和解析下载下来的页面内容来提取数据都是随意的。
这是我们第一个爬虫的代码。把它保存为一个文件,命名为 quotes_ spider.py,放在你的项目中的 tutorial/ spiders目录下。
import scra
class Quotes Spider(scrap. Spider)
def start requests(self):
r1s=[
http://quotes.toscrape.com/page/1/
http://quotes.toscrape.com/page/2/,
for url in urls
ield scrap Request(url=url, callback=self parse)
def parse(self, response)
page= response. url. split("/")[-21
filename =quotes-7shtm1% page
with open(filename,'wb')as f:
f write(response body
self. log( Saved file %s' % filename
正如你所看到的,我们的爬虫的继承白 scrap. Spider,而且定义了一些属性和方法:
name:爬虫的标识。它在一个项目中必须唯一,也就是说,你不能为不同的爬虫设置相同的名字。
· start_ requests():必须方法一个可迭代的请求对象( Requests)(可以返回请求的列表或者写一个生成器函数),爬虫将从这些请求中开始爬取。后
续的请求将从这些初始的请求中相继生成。
· parse():一个方法,它将被调用来处理每个请求下载获取的响应。参数 reponse是一个 TextResponse类的实例,保存了页面的文本内容,并且
有一些好用的方法来处理它。
parse()方法通常用来解析响应,提取爬取的数据生成字典,也寻找新的URLs来生成新的 requests( Request)
怎么运行爬虫( How to run spider)
要让我们的爬虫工作,在项目顶层目录运行
scrap crawl quotes
这个命令将运行我们添加的名为quotes的爬虫,它将会向域名为quotestoscrape.com的网站发送一些请求。你将获得一些类似于这些的输出
omitted for brevity
2016-12-16 21: 24: 05 scrap core engine] INFO: Spi
opened
2016-12-16 21: 24: 05 scrap. extensions. logstats INFO: Crawled 0 pages (at e pages/min), scraped e items (at o items/min)
2016-12-16 21: 24: 05 [scrap. extensions. telnet] DEBUG: Telnet console listening on 127.0.0.1: 6023
2016-12-1621:24:05[scrapy.core.engine]DebuG:Crawled(404)(referer:None)
2016-12-1621:24:05[scrapy.core.engine]DebuG:Crawled(200)(referer:None)
016-12-1621:24:05[scrapy.core.engine]DebuG:Crawled(200)(referer:NOne)
2016-12-16 21: 24: 05 [quotes DEBUG: Saved file quotes-1 html
2016-12-16 21: 24: 05 [quotes] DEBUG: Saved file quotes-2 html
2016-12-16 21: 24: 05 [scrap. core engine] INFO: Closing spider (finished)
现在,检查当前目录的文件。你应该会注意到两个新文件被创建: quotes.htm和 quotes2hm,它们中有各自ur的对应的网页内容,像我们 parse()
方法中所规定的一样
NOTE:如果你很好奇我们为什么还没有解析页面,请继续,我们将很快介绍它。
在底层发生了什么 What just happend under the hood)
Scrap调度从爬虫的 start_ requests方法中返回的 scrap Request请求对象。根据每个请求对象获得的响应,它会被 Response实例化,然后把响
应的实例化对象作为参数调用请求对象关联的回调方法(在此示例中,为 parse()方法)。
startrequests方法的快捷方式 A shortcut to the startrequests method)
你可以定义一个 start ur1s的类属性来绑定一个URLs的列表,来代替实现 start requests()方法通过URLs来生成 scrap. Request对象。这个列
表接下会在默认实现的 start requests()方法中被使用,为你的爬虫创建初始的请求。
import scrap
class Quotes spider (scrapy. Spider)
name =quotes
start urls
http://cuotes.toscrape.com/page/1/
def parse(self, re
filename =quotes-%s.html% page
with open(filename,wb)as f:
body
parse()方法将会被调用来处理这URLs的响应,即使我们没有明确告知 Scrap要这样。这是因为 parse()是 Scrap默认的回调方法,没有明确声明回
调函数的请求获得响应时,将会调用它。
提取数据( Extracting data)
最好的方法学习怎么通过 Scrap提取数据就是通过 Scrap she尝试使用选择器。运行
scrap shell 'nttp://quotes. toscrape com/page/1/
NOTE:在命令行运行 scrap she时u要使用引号包围,否则当你的ur中包含参数(即,&字符)的时候将不起作用。在 windows中,使用双引号:
scrapyshellhttp://quotes.toscrape.com/page/1/
你将看到类似如下的内容:
[∴. Scrap1 g here.
2016-09-1912:09:27[scrapy.coreengineDebuG:Crawled(200)(referer:None)
[S Available Scrap objects
scrap module (contains scrap Request, scrap Selector, etc
[s crawler
item
request
ponse<200http://quotes.toscrape.com/page/1/>
[sl settings
[s] Useful shortcuts
Shell help (print this help)
[s] fetch(reg. or url) Fetch request (or URL) and update local objects
[sI view (response) view response in a browser
使用这个shel,你可以在 response对象上通过CSS选择节点
>>>response. css(title
[Quotes to Scrape'>]
运行 response.css(" title')获得的结果是一个类似于列表的对象,称为 Selectorlist,它表示一列 Selector对象的集合, Selector对象包含
ML/HTML节点并允许你进一步细化选择和提取数据。
为了提取上面标题的文本内容,你可以这样:
>> response css('title:: text')extract()
[Quotes to Scrape]
这里有两点需要注意:
一是我们要在CSS语句中增加::txt,这意味着我们想从κtit1e丶节点中选择文本内容。如果我们没有指定:text,我们将得到整个节点,包括标
签
>>>response. css('title )extract()
['Quotes to Scrape
二是调用 , extract()方法得到的结果是一个列表,因为我们正在处理一个 Selectorlist实例。当你知道你仅仅想要第一个结果时,在这个示例中,你
可以这样
>>>response. css( title:: text).extract first()
Quotes to scrape
你也可以这样写
>>> response. css(title: text)L0. extract()
Quotes to Scrape
然而,当我们没有获得满足选择的节点,使用. extract first()避免 Indexerror,会返回None
这里有个教训:对于大多数代码而言,你想要弹性规避因为没有找到正确的页面或者爬取页面失败而产生错误,使用. extract first()至少能得到返
回值(Nore)。
除了 extract()和 extract first()以外,你也可以通过使用re()方法来使用正则表达式提取。
>>>response. css( title: text).re(r 'Quotes. *'
[Quotes to Scrape']
>>> response. css('title:: text')re(r'Q\w+)
['Quotes]
>>>response. css(title:: text). re(r(\w+) to (\w+)')
,Scrape
为了找到合适的CSS选择器使用,你可以在she中使用view( response)命令用你的浏览器打开当前响应的页面。这样你就可以使用浏览器的开发者工
具或者 Firebug这样的扩展工具了。
Seletor Gadget是一个可以快速寻找cSs选择器的工具,在多种浏览器中都可以使用。
XPah:简要介绍( XPath a brief intro)
除了cSs, Scrap选择器也支持使用Xath表达式。
>>> response. xpath( //title)
by Albert Einstein
(about)
Tags
ka class="tag" href="tag/change/page/1/>change
>>quote response css("div quote")0]
现在,我们从我们创建的 quote对象中提取 title, author和它的tags。
>> title quote css("span. text:: text"). extract first()
>>> title
The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking
>>>author quote cSs(" small. author: text").extract first
>>> author
Albert Einstein
得到的tags是一列字符串,我们可以使用 extract()方法来获得它们:
>>>tags= quote.css("div tags a tag: text").extract(
>>> tags
['change,'deep-thoughts',thinking,'world]
解决了怎么提取其中一个,我们可以遍历所有的 quotes节点,把得到的结果放在一个字典中
>>>for quote in response. css("div quote")
text quote css(span. text: text").extract first()
author -quote. css("small, author: text ). extract first()
tags =quote. css("div tags a tag: text )extract(
print(dict(text=text, authe
thor, tags=tags)
Tags:['change,'deep-thought
thinkir
orld'l,'author': 'Albert Einstein,'text:>>
在我们的爬虫中提取数据 Extracting data in our spider)
回到我们的爬虫。目前为止,没有提取任何数据,仅仅是在本地的文件中保存了整个HTML页面。我们将上面的提取逻辑集成到我们的爬虫中吧
个 Scrap爬虫通常会生成许多我们提取数据组成的字典。为此,我们在回调方法中使用 python的关键字 yield,如下所示
import scrap
class Quotes Spider(scrap. Spider
name =quotes
start urls =
http://quotes.toscrape.com/page/1/',
http://quotes.toscrape.com/page/2/
for quote in response. css('div. quote')
text: quote. css(span. text: text)extract first)
author: quote. css('small. author:: text).extract first(,
tags
uote. css('div tags a tag:: text) extract(),
如果你运行这个爬虫,提取的数据将会在og中显示出来。
2016-09-1918:57:19[scrapy.corescraperDebuG:Scrapedfrom<200http://quotes.toscrape.com/page/1/>
t tags :['life
1ove」
Andre Gide,text:"It is better to be hated for what you are than to be loved for what
2016-09-1918:57:19[scrapy.corescraperDebuG:Scrapedfrom<200http://quotes.toscrape.com/page/1/>
[tags:['edison,'failure','inspirational
paraphrased'1, author:' Thomas A. Edison','text: "I have not failed. I've ju
存储已爬取的内容( Storing the scraped data)
最简单存储数据的方法是使用 Feed Exports,使用如下的命令:
scrapy crawl quotes -o quotes json
这将会生成一个包含所有爬取到的项目的 quotes.json文件,通过JON序列化。
由于历史原因, Scrap会在给定的文件中追加内容,而不是覆盖原有的内容。如果你执行两次命令,并且在第一次命令之前没有移除这个文件,你将
会得到一个损坏的JsON文件
你可以使用其他格式,比如 USoN Lines:
scrapy crawl quotes -o quotes. jl
JoN Lines格式很有用的,因为它是流式的。你可以很简单的追加新的记录。当你执行两次命令的时候,不会出现和JsON格式一样的问题。而且每
个记录都是单独的一行,你可以不用在内容中也能处理大文件,向JQ这样的工具能帮助我们在命令行操作这些事情。
在小项目(如我们教程中的项目)中,文件到处就满足需求了。然而,如果你想要使用以爬取的em做更加复杂的事情,我们可以写一个Item
Pipeline。当项目创建的时候, Ite m Pipeline的占位文件就已经创建好了,就是 tutorial/ pipelines.py。如果你仅仅只想要存储 iitems,你不需要
使用任何 te m Pipe lines
获取链接( Following links)
你不仅仅需要http://quotes.toscrape.com的前两页内容,你想要从这个网站的所有页面获取quotes
现在你知道怎么从页面获取数据,让我们看看怎么从页面获取链接。
第一件事就是从页面中提取我们想要的链接。以我们的页面举例,我们可以从以下标签中看到有一个去往下一页的链接
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.