Python学习笔记之Scrapy框架入门
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记之Scrapy框架入门相关的知识,希望对你有一定的参考价值。
创建一个新的Scrapy项目
定义提取的Item
写一个Spider用来爬行站点,并提取Items
写一个Item Pipeline用来存储提取出的Items
新建工程
在抓取之前,你需要新建一个Scrapy工程。进入一个你想用来保存代码的目录,然后执行:scrapy startproject tutorial
这个命令会在当前目录下创建一个新目录tutorial,它的结构如下:
- T:.
- │ scrapy.cfg
- │
- └─tutorial
- │ items.py
- │ pipelines.py
- │ settings.py
- │ __init__.py
- │
- └─spiders
- __init__.py
这些文件主要是:
scrapy.cfg: 项目配置文件
tutorial/: 项目python模块, 呆会代码将从这里导入
tutorial/items.py: 项目items文件
tutorial/pipelines.py: 项目管道文件
tutorial/settings.py: 项目配置文件
tutorial/spiders: 放置spider的目录
定义Item
Items是将要装载抓取的数据的容器,它工作方式像python里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。
它通过创建一个scrapy.item.Item类来声明,定义它的属性为scrpiy.item.Field对象,就像是一个对象关系映射(ORM).
我们通过将需要的item模型化,来控制从dmoz.org获得的站点数据,比如我们要获得站点的名字,url和网站描述,我们定义这三种属性的域。要做到这点,我们编辑在tutorial目录下的items.py文件,我们的Item类将会是这样
- from scrapy.item import Item, Field
- class DmozItem(Item):
- title = Field()
- link = Field()
- desc = Field()
刚开始看起来可能会有些困惑,但是定义这些item能让你用其他Scrapy组件的时候知道你的 items到底是什么。
第一个爬虫(Spider)
Spider是用户编写的类,用于从一个域(或域组)中抓取信息。
他们定义了用于下载的URL的初步列表,如何跟踪链接,以及如何来解析这些网页的内容用于提取items。
要建立一个Spider,你必须为scrapy.spider.BaseSpider创建一个子类,并确定三个主要的、强制的属性:
name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字.
start_urls:爬虫开始爬的一个URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些URLS开始。其他子URL将会从这些起始URL中继承性生成。
parse():爬虫的方法,调用时候传入从每一个URL传回的Response对象作为参数,response将会是parse方法的唯一的一个参数,
这个方法负责解析返回的数据、匹配抓取的数据(解析为item)并跟踪更多的URL。
下面是我们第一个爬虫代码,创建 ./tutorial/spiders/dmoz_spider.py
import scrapy
from scrapy.spiders import Spider
from scrapy.selector import Selector
from tutorial.items import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://club.jd.com/review/1601991-1-1-0.html/",
"http://club.jd.com/review/1601991-1-2-0.html"
]
def parse(self, response):
sel = Selector(response)
sites = sel.xpath(‘//ul/li‘)
items = []
for i in range(0, 1 + 1):
divs = response.xpath(‘//div[@id="‘ + str(i) + ‘"]‘)
for zz in divs.xpath(‘.//dl‘):
item = DmozItem()
item[‘prodid‘] = ‘1601991‘
item[‘userid‘] = ‘userid‘
item[‘type‘] = zz.xpath(‘.//dt/text()‘).extract_first().replace("\r\n", ‘‘)
item[‘desc‘] = zz.xpath(‘.//dd/text()‘).extract_first().replace("\r\n", ‘‘)
items.append(item)
return items
为了让我们的爬虫工作,我们返回项目主目录执行以下命令
.\tutorial>scrapy crawl dmoz
crawl dmoz 命令从dmoz.org域启动爬虫。
注意包含 [dmoz]的行 ,那对应着我们的爬虫。你可以看到start_urls中定义的每个URL都有日志行。因为这些URL是起始页面,所以他们没有引用(referrers),所以在每行的末尾你会看到 (referer: <None>).
在我们的 parse 方法的作用下,两个文件被创建:分别是 Books 和 Resources,这两个文件中有URL的页面内容。
发生了什么事情?
Scrapy为爬虫的 start_urls属性中的每个URL创建了一个 scrapy.http.Request 对象 ,并将爬虫的parse 方法指定为回调函数。
这些 Request首先被调度,然后被执行,之后通过parse()方法,scrapy.http.Response 对象被返回,结果也被反馈给爬虫。
要开始shell,首先进入项目顶层目录,然后输入
T:\tutorial>scrapy shell http://club.jd.com/review/1601991-1-1-0.html
保存抓取的数据
保存信息的最简单的方法是通过Feed exports,命令如下:
T:\tutorial>scrapy crawl dmoz -o items.json -t json
所有抓取的items将以JSON格式被保存在新生成的items.json 文件中
在像本教程一样的小型项目中,这些已经足够。然而,如果你想用抓取的items做更复杂的事情,你可以写一个 Item Pipeline(条目管道)。因为在项目创建的时候,一个专门用于条目管道的占位符文件已经随着items一起被建立,目录在tutorial/pipelines.py。如果你只需要存取这些抓取后的items的话,就不需要去实现任何的条目管道。
结束语
本教程简要介绍了Scrapy的使用,但是许多其他特性并没有提及。
深入了解,请访问 初窥Scrapy — Scrapy 0.24.1 文档 http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html#intro-overview-item
部分参考于
Python抓取框架Scrapy入门教程 http://developer.51cto.com/art/201207/348012.htm
使用Python Scrapy抓取京东商城上商品评论 https://ask.hellobi.com/blog/seng/3216
以上是关于Python学习笔记之Scrapy框架入门的主要内容,如果未能解决你的问题,请参考以下文章