python爬虫之scrapy的应用

让我们看看创建一个scrapy项目,一个爬虫文件之后,初始代码是什么意思。

name:爬虫文件的名称,是爬虫源文件的一个唯一标识。

每个爬虫文件名都不能一样。

allowed_domains:允许域名,用来限制start_urls列表哪些url可以进行请求发送。

当start_urls中有多个url,只有属于allowed_domains中域名的url才能进行请求发送。通常情况下是注释不使用的。

start_urls:起始url列表,该列表存放的url会被引擎发送给调度器。

可以同时放多个url。

parse:是用来数据解析的,其中response参数是下载器返回的响应对象。

再来看看settins.py中有什么。

BOT_NAME是项目名称。

SPIDER_MODULES是爬虫模块的位置。

ROBOTSTXT_OBEY是否遵循robots协议。

除了这些,其他都是注释的要配置什么设置就要手动打开,此外还可以自己加上

USER_AGENT = 'xxx'  用来设置请求头,模拟浏览器。

LOG_LEVEL = "ERROR" 用来设置日志等级。 默认debug级别。

我们主要的代码还是在spider中的parse里写,一般都是习惯于xpath来数据解析。

我们知道用xpath返回的是一个列表,但是列表元素是selector类型的元素。

tag = li.xpath('./div[2]/a/text()')

>>    [<Selector xpath='./div[2]/a/text()' data='这个笑话好内涵,你懂了没?'>]

我们怎样才能只拿到文本内容呢?就要用到extract(),extract可以将selector对象中data参数存储的字符串提取出来。

tag = li.xpath('./div[2]/a/text()').extract()

 >>    ['这个笑话好内涵,你懂了没?']

 如果返回列表中只有一个值的话,我们可以用extract_first(),extract_first是能将列表中第0个元素进行extract操作,返回的是字符串就不是列表了。

tag = li.xpath('./div[2]/a/text()').extract_first()

>>    这个笑话好内涵,你懂了没?

那要是列表有多个值的话,就只能用extract,不过我们可以用join来吧多个字符串连在一起。

content = li.xpath('./div[1]/text()').extract()
content = ''.join(content)

>>    有位非常漂亮的女同事,有天起晚了没有时间化妆便急忙冲到公司。结果那天她被记旷工了……吃惊

接下来看看怎么存储内容。

scrapy中有两种存储方式:一个是基于终端指令,一个是基于管道

终端指令

可以将parse中数据解析出来的数据存储到本地的文本文件中。

def parse(self, response):
    li_list = response.xpath('//*[@id="list"]/ul/li')
    all_data = []
    for li in li_list:
        tag = li.xpath('./div[2]/a/text()').extract_first()
        content = li.xpath('./div[1]/text()').extract_first()

        dic = {
            'tag':tag,
            'content':content
        }
        all_data.append(dic)

    return all_data

输入命令 scrapy crawl spidername -o filepath.csv 

在项目路径下会出现一个csv格式的文件 ,里面就是我们解析的内容。

注意:只能存储json,jsonlines,jl,csv,xml,marshal,pickle这几种类型的文本文件。 

 指令 scrapy crawl spidername -o filepath.csv 。

这种方法的好处是便捷高效,但是局限性很大,除了上述几种类型的文本文件,其他都不能,也不能存储到数据库中。

 管道

 首先在item中定义相关的属性。例如我想要存储tag和content。

class QiubaiproItem(scrapy.Item):
    # define the fields for your item here like:
    tag = scrapy.Field()
    content = scrapy.Field()

然后再spider中导入item类 from项目名.items import item中的类名。

from qiubaipro.items import QiubaiproItem

再实例化一个item类型的对象,将要存储的内容封装到item对象中。

item = QiubaiproItem()
item['tag'] = tag
item['content'] = content

最后提交给管道进行持久化存储的操作。

yield item    #将item提交给pipelines

 在管道(pipelines)中有个一个类,类里面还有一个方法,它是专门用来处理爬虫文件提交过来item对象的,每接受到一个item就会被调用一次。

class QiubaiproPipeline:
    def process_item(self, item, spider):
        return item

接下就是把item中的内容进行存储,不过我们要写一个方法用来打开或者新建一个txt文本,一个方法用来关闭。

class QiubaiproPipeline:
    fp = None
    #重写父类的一个方法:该方法只在开始爬虫的时候被调用一次
    def open_spider(self,spider):
        print('开始爬虫...')
        self.fp = open('./qiubai.txt','w',encoding='utf-8')

    #该方法每接受一个item就会被调用一次
    def process_item(self, item, spider):
        tag = item['tag']
        content = item['content']
        self.fp.write(tag+':'+content+'\n')
        self.fp.write('\n')
        return item

    def close_spider(self,spider):
        print('结束爬虫!')
        self.fp.close()

还有不要忘记了在配置文件中打开管道,把ITEM_PIPELINES的注释去掉,其中300表示优先级,越小优先级越高。

 scrapy中常用的一些方法和内容大概就是这些,当然还有很多的也还没介绍完,如果大家感兴趣可以去看看文档。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值