scrapy 中文官网学习

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
    
原文地址:https://www.cnblogs.com/shaozheng/p/12792859.html