scrapy 中文官网学习:
官网测试网址:
http://lab.scrapyd.cn/
项目:
scrapy startproject mingyan
创建py 文件:
1. 定义类,继承scrapy.Spider类
2. 定义一个蜘蛛名,name=“”
3.定义我们需要爬取的网址
4.继承scrapy的一个方法:start_requests(self),这个方法的作用就是通过上面定义的链接去爬取页面
实例:
import scrapy
class mingyan(scrapy.Spider):
name = "mingyan2" # 定义蜘蛛名
def start_requests(self): # 由此方法通过下面链接爬取页面
# 定义爬取的链接
urls = [
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
'''
scrapy运行的流程:
1、定义链接;
2、通过链接爬取(下载)页面;
3、定义规则,然后提取数据 '''
page = response.url.split("/")[-2]
filename = 'mingyan-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('保存文件: %s' % filename) # 打印日志
--》 scrapy crawl mingyan2 --nolog # 执行 (不打印)
scrapy shell:
测试业面数据提取:
scrapy shell + 页面
scrapy shell http://lab.scrapyd.cn
输入提取条件:
response.css('title')、
返回结果:
[<Selector xpath='descendant-or-self::title' data='<title>爬虫实验室 - S
CRAPY中文网提供</title>'>]
css提取工具:
response.css('title').extract()
-->['<title>爬虫实验室 - SCRAPY中文网提供</title>']
>>> response.css('title').extract()[0]
'<title>爬虫实验室 - SCRAPY中文网提供</title>'
>>> response.css('title').extract_first()
'<title>爬虫实验室 - SCRAPY中文网提供</title>'
extract() 这么一个函数你就提取到了我们标签的一个列表
在后面添加:[0],那代表提取这个列表中的第一个元素
extract_first()就代表提取第一个元素,和我们的:[0],一样的效果,只是更简洁些
>>> response.css('title::text').extract_first()
'爬虫实验室 - SCRAPY中文网提供'
title后面加上了 ::text ,这代表提取标签里面的数据
--> response.css('title::text').extract_first()
css 提取实战:
import scrapy
class itemSpider(scrapy.Spider):
name = 'itemSpider'
start_urls = ['http://lab.scrapyd.cn']
def parse(self, response):
mingyan = response.css('div.quote')[0]
text = mingyan.css('.text::text').extract_first() # 提取名言
autor = mingyan.css('.author::text').extract_first() # 提取作者
tags = mingyan.css('.tags .tag::text').extract() # 提取标签
tags = ','.join(tags) # 数组转换为字符串
fileName = '%s-语录.txt' % autor # 爬取的内容存入文件,文件名为:作者-语录.txt
f = open(fileName, "a+") # 追加写入文件
f.write(text) # 写入名言内容
f.write('
') # 换行
f.write('标签:'+tags) # 写入标签
f.close() # 关闭文件操作
import scrapy
class itemSpider(scrapy.Spider):
name = 'listSpider'
start_urls = ['http://lab.scrapyd.cn']
def parse(self, response):
mingyan = response.css('div.quote') # 提取首页所有名言,保存至变量mingyan
for v in mingyan: # 循环获取每一条名言里面的:名言内容、作者、标签
text = v.css('.text::text').extract_first() # 提取名言
autor = v.css('.author::text').extract_first() # 提取作者
tags = v.css('.tags .tag::text').extract() # 提取标签
tags = ','.join(tags) # 数组转换为字符串
"""
接下来进行写文件操作,每个名人的名言储存在一个txt文档里面
"""
fileName = '%s-语录.txt' % autor # 定义文件名,如:木心-语录.txt
with open(fileName, "a+") as f: # 不同人的名言保存在不同的txt文档,“a+”以追加的形式
f.write(text)
f.write('
') # ‘
’ 表示换行
f.write('标签:' + tags)
f.write('
-------
')
f.close()
翻页:
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
指定参数爬取:
def start_requests(self):
url = 'http://lab.scrapyd.cn/'
tag = getattr(self, 'tag', None) # 获取tag值,也就是爬取时传过来的参数
if tag is not None:
url = url + 'tag/' + tag # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
yield scrapy.Request(url, self.parse)
爬取标签:爱情
scrapy crawl argsSpider -a tag=爱情
scrapy crawl argsSpider -a tag=励志
import scrapy
class ArgsspiderSpider(scrapy.Spider):
name = "argsSpider"
def start_requests(self):
url = 'http://lab.scrapyd.cn/'
tag = getattr(self, 'tag', None) # 获取tag值,也就是爬取时传过来的参数
if tag is not None:
url = url + 'tag/' + tag # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
yield scrapy.Request(url, self.parse)
def parse(self, response):
mingyan = response.css('div.quote')
for v in mingyan:
text = v.css('.text::text').extract_first()
tags = v.css('.tags .tag::text').extract()
tags = ','.join(tags)
fileName = '%s-语录.txt' % tags
with open(fileName, "a+") as f:
f.write(text)
f.write('
')
f.write('标签:' + tags)
f.write('
-------
')
f.close()
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
xpath 提取:
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性
包含HTML标签的所有文字内容提取:string()
response.xpath("string(//div[@class='post-content'])").extract()
string(要提取内容的标签),这样的话就能把数据都提取出来了,而且都合成为一条
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00
查看scrapy版本,用法:
scrapy version