生成项目scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码。

1.生成项目

scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码。

打开命令行,执行:scrapy startprojecttutorial,生成的项目类似下面的结构

tutorial/

scrapy.cfg

tutorial/

__init__.py

items.py

pipelines.py

settings.py

spiders/

__init__.py

...

scrapy.cfg是项目的配置文件

2. spiders目录

用户自己写的spider要放在spiders目录下面,一个spider类似:

from scrapy.spider import BaseSpider

class DmozSpider(BaseSpider):

name = "dmoz"

allowed_domains = ["dmoz.org"]

start_urls = [

"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",

"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"

]

def parse(self, response):

filename = response.url.split("/")[-2]

open(filename, 'wb').write(response.body)

name属性很重要,不同spider不能使用相同的name;

start_urls是spider抓取网页的起始点,可以包括多个url;

parse方法是spider抓到一个网页以后默认调用的callback,避免使用这个名字来定义自己的方法。

当spider拿到url的内容以后,会调用parse方法,并且传递一个response参数给它,response包含了抓到的网页的内容,在parse方法里,你可以从抓到的网页里面解析数据。上面的代码只是简单地把网页内容保存到文件。

3.开始抓取

你可以打开命令行,进入生成的项目根目录tutorial/,执行 scrapy crawl dmoz, dmoz是spider的name。

4.解析网页内容

scrapy提供了方便的办法从网页中解析数据,这需要使用到HtmlXPathSelector;

from scrapy.spider import BaseSpider

from scrapy.selector import HtmlXPathSelector

class DmozSpider(BaseSpider):

name = "dmoz"

allowed_domains = ["dmoz.org"]

start_urls = [

"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",

"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"

]

def parse(self, response):

hxs = HtmlXPathSelector(response)

sites = hxs.select('//ul/li')

for site in sites:

title = site.select('a/text()').extract()

link = site.select('a/@href').extract()

desc = site.select('text()').extract()

print title, link, desc

HtmlXPathSelector使用了Xpath来解析数据

//ul/li表示选择所有的ul标签下的li标签

a/@href表示选择所有a标签的href属性

a/text()表示选择a标签文本

a[@href="abc"]表示选择所有href属性是abc的a标签

5.保存对象

我们可以把解析出来的数据保存在一个scrapy可以使用的对象中,然后scrapy可以帮助我们把这些对象保存起来,而不用我们自己把这些数据存到文件中。我们需要在items.py中添加一些类,这些类用来描述我们要保存的数据

from scrapy.item import Item, Field

class DmozItem(Item):

title = Field()

link = Field()

desc = Field()

然后在spider的parse方法中,我们把解析出来的数据保存在DomzItem对象中。

from scrapy.spider import BaseSpider

from scrapy.selector import HtmlXPathSelector

from tutorial.items import DmozItem

class DmozSpider(BaseSpider):

name = "dmoz"

allowed_domains = ["dmoz.org"]

start_urls = [

"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",

"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"

]

def parse(self, response):

hxs = HtmlXPathSelector(response)

sites = hxs.select('//ul/li')

items = []

for site in sites:

item = DmozItem()

item['title'] = site.select('a/text()').extract()

item['link'] = site.select('a/@href').extract()

item['desc'] = site.select('text()').extract()

items.append(item)

return items

在命令行执行scrapy的时候,我们可以加两个参数,让scrapy把parse方法返回的items输出到json文件中

scrapy crawl dmoz -o items.json -t json

items.json会被放在项目的根目录

6.让scrapy自动抓取网页上的所有链接

上面的示例中scrapy只抓取了start_urls里面的两个url的内容,但是通常我们想实现的是scrapy自动发现一个网页上的所有链接,然后再去抓取这些链接的内容。为了实现这一点我们可以在parse方法里面提取我们需要的链接,然后构造一些Request对象,并且把他们返回,scrapy会自动的去抓取这些链接。代码类似:

class MySpider(BaseSpider):

name = 'myspider'

start_urls = (

'http://example.com/page1',

'http://example.com/page2',

)

def parse(self, response):

#collect `item_urls`

for item_url in item_urls:

yield Request(url=item_url,callback=self.parse_item)

def parse_item(self, response):

item = MyItem()

#populate `item` fields

yield Request(url=item_details_url, meta={'item':item},callback=self.parse_details)

def parse_details(self, response):

item = response.meta['item']

#populate more `item` fields

return item

parse是默认的callback, 它返回了一个Request列表,scrapy自动的根据这个列表抓取网页,每当抓到一个网页,就会调用parse_item,parse_item也会返回一个列表,scrapy又会根据这个列表去抓网页,并且抓到后调用parse_details

为了让这样的工作更容易,scrapy提供了另一个spider基类,利用它我们可以方便的实现自动抓取链接. 我们要用到CrawlSpider

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

class MininovaSpider(CrawlSpider):

name = 'mininova.org'

allowed_domains = ['mininova.org']

start_urls = ['http://www.mininova.org/today']

rules = [Rule(SgmlLinkExtractor(allow=['/tor/\d+'])),

Rule(SgmlLinkExtractor(allow=['/abc/\d+']), 'parse_torrent')]

def parse_torrent(self, response):

x = HtmlXPathSelector(response)

torrent = TorrentItem()

torrent['url'] = response.url

torrent['name'] = x.select("//h1/text()").extract()

torrent['description'] = x.select("//div[@id='description']").extract()

torrent['size'] = x.select("//div[@id='info-left']/p[2]/text()[2]").extract()

return torrent

相比BaseSpider,新的类多了一个rules属性,这个属性是一个列表,它可以包含多个Rule,每个Rule描述了哪些链接需要抓取,哪些不需要。这是Rule类的文档http://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.contrib.spiders.Rule

这些rule可以有callback,也可以没有,当没有callback的时候,scrapy简单的follow所有这些链接.

pipelines.py的使用

在pipelines.py中我们可以添加一些类来过滤掉我们不想要的item,把item保存到数据库

from scrapy.exceptions import DropItem

class FilterWordsPipeline(object):

"""Apipeline for filtering out items which contain certain words in their

description"""

# put all words inlowercase

words_to_filter = ['politics', 'religion']

def process_item(self, item, spider):

for word in self.words_to_filter:

if word in unicode(item['description']).lower():

raise DropItem("Contains forbidden word:%s" % word)

else:

return item

如果item不符合要求,那么就抛一个异常,这个item不会被输出到json文件中。

要使用pipelines,我们还需要修改settings.py

添加一行

ITEM_PIPELINES =['dirbot.pipelines.FilterWordsPipeline']

现在执行scrapy crawl dmoz -o items.json -t json,不符合要求的item就被过滤掉了。

python爬虫框架scrapy操作步骤相关推荐

  1. python数据分析案例2-1:Python练习-Python爬虫框架Scrapy入门与实践

    本文建立在学习完大壮老师视频Python最火爬虫框架Scrapy入门与实践,自己一步一步操作后做一个记录(建议跟我一样的新手都一步一步进行操作). 主要介绍: 1.scrapy框架简介.数据在框架内如 ...

  2. python常用命令汇总-Python爬虫框架Scrapy常用命令总结

    本文实例讲述了Python爬虫框架Scrapy常用命令.分享给大家供大家参考,具体如下: 在Scrapy中,工具命令分为两种,一种为全局命令,一种为项目命令. 全局命令不需要依靠Scrapy项目就可以 ...

  3. Python爬虫框架scrapy的用途及组件认识

    Python爬虫框架scrapy的用途及组件认识 今天简述一下Scrapy框架的大致处理流程,以方便大家更好的理解Scrapy的运行过程. Scrapy是一个快速.高层次屏幕抓取和web抓取pytho ...

  4. 精通python爬虫框架-精通Python爬虫框架Scrapy.pdf

    作 者 :(美)迪米特里奥斯·考奇斯·劳卡斯(Dimitrios Kouzis Loukas)著:李斌译 出版发行 : 北京:人民邮电出版社 , 2018.02 ISBN号 :978-7-115-47 ...

  5. 阅读《精通Python爬虫框架Scrapy》

    精通Python爬虫框架Scrapy 精通Python爬虫框架Scrapy 2018年2月的书,居然代码用的是Python2 环境使用的是Vagrant,但是由于国内网络的问题,安装的太慢了. 书里内 ...

  6. 用 Python 爬虫框架 Scrapy 爬取心目中的女神

    From :http://www.cnblogs.com/wanghzh/p/5824181.html 本博文将带领你从入门到精通爬虫框架 Scrapy,最终具备爬取任何网页的数据的能力. 本文以校花 ...

  7. Python爬虫框架Scrapy安装使用步骤

    一.爬虫框架Scarpy简介 Scrapy 是一个快速的高层次的屏幕抓取和网页爬虫框架,爬取网站,从网站页面得到结构化的数据,它有着广泛的用途,从数据挖掘到监测和自动测试,Scrapy完全用Pytho ...

  8. python爬虫框架——scrapy(1)scrapy爬虫框架介绍

    导语:(python语言中存在众多的爬虫框架,本文及接下来的几篇都只介绍scrapy框架) 一:整理scrapy爬虫框架组件的各种知识,了解爬虫机制的原理 1.scrapy架构: 各个组件: 引擎(E ...

  9. [转] Python --- 爬虫框架Scrapy at a glance

    Scrapy at a glance Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了页面抓取 (更 ...

最新文章

  1. MongoDB的各个版本下载地址汇总
  2. 本地配yum(没有网络)
  3. markdownpad2 html渲染组件出错_「万字长文」一文吃透React SSR服务端同构渲染
  4. python如何关闭窗口仍能运行_Python在退出时关闭自己的CMD shell窗口
  5. 面向对象基础-委托与事件
  6. 117_PowerQuery使用ODBC访问带密码的Access
  7. 使用MySQLWorkBench绘制ER图详解
  8. ELF文件详解—初步认识
  9. aria2 配置教程
  10. Codeforces Round #490 (Div. 3) C. Alphabetic Removals
  11. pdfpcell输出换行_fpdf 的cell 中文自动换行问题
  12. 修改 exchange服务器地址,绑定exchange邮箱服务器地址
  13. spring学期总结
  14. 同花顺炒股指标定制-K线只有红绿2个颜色怎么行?
  15. [luogu P4230]连环病原体
  16. 网络数据帧中的(Jumbo Frame)巨帧、超长帧
  17. (3)音频在计算机里是怎样存储的,什么是音频?
  18. 一个小巧的WINDOWS垃圾清理工具
  19. 管理信息系统【四】之 管理信息系统战略规划与开发方法
  20. 一年推出四款社交产品,百度社交难在哪?

热门文章

  1. python读取csv文件坐标地图描点_python3 通过百度地图API获取城市POI点并存于CSV格式...
  2. 教育|仝卓高考舞弊案细节曝光:为“恢复高考成绩”已起诉1年多
  3. X大佬:建议被降级降薪员工主动辞职,网友炸了
  4. MongoDB安装及结合mongobooster可视化工具使用
  5. 巨人网络:已组建研发团队对元宇宙游戏开展自研探索
  6. 疑似一加Ace现身GeekBench:搭载天玑8100+12GB内存
  7. 荷兰苹果店发生人质劫持事件:持枪者已被制服
  8. 小鹏汽车高管个人年薪超4亿?网友:超过我对金钱的认知了
  9. 三七互娱李逸飞:未来将关注元宇宙等新业态 创新构建核心优势
  10. 被400万人痛骂!在中国火了22年的“洋网红”,套路彻底失灵了?