ONE:Scrapy的基本格式
import scrapy
class newhand(scrapy.Spider): # 需要继承scrapy.Spider类
name = "myscrapy" # 定义爬虫名
def start_requests(self): # 由此方法通过下面链接爬取页面
urls = [
'', #定义需要爬取的链接
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse) # 爬取到的页面交给parse方法处理
def parse(self, response):
//将页面保存下来
page = response.url.split("/")[-2]
filename = 'newhand-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('保存文件: %s' % filename)
运行该scrapy
scrapy crawl myscrapy
运行myscrapy,start_requests方法会返回scrapy.Request对象,每接收到一个,就会初始化一个self:response对象,调用parse方法去处理
TWO:可以将url定义为scrapy的一个属性
import scrapy
class simplify(scrapy.Spider): # 需要继承scrapy.Spider类
name = "myscrapy2" # 定义爬虫名
#scrapy的url属性
start_urls = [
'',
]
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'simplify-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('保存文件: %s' % filename)
THREE:数据提取
基本思路: 打开scrapy shell,当shell载入后,获得一个shell变量response,在response.selector属性上绑定了一个selector。由于使用普遍,于是,scrapy定义了两个快捷方式:response.xpath( ) 和 response.css( ),也可以结合正则表达式来使用选择器。
css选择器
1.简单三函数介绍
# 假设提取head中的title标签
<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>
# 先shell一个链接
scrapy shell http://lab.scrapyed.cn
# 第一个函数:提取到selector的一个列表,同时说明css选择器底层是xpath
In [1]: response.css('title')
Out[1]: [<Selector xpath='descendant-or-self::title' data='<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>'>]
# 加上::text提取标签的内容
In [8]: response.css('title::text')
Out[8]: [<Selector xpath='descendant-or-self::title/text()' data='SCRAPY爬虫实验室 - SCRAPY中文网提供'>]
# 第二个函数,提取data中全部title的标签,这里只有一个title
In [2]: response.css('title').extract()
Out[2]: ['<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>']
In [7]: response.css('title::text').extract()
Out[7]: ['SCRAPY爬虫实验室 - SCRAPY中文网提供']
# 第三个函数,只要标签,不需要列表
In [3]: response.css('title').extract()[0]
Out[3]: '<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>'
In [4]: response.css('title').extract_first()
Out[4]: '<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>'
# 提取标签文本
In [5]: response.css('title::text').extract_first()
Out[5]: 'SCRAPY爬虫实验室 - SCRAPY中文网提供'
In [6]: response.css('title::text').extract()[0]
Out[6]: 'SCRAPY爬虫实验室 - SCRAPY中文网提供'
2.提取标签的属性值和指定标签
# 提取标签的属性值(标签名::attr(属性名)),例如a标签中herf的url值
In [13]: response.css("a::attr(href)").extract()
Out[13]:
['http://lab.scrapyd.cn/',
'http://lab.scrapyd.cn/archives/57.html',
'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
'http://lab.scrapyd.cn/archives/55.html',
'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
'http://lab.scrapyd.cn/archives/29.html',
# 后面。。。。。省略,爬出了页面中所有a标签的href
选择器
# .class:限定为class为class中的属性
# #id:限定为id为id中的属性
# *:选择所有元素
# p:选择<p>标签中的属性
# div,p:选择<div>和<p>中的属性
# div p:选择<div>中<p>的属性
In [14]: response.css(".page-navigator a::attr(href)").extract()
Out[14]:
['http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
'http://lab.scrapyd.cn/page/3/',
'http://lab.scrapyd.cn/page/4/',
'http://lab.scrapyd.cn/page/6/',
'http://lab.scrapyd.cn/page/2/']
<ol class="page-navigator">
<li class="current"><a href="http://lab.scrapyd.cn/page/1/">1</a></li>
<li><a href="http://lab.scrapyd.cn/page/2/">2</a></li>
<li><a href="http://lab.scrapyd.cn/page/3/">3</a></li>
<li><a href="http://lab.scrapyd.cn/page/4/">4</a></li>
</ol>
xpath提取
- 提取属性@
- 提取限定//
- 谓语:
- [@class=“name”]// @href 提取class为name的元素的herf
- //text() 提取标签里面的内容
如://title//text() 表示提取title里面的内容- xpath().extract( ) 提取全部列表
- xpath().extract_first( ) 提取列表里的第一个
# 首先shell链接
scrapy shell http://lab.scrapyd.cn
#爬取的页面代码
<ul class="tags-list">
<li><a style="color:rgb(192,54,
114)" href="http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/">
人生</a></li>
<li><a style="color:rgb(80,179,
23)" href="http://lab.scrapyd.cn/tag/%E5%8A%B1%E5%BF%97/">
励志</a></li>
<li><a style="color:rgb(131,251,
100)" href="http://lab.scrapyd.cn/tag/%E7%88%B1%E6%83%85/">
爱情</a></li>
<li><a style="color:rgb(90,248,
118)" href="http://lab.scrapyd.cn/tag/%E7%8E%8B%E5%B0%94%E5%BE%B7/">
王尔德</a></li>
<li><a style="color:rgb(124,180,
244)" href="http://lab.scrapyd.cn/tag/%E6%99%BA%E6%85%A7/">
智慧</a></li>
<li><a style="color:rgb(173,191,
87)" href="http://lab.scrapyd.cn/tag/%E6%B3%B0%E6%88%88%E5%B0%94/">
泰戈尔</a></li>
<li><a style="color:rgb(115,79,
86)" href="http://lab.scrapyd.cn/tag/%E7%BB%9D%E4%B8%96%E5%A5%BD%E8%AF%8D/">
绝世好词</a></li>
<li><a style="color:rgb(168,8,
174)" href="http://lab.scrapyd.cn/tag/%E6%9C%A8%E5%BF%83/">
木心</a></li>
<li><a style="color:rgb(71,171,
23)" href="http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/">
艺术</a></li>
<li><a style="color:rgb(195,179,
141)" href="http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/">
名画</a></li>
<li><a style="color:rgb(147,54,
6)" href="http://lab.scrapyd.cn/tag/%E7%94%9F%E6%B4%BB/">
生活</a></li>
<li><a style="color:rgb(51,222,
115)" href="http://lab.scrapyd.cn/tag/%E8%AF%8D/">
词</a></li>
<li><a href="http://lab.scrapyd.cn">返回首页</a></li>
<li><a href="http://bbs.scrapyd.cn" target="_blank">SCRAPY中文社区</a></li>
<li><a href="http://www.scrapyd.cn" target="_blank">SCRAPY中文网</a></li>
</ul>
# 爬取属性href
In [6]: response.xpath("//ul[@class='tags-list']//@href")
Out[6]:
[<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E4%B
A%BA%E7%9'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E5%8
A%B1%E5%B'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%8
8%B1%E6%8'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%8
E%8B%E5%B'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E6%9
9%BA%E6%8'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E6%B
3%B0%E6%8'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%B
B%9D%E4%B'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E6%9
C%A8%E5%B'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E8%8
9%BA%E6%9'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E5%9
0%8D%E7%9'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%9
4%9F%E6%B'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E8%A
F%8D/'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://bbs.scrapyd.cn'>,
<Selector xpath="//ul[@class='tags-list']//@href" data='http://www.scrapyd.cn'>]
In [7]: response.xpath("//ul[@class='tags-list']//@href").extract()
Out[7]:
['http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/',
'http://lab.scrapyd.cn/tag/%E5%8A%B1%E5%BF%97/',
'http://lab.scrapyd.cn/tag/%E7%88%B1%E6%83%85/',
'http://lab.scrapyd.cn/tag/%E7%8E%8B%E5%B0%94%E5%BE%B7/',
'http://lab.scrapyd.cn/tag/%E6%99%BA%E6%85%A7/',
'http://lab.scrapyd.cn/tag/%E6%B3%B0%E6%88%88%E5%B0%94/',
'http://lab.scrapyd.cn/tag/%E7%BB%9D%E4%B8%96%E5%A5%BD%E8%AF%8D/',
'http://lab.scrapyd.cn/tag/%E6%9C%A8%E5%BF%83/',
'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
'http://lab.scrapyd.cn/tag/%E7%94%9F%E6%B4%BB/',
'http://lab.scrapyd.cn/tag/%E8%AF%8D/',
'http://lab.scrapyd.cn',
'http://bbs.scrapyd.cn',
'http://www.scrapyd.cn']
In [8]: response.xpath("//ul[@class='tags-list']//@href").extract()[0]
Out[8]: 'http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/'
In [9]: response.xpath("//ul[@class='tags-list']//@href").extract_first()
Out[9]: 'http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/'
# 爬取a标签的文字
In [13]: response.xpath("//ul[@class='tags-list']//a//text()")
Out[13]:
[<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 人生'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 励志'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 爱情'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 王尔德'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 智慧'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 泰戈尔'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 绝世好词'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 木心'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 艺术'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 名画'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 生活'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n 词'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='返回首页'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='SCRAPY中文社区'>,
<Selector xpath="//ul[@class='tags-list']//a//text()" data='SCRAPY中文网'>]
In [14]: response.xpath("//ul[@class='tags-list']//a//text()").extract()
Out[14]:
['\r\n 人生',
'\r\n 励志',
'\r\n 爱情',
'\r\n 王尔德',
'\r\n 智慧',
'\r\n 泰戈尔',
'\r\n 绝世好词',
'\r\n 木心',
'\r\n 艺术',
'\r\n 名画',
'\r\n 生活',
'\r\n 词',
'返回首页',
'SCRAPY中文社区',
'SCRAPY中文网']
In [15]: response.xpath("//ul[@class='tags-list']//a//text()").extract()[0]
Out[15]: '\r\n 人生'
In [16]: response.xpath("//ul[@class='tags-list']//a//text()").extract_first()
Out[16]: '\r\n 人生'
正则表达式(结合xpath或者css)
response.css().re()
response.xpath().re()
正则表达式可以参考前面编译原理词法分析的博客