scrapy 中文文档field()能否匹配中文

您的位置: >
> 阅读资讯:Python爬虫框架Scrapy的实战(抓取招聘信息)
Python爬虫框架Scrapy的实战(抓取招聘信息)
Python爬虫框架Scrapy的实战(抓取招聘信息)
网络爬虫抓取特定网站网页的html数据,但是一个网站有上千上万条数据,我们不可能知道网站网页的url地址,所以,要有个技巧去抓取网站的所有html页面。Scrapy是纯Python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便~
Scrapy 使用wisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。整体架构如下图所示:
绿线是数据流向,首先从初始URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的&下一页&的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。
我假定你已经安装了Scrapy。假如你没有安装,你可以参考这篇文章。
在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容
1. 创建一个新的Scrapy Project
2. 定义你需要从网页中提取的元素Item
3.实现一个Spider类,通过接口完成爬取URL和提取Item的功能
4. 实现一个Item PipeLine类,完成Item的存储功能
我将会用腾讯招聘官网作为例子。
Github源码:/maxliaops/scrapy-itzhaopin
目标:抓取腾讯招聘官网职位招聘信息并保存为JSON格式。
首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:
复制代码 代码如下:
scrapy startprojectitzhaopin
最后的itzhaopin就是项目名称。这个命令会在当前目录下创建一个新目录itzhaopin,结构如下:
├── itzhaopin
│ ├── itzhaopin
│ │ ├── __init__.py
│ │ ├── items.py
│ │ ├── pipelines.py
│ │ ├── settings.py
│ │ └── spiders
│ │ └── __init__.py
│ └── scrapy.cfg
scrapy.cfg: 项目配置文件
items.py: 需要提取的数据结构定义文件
pipelines.py:管道定义,用来对items里面提取的数据做进一步处理,如保存等
settings.py: 爬虫配置文件
spiders: 放置spider的目录
在items.py里面定义我们要抓取的数据:
from scrapy.item import Item, Field
class TencentItem(Item):
name = Field()
# 职位名称
catalog = Field()
# 职位类别
workLocation = Field()
# 工作地点
recruitNumber = Field()
# 招聘人数
detailLink = Field()
# 职位详情页链接
publishTime = Field()
# 发布时间
实现Spider
Spider是一个继承自scrapy.contrib.spiders.CrawlSpider的Python类,有三个必需的定义的成员
name: 名字,这个spider的标识
start_urls:一个url列表,spider从这些网页开始抓取
parse():一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表
所以在spiders目录下新建一个spider,tencent_spider.py:
import json
from scrapy.selector import Selector
from scrapy.spider import Spider
from scrapy.spider import BaseSpider as Spider
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle
from itzhaopin.items import *
from itzhaopin.misc.log import *
class TencentSpider(CrawlSpider):
name = &tencent&
allowed_domains = [&&]
start_urls = [
&/position.php&
rules = [ # 定义爬取URL的规则
Rule(sle(allow=(&/position.php\?&start=\d{,4}#a&)), follow=True, callback='parse_item')
def parse_item(self, response): # 提取数据到Items里面,主要用到XPath和CSS选择器提取网页数据
items = []
sel = Selector(response)
base_url = get_base_url(response)
sites_even = sel.css('table.tablelist tr.even')
for site in sites_even:
item = TencentItem()
item['name'] = site.css('.l.square a').xpath('text()').extract()
relative_url = site.css('.l.square a').xpath('@href').extract()[0]
item['detailLink'] = urljoin_rfc(base_url, relative_url)
item['catalog'] = site.css('tr & td:nth-child(2)::text').extract()
item['workLocation'] = site.css('tr & td:nth-child(4)::text').extract()
item['recruitNumber'] = site.css('tr & td:nth-child(3)::text').extract()
item['publishTime'] = site.css('tr & td:nth-child(5)::text').extract()
items.append(item)
#print repr(item).decode(&unicode-escape&) + '\n'
sites_odd = sel.css('table.tablelist tr.odd')
for site in sites_odd:
item = TencentItem()
item['name'] = site.css('.l.square a').xpath('text()').extract()
relative_url = site.css('.l.square a').xpath('@href').extract()[0]
item['detailLink'] = urljoin_rfc(base_url, relative_url)
item['catalog'] = site.css('tr & td:nth-child(2)::text').extract()
item['workLocation'] = site.css('tr & td:nth-child(4)::text').extract()
item['recruitNumber'] = site.css('tr & td:nth-child(3)::text').extract()
item['publishTime'] = site.css('tr & td:nth-child(5)::text').extract()
items.append(item)
#print repr(item).decode(&unicode-escape&) + '\n'
info('parsed ' + str(response))
return items
def _process_request(self, request):
info('process ' + str(request))
return request
实现PipeLine
PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。
PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到JSON格式文件中:
pipelines.py
from scrapy import signals
import json
import codecs
class JsonWithEncodingTencentPipeline(object):
def __init__(self):
self.file = codecs.open('tencent.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + &\n&
self.file.write(line)
return item
def spider_closed(self, spider):
self.file.close(
到现在,我们就完成了一个基本的爬虫的实现,可以输入下面的命令来启动这个Spider
scrapy crawl tencent
爬虫运行结束后,在当前目录下将会生成一个名为tencent.json的文件,其中以JSON格式保存了职位招聘信息。
部分内容如下:
{&recruitNumber&: [&1&], &name&: [&SD5-资深手游策划(深圳)&], &detailLink&: &/position_detail.php?id=15626&keywords=&tid=0&lid=0&, &publishTime&:
[&&], &catalog&: [&产品/项目类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&1&], &name&: [&TEG13-后台开发工程师(深圳)&], &detailLink&: &/position_detail.php?id=15666&keywords=&tid=0&lid=0&,
&publishTime&: [&&], &catalog&: [&技术类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&2&], &name&: [&TEG12-数据中心高级经理(深圳)&], &detailLink&: &/position_detail.php?id=15698&keywords=&tid=0&lid=0&,
&publishTime&: [&&], &catalog&: [&技术类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&1&], &name&: [&GY1-微信支付品牌策划经理(深圳)&], &detailLink&: &/position_detail.php?id=15710&keywords=&tid=0&lid=0&,
&publishTime&: [&&], &catalog&: [&市场类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&2&], &name&: [&SNG06-后台开发工程师(深圳)&], &detailLink&: &/position_detail.php?id=15499&keywords=&tid=0&lid=0&,
&publishTime&: [&&], &catalog&: [&技术类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&2&], &name&: [&OMG01-腾讯时尚视频策划编辑(北京)&], &detailLink&: &/position_detail.php?id=15694&keywords=&tid=0&lid=0&,
&publishTime&: [&&], &catalog&: [&内容编辑类&], &workLocation&: [&北京&]}
{&recruitNumber&: [&1&], &name&: [&HY08-QT客户端Windows开发工程师(深圳)&], &detailLink&: &/position_detail.php?id=11378&keywords=&tid=0&lid=0&,
&publishTime&: [&&], &catalog&: [&技术类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&5&], &name&: [&HY1-移动游戏测试经理(上海)&], &detailLink&: &/position_detail.php?id=15607&keywords=&tid=0&lid=0&, &publishTime&: [&&], &catalog&: [&技术类&], &workLocation&: [&上海&]}
{&recruitNumber&: [&1&], &name&: [&HY6-网吧平台高级产品经理(深圳)&], &detailLink&: &/position_detail.php?id=10974&keywords=&tid=0&lid=0&, &publishTime&: [&&], &catalog&: [&产品/项目类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&4&], &name&: [&TEG14-云存储研发工程师(深圳)&], &detailLink&: &/position_detail.php?id=15168&keywords=&tid=0&lid=0&, &publishTime&: [&&], &catalog&: [&技术类&], &workLocation&: [&深圳&]}
{&recruitNumber&: [&1&], &name&: [&CB-薪酬经理(深圳)&], &detailLink&: &/position_detail.php?id=2309&keywords=&tid=0&lid=0&, &publishTime&: [&&], &catalog&: [&职能类&], &workLocation&: [&深圳&]}
以上全部内容就是通过Python爬虫框架Scrapy实战之批量抓取招聘信息的全部内容,希望对大家有所帮助,欲了解更多编程知识,请锁定我们的网站,每天都有新的内容发布。
本文地址:
相关文章列表scrapy&笔记2
& &1.1 声明Items
& &Item使用简单的class定义语法以及&&对象来声明。例如:
import scrapy
class Product(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
stock = scrapy.Field()
last_updated = scrapy.Field(serializer=str)
1.2 创建item
&&& product = Product(name='Desktop PC', price=1000)
&&& print product
Product(name='Desktop PC', price=1000)
&1.3 获取字段的值
&&& product['name']
Desktop PC
&&& product.get('name')
Desktop PC
&&& product['price']
&&& product['last_updated']
Traceback (most recent call last):
KeyError: 'last_updated'
&&& product.get('last_updated', 'not set')
&&& product['lala'] # getting unknown field
Traceback (most recent call last):
KeyError: 'lala'
&&& product.get('lala', 'unknown field')
'unknown field'
&&& 'name' in product
# is name field populated?
&&& 'last_updated' in product
# is last_updated populated?
&&& 'last_updated' in product.fields
# is last_updated a declared field?
&&& 'lala' in product.fields
# is lala a declared field?
& 1.4 设置字段的值
&&& product['last_updated'] = 'today'
&&& product['last_updated']
&&& product['lala'] = 'test' # setting unknown field
Traceback (most recent call last):
KeyError: 'Product does not support field: lala'
获取所有获取到的值
您可以使用&&来获取所有的值:
&&& product.keys()
['price', 'name']
&&& product.items()
[('price', 1000), ('name', 'Desktop PC')]
&&& product2 = Product(product)
&&& print product2
Product(name='Desktop PC', price=1000)
&&& product3 = product2.copy()
&&& print product3
Product(name='Desktop PC', price=1000)
根据item创建字典(dict):
&&& dict(product) # create a dict from all populated values
{'price': 1000, 'name': 'Desktop PC'}
根据字典(dict)创建item:
&&& Product({'name': 'Laptop PC', 'price': 1500})
Product(price=1500, name='Laptop PC')
&&& Product({'name': 'Laptop PC', 'lala': 1500}) # warning: unknown field in dict
Traceback (most recent call last):
KeyError: 'Product does not support field: lala'
您可以通过继承原始的Item来扩展item(添加更多的字段或者修改某些字段的元数据)。
class DiscountedProduct(Product):
discount_percent = scrapy.Field(serializer=str)
discount_expiration_date = scrapy.Field()
&&Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。
换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。
对spider来说,爬取的循环类似下文:
以初始的URL初始化Request,并设置回调函数。
当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。
spider中初始的request是通过调用&&来获取的。&&读取&中的URL,
并以&&为回调函数生成&&。
在回调函数内分析返回的(网页)内容,返回&&对象或者&&或者一个包括二者的可迭代容器。
返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。
在回调函数内,您可以使用&&(您也可以使用BeautifulSoup,
lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。
最后,由spider返回的item将被存到数据库(由某些&&处理)或使用&&存入到文件中。
2.2 Spiders函数解释
classscrapy.spider.Spider
Spider是最简单的spider。每个其他的spider必须继承自该类(包括Scrapy自带的其他spider以及您自己编写的spider)。
Spider并没有提供什么特殊的功能。 其仅仅请求给定的start_urls/start_requests&,并根据返回的结果(resulting
responses)调用spider的&parse&方法。
定义spider名字的字符串(string)。spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的。
不过您可以生成多个相同的spider实例(instance),这没有任何限制。
name是spider最重要的属性,而且是必须的。
如果该spider爬取单个网站(single domain),一个常见的做法是以该网站(domain)(加或不加&)来命名spider。
例如,如果spider爬取&&,该spider通常会被命名为mywebsite&。
allowed_domains
可选。包含了spider允许爬取的域名(domain)列表(list)。 当&&启用时,
域名不在列表中的URL不会被跟进。
start_urls
URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。 因此,第一个被获取到的页面的URL将是该列表之一。
后续的URL将会从获取到的数据中提取。
start_requests()
该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。
当spider启动爬取并且未制定URL时,该方法被调用。 当指定了URL时,&将被调用来创建Request对象。
该方法仅仅会被Scrapy调用一次,因此您可以将其实现为生成器。
该方法的默认实现是使用&&的url生成Request。
如果您想要修改最初爬取某个网站的Request对象,您可以重写(override)该方法。
例如,如果您需要在启动时以POST登录某个网站,你可以这么写:
def start_requests(self):
return [scrapy.FormRequest("/login",
formdata={'user': 'john', 'pass': 'secret'},
callback=self.logged_in)]
def logged_in(self, response):
# here you would extract links to follow and return Requests for
# each of them, with another callback
make_requests_from_url(url)
该方法接受一个URL并返回用于爬取的&&对象。
该方法在初始化request时被&调用,也被用于转化url为request。
默认未被复写(overridden)的情况下,该方法返回的Request对象中,&&作为回调函数,dont_filter参数也被设置为开启。
(详情参见&).
parse(response)
当response没有指定回调函数时,该方法是Scrapy处理下载的response的默认方法。
parse&负责处理response并返回处理的数据以及(/或)跟进的URL。&&对其他的Request的回调函数也有相同的要求。
该方法及其他的Request回调函数必须返回一个包含&&及(或)&&的可迭代的对象。
response&()
& 用于分析的response
log(message[,&level,&component])
使用&&方法记录(log)message。
log中自动带上该spider的&&属性。
更多数据请参见&&。
closed(reason)
当spider关闭时,该函数被调用。 该方法提供了一个替代调用signals.connect()来监听&信号的快捷方式。
2.4&CrawlSpider
classscrapy.contrib.spiders.CrawlSpider
爬取一般网站常用的spider。其定义了一些规则(rule)来提供跟进link的方便的机制。
也许该spider并不是完全适合您的特定网站或项目,但其对很多情况都使用。
因此您可以以其为起点,根据需求修改部分方法。当然您也可以实现自己的spider。
除了从Spider继承过来的(您必须提供的)属性外,其提供了一个新的属性:
一个包含一个(或多个)&&对象的集合(list)。
每个&&对爬取网站的动作定义了特定表现。
Rule对象在下边会介绍。 如果多个rule匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。
该spider也提供了一个可复写(overrideable)的方法:
parse_start_url(response)
当start_url的请求返回时,该方法被调用。
该方法分析最初的返回值并必须返回一个&对象或者
一个&&对象或者
一个可迭代的包含二者对象。
XMLFeedSpider
classscrapy.contrib.spiders.XMLFeedSpider
XMLFeedSpider被设计用于通过迭代各个节点来分析XML源(XML feed)。 迭代器可以从iternodes&,&xml&,&html&选择。
鉴于&xml&以及&html&迭代器需要先读取所有DOM再分析而引起的性能问题,
一般还是推荐使用&iternodes&。
不过使用&html&作为迭代器能有效应对错误的XML。
CSVFeedSpider
classscrapy.contrib.spiders.CSVFeedSpider
该spider除了其按行遍历而不是节点之外其他和XMLFeedSpider十分类似。
而其在每次迭代时调用的是&&。
2.6 &SitemapSpider
classscrapy.contrib.spiders.SitemapSpider
SitemapSpider使您爬取网站时可以通过&&来发现爬取的URL。
3 Selector
选择器API的完全参考详见&
31. 构造选择器(selectors)
Scrapy selector是以&文字(text)&或&&构造的&&实例。
其根据输入的类型自动选择最优的分析方法(XML vs HTML):
&&& from scrapy.selector import Selector
&&& from scrapy.http import HtmlResponse
以文字构造:
&&& body = '
Selector(text=body).xpath('//span/text()').extract()
以response构造:
&&& response = HtmlResponse(url='', body=body)
&&& Selector(response=response).xpath('//span/text()').extract()
3.2 使用选择器
我们将使用&Scrapy
shell&(提供交互测试)和位于Scrapy文档服务器的一个样例页面,来解释如何使用选择器:
这里是它的HTML源码:
Example website
'image1.html'Name:
My image 1 'image1_thumb.jpg'
'image2.html'Name:
My image 2 'image2_thumb.jpg'
'image3.html'Name:
My image 3 'image3_thumb.jpg'
'image4.html'Name:
My image 4 'image4_thumb.jpg'
'image5.html'Name:
My image 5 'image5_thumb.jpg'
首先, 我们打开shell:
scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html
接着,当shell载入后,您将获得名为&response&的shell变量,其为响应的response,
并且在其response.selector&属性上绑定了一个selector。
因为我们处理的是HTML,选择器将自动使用HTML语法分析。
那么,通过查看&&该页面的源码,我们构建一个XPath来选择title标签内的文字:
&&& response.selector.xpath('//title/text()')
由于在response中使用XPath、CSS查询十分普遍,因此,Scrapy提供了两个实用的快捷方式:response.xpath()&及&response.css():
&&& response.xpath('//title/text()')
&&& response.css('title::text')
如你所见,&.xpath()&及&.css()&方法返回一个类&&的实例,
它是一个新选择器的列表。这个API可以用来快速的提取嵌套数据。
为了提取真实的原文数据,你需要调用&.extract()&方法如下:
&&& response.xpath('//title/text()').extract()
[u'Example website']
注意CSS选择器可以使用CSS3伪元素(pseudo-elements)来选择文字或者属性节点:
&&& response.css('title::text').extract()
[u'Example website']
现在我们将得到根URL(base URL)和一些图片链接:
&&& response.xpath('//base/@href').extract()
&&& response.css('base::attr(href)').extract()
&&& response.xpath('//a[contains(@href, "image")]/@href').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']
&&& response.css('a[href*=image]::attr(href)').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']
&&& response.xpath('//a[contains(@href, "image")]/img/@src').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']
&&& response.css('a[href*=image] img::attr(src)').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']
嵌套选择器(selectors)
选择器方法(&.xpath()&or&.css()&)返回相同类型的选择器列表,因此你也可以对这些选择器调用选择器方法。下面是一个例子:
&&& links = response.xpath('//a[contains(@href, "image")]')
&&& links.extract()
&&& for index, link in enumerate(links):
args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract())
print 'Link number %d points to url %s and image %s' % args
Link number 0 points to url [u'image1.html'] and image [u'image1_thumb.jpg']
Link number 1 points to url [u'image2.html'] and image [u'image2_thumb.jpg']
Link number 2 points to url [u'image3.html'] and image [u'image3_thumb.jpg']
Link number 3 points to url [u'image4.html'] and image [u'image4_thumb.jpg']
Link number 4 points to url [u'image5.html'] and image [u'image5_thumb.jpg']
结合正则表达式使用选择器(selectors)
&也有一个&.re()&方法,用来通过正则表达式来提取数据。然而,不同于使用&.xpath()或者&.css()&方法,&.re()&方法返回unicode字符串的列表。所以你无法构造嵌套式的&.re()&调用。
下面是一个例子,从上面的&&中提取图像名字:
&&& response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
[u'My image 1',
u'My image 2',
u'My image 3',
u'My image 4',
u'My image 5'
4 移除命名空间。
在处理爬虫项目时,完全去掉命名空间而仅仅处理元素名字,写更多简单/实用的XPath会方便很多。你可以为此使用&&方法。
让我们来看一个例子,以Github博客的atom订阅来解释这个情况。
首先,我们使用想爬取的url来打开shell:
$ scrapy shell /blog.atom
一旦进入shell,我们可以尝试选择所有的&&对象,可以看到没有结果(因为Atom
XML命名空间混淆了这些节点):
&&& response.xpath("//link")
但一旦我们调用&&方法,所有的节点都可以直接通过他们的名字来访问:
&&& response.selector.remove_namespaces()
&&& response.xpath("//link")
如果你对为什么命名空间移除操作并不总是被调用,而需要手动调用有疑惑。这是因为存在如下两个原因,按照相关顺序如下:
移除命名空间需要迭代并修改文件的所有节点,而这对于Scrapy爬取的所有文档操作需要一定的性能消耗
会存在这样的情况,确实需要使用命名空间,但有些元素的名字与命名空间冲突。尽管这些情况非常少见。
5 Scrapy 终端
您可以使用
来启动Scrapy终端:
scrapy shell
是您要爬取的网页的地址。
Scrapy终端仅仅是一个普通的Python终端(或
)。其提供了一些额外的快捷方式。
可用的快捷命令(shortcut)
shelp() - 打印可用对象及快捷命令的帮助列表
fetch(request_or_url) -
根据给定的请求(request)或URL获取一个新的response,并更新相关的对象
view(response) - 在本机的浏览器打开给定的response。
其会在response的body中添加一个
,使得外部链接(例如图片及css)能正确显示。 注意,该操作会在本地创建一个临时文件,且该文件不会被自动删除。
可用的Scrapy对象
Scrapy终端根据下载的页面会自动创建一些方便使用的对象,例如
对象(对HTML及XML内容)。
这些对象有:
crawler - 当前
spider - 处理URL的spider。 对当前URL没有处理的Spider时则为一个
request - 最近获取到的页面的
对象。 您可以使用
修改该request。或者 使用 fetch
快捷方式来获取新的request。
response - 包含最近获取到的页面的
- 根据最近获取到的response构建的
settings - 当前的
终端会话(shell session)样例
下面给出一个典型的终端会话的例子。 在该例子中,我们首先爬取了
的页面,而后接着爬取
最后,我们修改了(Slashdot)的请求,将请求设置为POST并重新获取, 得到HTTP 405(不允许的方法)错误。
之后通过Ctrl-D(Unix)或Ctrl-Z(Windows)关闭会话。
需要注意的是,由于爬取的页面不是静态页,内容会随着时间而修改, 因此例子中提取到的数据可能与您尝试的结果不同。
该例子的唯一目的是让您熟悉Scrapy终端。
首先,我们启动终端:
scrapy shell 'http://scrapy.org' --nolog
接着该终端(使用Scrapy下载器(downloader))获取URL内容并打印可用的对象及快捷命令(注意到以
开头的行):
[s] Available Scrapy objects:
&200 http://scrapy.org&
&&& sel.xpath("//h2/text()").extract()[0]
u'Welcome to Scrapy'
&&& fetch("http://slashdot.org")
[s] Available Scrapy objects:
&200 http://slashdot.org&
\n\n\n\n\n
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 scrapy1.0.3 中文教程 的文章

 

随机推荐