Scrapy入门教程
2013-07-24 09:47
295 查看
本文参考Scrapy Tutorial里面的文档,翻译出来加上自己的理解,供大家学习。
在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容,这一切在Scrapy框架内实现将是很简单轻松的事情。
本教程主要内容包括一下四步:
1. 创建一个新的Scrapy Project
2. 定义你需要从网页中提取的元素Item
3. 实现一个Spider类,通过接口完成爬取URL和提取Item的功能
4. 实现一个Item PipeLine类,完成Item的存储功能
新建工程
首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:
最后的Domz就是项目名称。这个命令会在当前目录下创建一个新目录Domz,结构如下:
scrapy.cfg: 项目配置文件
items.py: 需要提取的数据结构定义文件
pipelines.py: 管道定义,用来对items里面提取的数据做进一步处理,如保存等
settings.py: 爬虫配置文件
spiders: 放置spider的目录
定义Item
在items.py里面定义我们要抓取的数据:
这里我们需要获取dmoz页面上的标题,链接,描述,所以定义一个对应的items结构,不像Django里面models的定义有那么多种类的Field,这里只有一种就叫Field(),再复杂就是Field可以接受一个default值。
实现Spider
spider只是一个继承字scrapy.spider.BaseSpider的Python类,有三个必需的定义的成员
name: 名字,这个spider的标识
start_urls: 一个url列表,spider从这些网页开始抓取
parse(): 一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表
所以在spiders目录下新建一个spider,dmoz_spider.py:
提取Item
提取数据到Items里面,主要用到XPath提取网页数据:
scrapy有提供两个XPath选择器,HtmlXPathSelector和XmlXPathSelector,一个用于HTML,一个用于XML,XPath选择器有三个方法
select(xpath): 返回一个相对于当前选中节点的选择器列表(一个XPath可能选到多个节点)
extract(): 返回选择器(列表)对应的节点的字符串(列表)
re(regex): 返回正则表达式匹配的字符串(分组匹配)列表
一种很好的方法是在Shell里面对XPath进行测试:
现在修改parse()方法看看如何提取数据到items里面去:
实现PipeLine
PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。
PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到一个文件中:
到现在,我们就完成了一个基本的爬虫的实现,可以输入下面的命令来启动这个Spider:
原创文章,转载请注明:转载自CodeLogic[http://www.icodelogic.com]
本文链接地址: http://www.icodelogic.com/?p=441
在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容,这一切在Scrapy框架内实现将是很简单轻松的事情。
本教程主要内容包括一下四步:
1. 创建一个新的Scrapy Project
2. 定义你需要从网页中提取的元素Item
3. 实现一个Spider类,通过接口完成爬取URL和提取Item的功能
4. 实现一个Item PipeLine类,完成Item的存储功能
新建工程
首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:
1 | [python] view plaincopy scrapy startproject Domz |
12 | [cpp] view plaincopy dmoz<span style="color:rgb(0,0,64)">/</span> scrapy.<span style="color:rgb(0,119,136)">cfg</span> dmoz<span style="color:rgb(0,0,64)">/</span> __init__.<span style="color:rgb(0,119,136)">py</span> items.<span style="color:rgb(0,119,136)">py</span> pipelines.<span style="color:rgb(0,119,136)">py</span> settings.<span style="color:rgb(0,119,136)">py</span> spiders<span style="color:rgb(0,0,64)">/</span> __init__.<span style="color:rgb(0,119,136)">py</span> |
items.py: 需要提取的数据结构定义文件
pipelines.py: 管道定义,用来对items里面提取的数据做进一步处理,如保存等
settings.py: 爬虫配置文件
spiders: 放置spider的目录
定义Item
在items.py里面定义我们要抓取的数据:
12 | [python] view plaincopy <span style="color:rgb(255,119,0)"><strong>from</strong></span> scrapy.<span style="color:black">item</span> <span style="color:rgb(255,119,0)"><strong>import</strong></span> Item, Field <span style="color:rgb(255,119,0)"><strong>class</strong></span> DmozItem<span style="color:black">(</span>Item<span style="color:black">)</span>: title = Field<span style="color:black">(</span><span style="color:black">)</span> link = Field<span style="color:black">(</span><span style="color:black">)</span> desc = Field<span style="color:black">(</span><span style="color:black">)</span> |
实现Spider
spider只是一个继承字scrapy.spider.BaseSpider的Python类,有三个必需的定义的成员
name: 名字,这个spider的标识
start_urls: 一个url列表,spider从这些网页开始抓取
parse(): 一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表
所以在spiders目录下新建一个spider,dmoz_spider.py:
12 | [python] view plaincopy <span style="color:rgb(255,119,0)"><strong>class</strong></span> DmozSpider<span style="color:black">(</span>BaseSpider<span style="color:black">)</span>: name = <span style="color:rgb(72,61,139)">"dmoz.org"</span> start_urls = <span style="color:black">[</span> <span style="color:rgb(72,61,139)">"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"</span>, <span style="color:rgb(72,61,139)">"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"</span> <span style="color:black">]</span> <span style="color:rgb(255,119,0)"><strong>def</strong></span> parse<span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span>, response<span style="color:black">)</span>: filename = response.<span style="color:black">url</span>.<span style="color:black">split</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">"/"</span><span style="color:black">)</span><span style="color:black">[</span>-<span style="color:rgb(255,69,0)">2</span><span style="color:black">]</span> <span style="color:rgb(0,128,0)">open</span><span style="color:black">(</span>filename, <span style="color:rgb(72,61,139)">'wb'</span><span style="color:black">)</span>.<span style="color:black">write</span><span style="color:black">(</span>response.<span style="color:black">body</span><span style="color:black">)</span> |
提取数据到Items里面,主要用到XPath提取网页数据:
scrapy有提供两个XPath选择器,HtmlXPathSelector和XmlXPathSelector,一个用于HTML,一个用于XML,XPath选择器有三个方法
select(xpath): 返回一个相对于当前选中节点的选择器列表(一个XPath可能选到多个节点)
extract(): 返回选择器(列表)对应的节点的字符串(列表)
re(regex): 返回正则表达式匹配的字符串(分组匹配)列表
一种很好的方法是在Shell里面对XPath进行测试:
1 | [python] view plaincopy scrapy shell http://www.<span style="color:black">dmoz</span>.<span style="color:black">org</span>/Computers/Programming/Languages/Python/Books/ |
12 | [python] view plaincopy <span style="color:rgb(255,119,0)"><strong>def</strong></span> parse<span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span>, response<span style="color:black">)</span>: hxs = HtmlXPathSelector<span style="color:black">(</span>response<span style="color:black">)</span> sites = hxs.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'//ul/li'</span><span style="color:black">)</span> items = <span style="color:black">[</span><span style="color:black">]</span> <span style="color:rgb(255,119,0)"><strong>for</strong></span> <span style="color:rgb(220,20,60)">site</span> <span style="color:rgb(255,119,0)"><strong>in</strong></span> sites: item = DmozItem<span style="color:black">(</span><span style="color:black">)</span> item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'title'</span><span style="color:black">]</span> = <span style="color:rgb(220,20,60)">site</span>.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'a/text()'</span><span style="color:black">)</span>.<span style="color:black">extract</span><span style="color:black">(</span><span style="color:black">)</span> item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'link'</span><span style="color:black">]</span> = <span style="color:rgb(220,20,60)">site</span>.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'a/@href'</span><span style="color:black">)</span>.<span style="color:black">extract</span><span style="color:black">(</span><span style="color:black">)</span> item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'desc'</span><span style="color:black">]</span> = <span style="color:rgb(220,20,60)">site</span>.<span style="color:rgb(220,20,60)">select</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'text()'</span><span style="color:black">)</span>.<span style="color:black">extract</span><span style="color:black">(</span><span style="color:black">)</span> items.<span style="color:black">append</span><span style="color:black">(</span>item<span style="color:black">)</span> <span style="color:rgb(255,119,0)"><strong>return</strong></span> items |
PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。
PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到一个文件中:
12 | [python] view plaincopy <span style="color:rgb(255,119,0)"><strong>def</strong></span> <span style="color:rgb(0,0,205)">__init__</span><span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span><span style="color:black">)</span>: <span style="color:rgb(0,128,0)">self</span>.<span style="color:rgb(0,128,0)">file</span> = <span style="color:rgb(0,128,0)">open</span><span style="color:black">(</span><span style="color:rgb(72,61,139)">'jingdong.txt'</span>, <span style="color:rgb(72,61,139)">'wb'</span><span style="color:black">)</span> <span style="color:rgb(255,119,0)"><strong>def</strong></span> process_item<span style="color:black">(</span><span style="color:rgb(0,128,0)">self</span>, item, spider<span style="color:black">)</span>: <span style="color:rgb(0,128,0)">self</span>.<span style="color:rgb(0,128,0)">file</span>.<span style="color:black">write</span><span style="color:black">(</span>item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'title'</span><span style="color:black">]</span> + <span style="color:rgb(72,61,139)">'<span style="color:rgb(0,0,153)"><strong>\t</strong></span>'</span>+ item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'link'</span><span style="color:black">]</span> + <span style="color:rgb(72,61,139)">'<span style="color:rgb(0,0,153)"><strong>\t</strong></span>'</span> + item<span style="color:black">[</span><span style="color:rgb(72,61,139)">'desc'</span><span style="color:black">]</span>+<span style="color:rgb(72,61,139)">'<span style="color:rgb(0,0,153)"><strong>\n</strong></span>'</span><span style="color:black">)</span> |
1 | [python] view plaincopy scrapy crawl dmoz.<span style="color:black">org</span> |
本文链接地址: http://www.icodelogic.com/?p=441
相关文章推荐
- Scrapy爬虫入门教程六 Items(项目)
- 爬取新浪微博(一)Scrapy入门教程
- Python抓取框架Scrapy入门教程
- Scrapy爬虫入门系列2 示例教程
- scrapy 入门教程 爬虫 Spider
- Scrapy爬虫入门教程四 Spider(爬虫)
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- scrapy爬虫框架教程(一)-- Scrapy入门
- scrapy爬虫框架入门教程
- scrapy 入门教程
- Scrapy入门教程
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- Scrapy入门教程
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- scrapy学习笔记——Python网络爬虫利器(入门教程)
- Scrapy入门教程
- Scrapy入门教程
- Scrapy入门教程
- Scrapy入门教程
- Scrapy入门教程