scrapy框架

什么是scrapy?

scrapy是一个用于爬取网站,提取结构性数据的一个半成品框架,里面集成了许多功能。

安装

Windows系统:

pip install scrapy

基本使用

创建项目

scrapy startproject 项目名

创建爬虫文件

cd 项目
scrapy genspider 文件名 url

运行项目

scrapy crawl 文件名

编写爬虫文件

理解爬虫文件的不同组成部分

    class BiliSpider(scrapy.Spider):
        #爬虫文件的名称,是当前爬虫文件的唯一标识
        name = 'bili'
        #允许的域名
        # allowed_domains = ['www.baidu.com']
        #起始的url列表:可以将即将被请求的url,存放在当前列表中。默认情况,列表中存储的url都会被scrapy框架进行get请求的发送
        start_urls = ['https://www.baidu.com/','https://www.sogou.com']
        #实现数据解析
        #参数response表示请求对应的响应对象
        #parse方法调用的次数取决于请求的次数
        def parse(self, response):
            print(response)

配置文件修改:settings.py

  - 不遵从robots协议:ROBOTSTXT_OBEY = False

  - 指定输出日志的类型:LOG_LEVEL = 'ERROR'

  - 指定UA:USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36'

数据解析

def parse(self, response):
    #可以进行数据解析而无需转为文本后再解析
    text = response.xapth(xpath路径)

持久化存储

基于管道实现持久化存储(主要)

在items.py文件中定义相关的字段

 import scrapy
    
    
    class BiliproItem(scrapy.Item):
        # define the fields for your item here like:
        title = scrapy.Field()
        author = scrapy.Field()

在爬虫文件中引入Item类,实例化item对象,将解析到的数据存储到item对象中

item = BiliproItem()
 #将解析到的数据存储到了item对象中
item['title'] = title
item['author'] = author
#输出向管道
yield item

将item对象提交给管道

#将存储好数据的item对象提交给管道
  yield item
  ```
- 管道只可以接收item类型的对象,不可以接收其他类型对象

- ```python
  class BiliproPipeline:
      #process_item用来接收爬虫文件传递过来的item对象
      #item参数,就是管道接收到的item类型对象
      def process_item(self, item, spider):
          print(item)
          return item

实例

class BiliproPipeline:
      fp = None #全局变量
      #该函数只会被在process_item函数调用前被调用一次
      def open_spider(self,item):
          print('文件被创建成功!')
          self.fp = open('bili.txt','w')
      #该函数只会在process_item函数调用完全结束后被调用一次
      def close_spider(self,item):
          self.fp.close()
          print('文件被关闭!')
      #该函数是用来接收爬虫文件给其提交过来的item对象
      #参数item就表示接收到的item对象
      #该函数的调用次数取决于爬虫文件向其提交item对象的个数
      def process_item(self, item, spider):
          title = item['title']
          author = item['author']
          self.fp.write(author+':'+title+'\n')
          print(title,':写入文件成功!')
          return item

开启管道机制

在setting.py中把ITEM_PIPELINES解除注释就表示开启了管道机制

基于终端指令的持久化存储

     #该中方式只可以将parse方法的返回值存储到指定后缀(csv)的文本文件中
          def parse(self, response):
              #注意:Element选项卡是所有数据渲染完毕后的效果
              #network是对一个请求对应的响应数据的具体结果
              div_list = response.xpath('//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div/div[2]/div/div')
              all_data = []
              for div in div_list:
                  #注意:scrapy中xpath进行数据提取,获取的是一个Selector对象,想要的文本数据是存储在该对象内部的
                  #extract()可以将xpath返回列表中每一个selector对象中的文本数据进行提取
                  title = div.xpath('./div/div[2]/div/div/a/h3//text()').extract()
                  title = ''.join(title)
                  # author = div.xpath('./div/div[2]/div/div/p/a/span[1]/text()').extract()[0]
                  #extract_first()可以将xpath返回列表中第一个列表元素表示的selector对象中的文本数据提取出来
                  author = div.xpath('./div/div[2]/div/div/p/a/span[1]/text()').extract_first()
                  dic = {
                      'title':title,
                      'author':author
                  }
                  all_data.append(dic)
              #爬取到的数据被作为parse方法的返回值
              return all_data
      

将parse方法的返回值存储到指定后缀的文本文件中:

scrapy crawl 爬虫文件名称 -o bilibili.csv

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值