python爬虫框架scrapy案例分析
1.生成项目
scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码。
打开命令行,执行:scrapy startproject tutorial,生成的项目类似下面的结构
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
scrapy.cfg是项目的配置文件
用户自己写的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方法里,你可以从抓到的网页里面解析数据。上面的代码只是简单地把网页内容保存到文件。
2.开始抓取
你可以打开命令行,进入生成的项目根目录tutorial/,执行 scrapy crawl dmoz, dmoz是spider的name。
3.解析网页内容
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标签
我们可以把解析出来的数据保存在一个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会被放在项目的根目录
让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` fieldsyield Request(url=item_details_url, meta={'item': item},callback=self.parse_details)def parse_details(self, response):item = response.meta['item']# populate more `item` fieldsreturn 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.urltorrent['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):"""A pipeline for filtering out items which contain certain words in theirdescription"""# put all words in lowercasewords_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案例分析相关推荐
- python数据分析案例2-1:Python练习-Python爬虫框架Scrapy入门与实践
本文建立在学习完大壮老师视频Python最火爬虫框架Scrapy入门与实践,自己一步一步操作后做一个记录(建议跟我一样的新手都一步一步进行操作). 主要介绍: 1.scrapy框架简介.数据在框架内如 ...
- python常用命令汇总-Python爬虫框架Scrapy常用命令总结
本文实例讲述了Python爬虫框架Scrapy常用命令.分享给大家供大家参考,具体如下: 在Scrapy中,工具命令分为两种,一种为全局命令,一种为项目命令. 全局命令不需要依靠Scrapy项目就可以 ...
- 精通python爬虫框架-精通Python爬虫框架Scrapy.pdf
作 者 :(美)迪米特里奥斯·考奇斯·劳卡斯(Dimitrios Kouzis Loukas)著:李斌译 出版发行 : 北京:人民邮电出版社 , 2018.02 ISBN号 :978-7-115-47 ...
- 阅读《精通Python爬虫框架Scrapy》
精通Python爬虫框架Scrapy 精通Python爬虫框架Scrapy 2018年2月的书,居然代码用的是Python2 环境使用的是Vagrant,但是由于国内网络的问题,安装的太慢了. 书里内 ...
- Python爬虫框架scrapy的用途及组件认识
Python爬虫框架scrapy的用途及组件认识 今天简述一下Scrapy框架的大致处理流程,以方便大家更好的理解Scrapy的运行过程. Scrapy是一个快速.高层次屏幕抓取和web抓取pytho ...
- 用 Python 爬虫框架 Scrapy 爬取心目中的女神
From :http://www.cnblogs.com/wanghzh/p/5824181.html 本博文将带领你从入门到精通爬虫框架 Scrapy,最终具备爬取任何网页的数据的能力. 本文以校花 ...
- python爬虫框架Scrapy采集数据,并制作词云图分析!
scrapy介绍 Scrapy 是一套基于Twisted.纯python实现的异步爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,相当的方便- 整体架构和组 ...
- 数据采集与存储案例——基于Python爬虫框架Scrapy的爬取网络数据与MySQL数据持久化
此案例需要预先安装pymsql python3.7.4 scrapy2.7.1 一.安装scrapy框架 1.使用pip命令安装scrapy pip install scrapy 在这里下载太慢可以使 ...
- 精通python爬虫框架-精通Python爬虫框架Scrapy PDF 中文清晰版
给大家带来的一篇关于Python爬虫相关的电子书资源,介绍了关于Python.爬虫.框架.Scrapy方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小8.6 MB,迪米特里奥斯编写,目前 ...
- Python爬虫框架Scrapy豌豆荚应用市场爬虫
1. 页面分析 当我们在豌豆荚首页搜索框输入微信后,会跳转到搜索结果的页面,其url为http://www.wandoujia.com/search?key=%微信.搜索结果一般是按相关性排序的:所以 ...
最新文章
- CentOS下搭建Squid代理服务器
- 【揭秘】Slack:从0到10亿美元的产品是怎样炼成的
- HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo
- 分页查询时如何优化MySQL的性能?
- 双向链表VS单向链表
- 【HDU - 5878】I Count Two Three(打表)
- JavaScript变量高级定义之Object.defineProperty()方法讲解
- 均值滤波计算_从零学美颜算法保边滤波
- Java接口和Java抽象类(转,原文已被删除)
- 《女士品茶》与统计检验
- 软件性能测试操作系统,优秀的系统性能测试软件Sisoft Sandra
- 谷歌地图,计算两个坐标点之间的距离
- 第六章-网络可靠性设计
- Keystone认证服务详细操作流程
- 如何结束python程序_python程序结束
- IPv4地址、IPv6地址和Mac地址的位数
- 五一结婚,收集祝福。附我的结婚对联,结婚放大像。
- java如何获取storage_本地化存储Storage
- linux基础知识全面总结,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- scratch编程密室逃脱