python scrapy简介
scrapy基础
scrapy是用python写的一个库,使用它可以方便的抓取网页。
主页地址http://scrapy.org/
文档 http://doc.scrapy.org/en/latest/index.html
安装 sudo pip install scrapy
一个简单的教程 http://doc.scrapy.org/en/latest/intro/tutorial.html
如果你对这些概念有了解,使用上面的教程会比较容易. 它们是json, xpath, 正则表达式,
生成项目
scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码。
打开命令行,执行:scrapy startproject tutorial,生成的项目类似下面的结构
tutorial/scrapy.cfgtutorial/__init__.pyitems.pypipelines.pysettings.pyspiders/__init__.py...
scrapy.cfg是项目的配置文件
用户自己写的spider要放在spiders目录下面,一个spider类似
from scrapy.spider import BaseSpiderclass 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方法里,你可以从抓到的网页里面解析数据。上面的代码只是简单地把网页内容保存到文件。
开始抓取
你可以打开命令行,进入生成的项目根目录tutorial/,执行 scrapy crawl dmoz, dmoz是spider的name。
解析网页内容
scrapy提供了方便的办法从网页中解析数据,这需要使用到HtmlXPathSelector
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelectorclass 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, Fieldclass DmozItem(Item):title = Field()link = Field()desc = Field()
然后在spider的parse方法中,我们把解析出来的数据保存在DomzItem对象中。
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelectorfrom tutorial.items import DmozItemclass 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 SgmlLinkExtractorclass 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 DropItemclass 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爬虫——Scrapy 简介和安装
文章目录 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 2.Scrapy 下载安装 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 Scrapy 简介 S ...
- python中scrapy框架_简述python Scrapy框架
一.Scrapy框架简介 Scrapy是用纯Python实现一个为了爬取网站数据,提取结构性数据而编写的应用框架,用途非常广泛.利用框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网 ...
- Crawler之Scrapy:Scrapy简介、安装、使用方法之详细攻略
Crawler之Scrapy:Scrapy简介.安装.使用方法之详细攻略 目录 scrapy简介 Scrapy进行安装 Scrapy使用方法 scrapy简介 Scrapy是Python开发的一个快速 ...
- 如何用 Python + Scrapy 爬取视频?
今天将带大家简单了解Scrapy爬虫框架,并用一个真实案例来演示代码的编写和爬取过程. 一.scrapy简介 1. 什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框 ...
- python scrapy框架爬虫_Scrapy爬虫框架教程(一)-- Scrapy入门
前言 转行做python程序员已经有三个月了,这三个月用Scrapy爬虫框架写了将近两百个爬虫,不能说精通了Scrapy,但是已经对Scrapy有了一定的熟悉.准备写一个系列的Scrapy爬虫教程,一 ...
- pythonscrapy框架_简述python Scrapy框架
一.Scrapy框架简介 Scrapy是用纯Python实现一个为了爬取网站数据,提取结构性数据而编写的应用框架,用途非常广泛.利用框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网 ...
- scrapy简介-scrapy框架1-python
scrapy官方文档地址:https://docs.scrapy.org/en/latest/ 1.scrapy简介 Scrapy是适用于Python的一个快速.高层次的屏幕抓取和web抓取框架,用于 ...
- Python Scrapy爬虫框架实战应用
通过上一节<Python Scrapy爬虫框架详解>的学习,您已经对 Scrapy 框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程.本节将通过一个的简单爬虫项目对 Scr ...
- Python Scrapy 安装及相关配置
本文仅供学习交流使用,如侵立删!demo下载见文末 Python Scrapy 安装及相关配置 环境 win10 Python:3.6.7 Scrapy:2.4.1 Python 安装
最新文章
- ios开发国外视频教程(有翻译)
- pandas 季度_当缺少季度时,如何确定pandas数据帧的季度行值的差异
- [codevs 2236] 终极情报网
- 推荐 12 个提升程序员软技能与效率的必备工具,爱了爱了!
- neo4jd3的使用流程(转载)
- 人工智能(3)---未来已来,如何成为一名人工智能产品经理
- 《季羡林先生》读书笔记-3
- ubuntu下/etc/rc.local和/etc/init.d/rc.local的区别
- STL MAP用法详解
- Table 点击单元格编辑并获取对应的行列
- 计算机445端口怎么打开,445端口,详细教您445端口怎么关闭
- 用python实现千图成像工具,快给你的男/女神做一个吧~
- 影视解说短视频制作教程,从找素材到配音,上手很简单
- acer switch 10 linux,【AcerSwitch10E评测】拆开来用的电脑 Acer Switch 10E评测(全文)_Acer Switch 10E_笔记本评测-中关村在线...
- Battleship
- EXTJS记事本:当CompositeField遇上RowEditor
- 网站文章被采集?尝试使用这几种方法进行最大防护
- 饮食控制和维生素干预下肠道菌群的变化
- 和平精英服务器维护到几点,和平精英停服到几点钟?4月4日停服时间公告[多图]...
- 如何解决The emulator process for AVD was killed.
热门文章
- What is a project?
- java开发遵循的原则_Windows开发人员应遵循Java社区稳定的基础结构和开发环境,而不必大肆宣传
- 微信小程序长列表 数据渲染的些许优化
- (Modern Family S01E01) Part 6 MitchCam Mitch未告诉家人领养孩子焦虑不安
- 【机器学习】用特征量重要度(feature importance)解释模型靠谱么?怎么才能算出更靠谱的重要度?
- ROS 北通游戏手柄灵敏度 频率过高, xbox360/ ps2/3模式切换问题
- 2023年,我依然选择辞职
- 信管1172-201711671226-WWY —JSP智能手机销售网后台设计
- DiskGenius无损换分区表类型为GUID格式或MBR格式
- 企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提 成7.5%;20万到40万之间时,