• scrapy框架(1)


     

    scrapy框架

    • Scrapy框架五大组件

       
       
       
      xxxxxxxxxx
      12
       
       
       
       
      1
      【1】引擎(Engine)----------整个框架核心
      2
      【2】爬虫程序(Spider)------数据解析提取
      3
      【3】调度器(Scheduler)-----维护请求队列
      4
      【4】下载器(Downloader)----获取响应对象
      5
      【5】管道文件(Pipeline)-----数据入库处理
      6
      7
      8
      【两个中间件】
      9
          下载器中间件(Downloader Middlewares)
      10
              引擎->下载器,包装请求(随机代理等)
      11
          蜘蛛中间件(Spider Middlewares)
      12
              引擎->爬虫文件,可修改响应对象属性
       
       
    • scrapy爬虫工作流程

       
       
       
      xxxxxxxxxx
      6
       
       
       
       
      1
      【1】爬虫项目启动,由引擎向爬虫程序索要第一批要爬取的URL,交给调度器去入队列
      2
      【2】调度器处理请求后出队列,通过下载器中间件交给下载器去下载
      3
      【3】下载器得到响应对象后,通过蜘蛛中间件交给爬虫程序
      4
      【4】爬虫程序进行数据提取:
      5
          4.1) 数据交给管道文件去入库处理
      6
          4.2) 对于需要继续跟进的URL,再次交给调度器入队列,依次循环
       
       
    • scrapy常用命令

       
       
       
      xxxxxxxxxx
      6
       
       
       
       
      1
      【1】创建爬虫项目 : scrapy startproject 项目名
      2
      【2】创建爬虫文件
      3
          2.1) cd 项目文件夹
      4
          2.2) scrapy genspider 爬虫名 域名
      5
      【3】运行爬虫
      6
          scrapy crawl 爬虫名
       
       
    • scrapy项目目录结构

       
       
       
      xxxxxxxxxx
      9
       
       
       
       
      1
      Baidu                   # 项目文件夹
      2
      ├── Baidu               # 项目目录
      3
         ├── items.py        # 定义数据结构
      4
         ├── middlewares.py  # 中间件
      5
         ├── pipelines.py    # 数据处理
      6
         ├── settings.py     # 全局配置
      7
         └── spiders
      8
             ├── baidu.py    # 爬虫文件
      9
      └── scrapy.cfg          # 项目基本配置文件
       
       
    • settings.py常用变量

       
       
       
      xxxxxxxxxx
      11
       
       
       
       
      1
      【1】USER_AGENT = 'Mozilla/5.0'
      2
      【2】ROBOTSTXT_OBEY = False
      3
          是否遵循robots协议,一般我们一定要设置为False
      4
      【3】CONCURRENT_REQUESTS = 32
      5
          最大并发量,默认为16
      6
      【4】DOWNLOAD_DELAY = 0.5
      7
          下载延迟时间: 访问相邻页面的间隔时间,降低数据抓取的频率
      8
      【5】COOKIES_ENABLED = False | True
      9
          Cookie默认是禁用的,取消注释则 启用Cookie,即:True和False都是启用Cookie
      10
      【6】DEFAULT_REQUEST_HEADERS = {}
      11
          请求头,相当于requests.get(headers=headers)
       
       
    • 创建爬虫项目步骤

       
       
       
      xxxxxxxxxx
      15
       
       
       
       
      1
      【1】新建项目和爬虫文件
      2
          scrapy startproject 项目名
      3
          cd 项目文件夹
      4
          新建爬虫文件 :scrapy genspider 文件名 域名
      5
      【2】明确目标(items.py)
      6
      【3】写爬虫程序(文件名.py)
      7
      【4】管道文件(pipelines.py)
      8
      【5】全局配置(settings.py)
      9
      【6】运行爬虫
      10
          8.1) 终端: scrapy crawl 爬虫名
      11
          8.2) pycharm运行
      12
              a> 创建run.py(和scrapy.cfg文件同目录)
      13
            from scrapy import cmdline
      14
            cmdline.execute('scrapy crawl maoyan'.split())
      15
              b> 直接运行 run.py 即可
       
       

    瓜子二手车直卖网 - 一级页面

    • 目标

       
       
       
      xxxxxxxxxx
      9
       
       
       
       
      1
      【1】抓取瓜子二手车官网二手车收据(我要买车)
      2
      3
      【2】URL地址:https://www.guazi.com/bj/buy/o{}/#bread
      4
          URL规律: o1  o2  o3  o4  o5  ... ...
      5
              
      6
      【3】所抓数据
      7
          3.1) 汽车链接
      8
          3.2) 汽车名称
      9
          3.3) 汽车价格
       
       

    实现步骤

    • 步骤1 - 创建项目和爬虫文件

       
       
       
      xxxxxxxxxx
      3
       
       
       
       
      1
      scrapy startproject Car
      2
      cd Car
      3
      scrapy genspider car www.guazi.com
       
       
    • 步骤2 - 定义要爬取的数据结构

       
       
       
      xxxxxxxxxx
      8
       
       
       
       
      1
      """items.py"""
      2
      import scrapy
      3
      4
      class CarItem(scrapy.Item):
      5
          # 链接、名称、价格
      6
          url = scrapy.Field()
      7
          name = scrapy.Field()
      8
          price = scrapy.Field()
       
       
    • 步骤3 - 编写爬虫文件(代码实现1)

       
       
       
      x
       
       
       
       
      1
      """
      2
      此方法其实还是一页一页抓取,效率并没有提升,和单线程一样
      3
      4
      xpath表达式如下:
      5
      【1】基准xpath,匹配所有汽车节点对象列表
      6
          li_list = response.xpath('//ul[@class="carlist clearfix js-top"]/li')
      7
      8
      【2】遍历后每辆车信息的xpath表达式
      9
          汽车链接: './a[1]/@href'
      10
          汽车名称: './/h2[@class="t"]/text()'
      11
          汽车价格: './/div[@class="t-price"]/p/text()'
      12
      """
      13
      # -*- coding: utf-8 -*-
      14
      import scrapy
      15
      from ..items import CarItem
      16
      17
      18
      class GuaziSpider(scrapy.Spider):
      19
          # 爬虫名
      20
          name = 'car'
      21
          # 允许爬取的域名
      22
          allowed_domains = ['www.guazi.com']
      23
          # 初始的URL地址
      24
          start_urls = ['https://www.guazi.com/bj/buy/o1/#bread']
      25
          # 生成URL地址的变量
      26
          n = 1
      27
      28
          def parse(self, response):
      29
              # 基准xpath: 匹配所有汽车的节点对象列表
      30
              li_list = response.xpath('//ul[@class="carlist clearfix js-top"]/li')
      31
              # 给items.py中的 GuaziItem类 实例化
      32
              item = CarItem()
      33
              for li in li_list:
      34
                  item['url'] = li.xpath('./a[1]/@href').get()
      35
                  item['name'] = li.xpath('./a[1]/@title').get()
      36
                  item['price'] = li.xpath('.//div[@class="t-price"]/p/text()').get()
      37
      38
                  # 把抓取的数据,传递给了管道文件 pipelines.py
      39
                  yield item
      40
      41
              # 1页数据抓取完成,生成下一页的URL地址,交给调度器入队列
      42
              if self.n < 5:
      43
                  self.n += 1
      44
                  url = 'https://www.guazi.com/bj/buy/o{}/#bread'.format(self.n)
      45
                  # 把url交给调度器入队列
      46
                  yield scrapy.Request(url=url, callback=self.parse)
       
       
    • 步骤3 - 编写爬虫文件(代码实现2)

       
       
       
      xxxxxxxxxx
      33
       
       
       
       
      1
      """
      2
      重写start_requests()方法,效率极高
      3
      """
      4
      # -*- coding: utf-8 -*-
      5
      import scrapy
      6
      from ..items import CarItem
      7
      8
      class GuaziSpider(scrapy.Spider):
      9
          # 爬虫名
      10
          name = 'car2'
      11
          # 允许爬取的域名
      12
          allowed_domains = ['www.guazi.com']
      13
          # 1、去掉start_urls变量
      14
          # 2、重写 start_requests() 方法
      15
          def start_requests(self):
      16
              """生成所有要抓取的URL地址,一次性交给调度器入队列"""
      17
              for i in range(1,6):
      18
                  url = 'https://www.guazi.com/bj/buy/o{}/#bread'.format(i)
      19
                  # scrapy.Request(): 把请求交给调度器入队列
      20
                  yield scrapy.Request(url=url,callback=self.parse)
      21
      22
          def parse(self, response):
      23
              # 基准xpath: 匹配所有汽车的节点对象列表
      24
              li_list = response.xpath('//ul[@class="carlist clearfix js-top"]/li')
      25
              # 给items.py中的 GuaziItem类 实例化
      26
              item = CarItem()
      27
              for li in li_list:
      28
                  item['url'] = li.xpath('./a[1]/@href').get()
      29
                  item['name'] = li.xpath('./a[1]/@title').get()
      30
                  item['price'] = li.xpath('.//div[@class="t-price"]/p/text()').get()
      31
      32
                  # 把抓取的数据,传递给了管道文件 pipelines.py
      33
                  yield item
       
       
    • 步骤4 - 管道文件处理数据

       
       
       
      xxxxxxxxxx
      60
       
       
       
       
      1
      """
      2
      pipelines.py处理数据
      3
      1、mysql数据库建库建表
      4
      create database cardb charset utf8;
      5
      use cardb;
      6
      create table cartab(
      7
      name varchar(200),
      8
      price varchar(100),
      9
      url varchar(500)
      10
      )charset=utf8;
      11
      """
      12
      # -*- coding: utf-8 -*-
      13
      14
      # 管道1 - 从终端打印输出
      15
      class CarPipeline(object):
      16
          def process_item(self, item, spider):
      17
              print(dict(item))
      18
              return item
      19
      20
      # 管道2 - 存入MySQL数据库管道
      21
      import pymysql
      22
      from .settings import *
      23
      24
      class CarMysqlPipeline(object):
      25
          def open_spider(self,spider):
      26
              """爬虫项目启动时只执行1次,一般用于数据库连接"""
      27
              self.db = pymysql.connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD,MYSQL_DB,charset=CHARSET)
      28
              self.cursor = self.db.cursor()
      29
      30
          def process_item(self,item,spider):
      31
              """处理从爬虫文件传过来的item数据"""
      32
              ins = 'insert into guazitab values(%s,%s,%s)'
      33
              car_li = [item['name'],item['price'],item['url']]
      34
              self.cursor.execute(ins,car_li)
      35
              self.db.commit()
      36
      37
              return item
      38
      39
          def close_spider(self,spider):
      40
              """爬虫程序结束时只执行1次,一般用于数据库断开"""
      41
              self.cursor.close()
      42
              self.db.close()
      43
      44
      45
      # 管道3 - 存入MongoDB管道
      46
      import pymongo
      47
      48
      class CarMongoPipeline(object):
      49
          def open_spider(self,spider):
      50
              self.conn = pymongo.MongoClient(MONGO_HOST,MONGO_PORT)
      51
              self.db = self.conn[MONGO_DB]
      52
              self.myset = self.db[MONGO_SET]
      53
      54
          def process_item(self,item,spider):
      55
              car_dict = {
      56
                  'name' : item['name'],
      57
                  'price': item['price'],
      58
                  'url'  : item['url']
      59
              }
      60
              self.myset.insert_one(car_dict)
       
       
    • 步骤5 - 全局配置文件(settings.py)

       
       
       
      xxxxxxxxxx
      26
       
       
       
       
      1
      【1】ROBOTSTXT_OBEY = False
      2
      【2】DOWNLOAD_DELAY = 1
      3
      【3】COOKIES_ENABLED = False
      4
      【4】DEFAULT_REQUEST_HEADERS = {
      5
          "Cookie": "此处填写抓包抓取到的Cookie",
      6
          "User-Agent": "此处填写自己的User-Agent",
      7
        }
      8
      9
      【5】ITEM_PIPELINES = {
      10
           'Car.pipelines.CarPipeline': 300,
      11
           'Car.pipelines.CarMysqlPipeline': 400,
      12
           'Car.pipelines.CarMongoPipeline': 500,
      13
        }
      14
      15
      【6】定义MySQL相关变量
      16
      MYSQL_HOST = 'localhost'
      17
      MYSQL_USER = 'root'
      18
      MYSQL_PWD = '123456'
      19
      MYSQL_DB = 'guazidb'
      20
      CHARSET = 'utf8'
      21
      22
      【7】定义MongoDB相关变量
      23
      MONGO_HOST = 'localhost'
      24
      MONGO_PORT = 27017
      25
      MONGO_DB = 'guazidb'
      26
      MONGO_SET = 'guaziset'
       
       
    • 步骤6 - 运行爬虫(run.py)

       
       
       
      xxxxxxxxxx
      3
       
       
       
       
      1
      """run.py"""
      2
      from scrapy import cmdline
      3
      cmdline.execute('scrapy crawl car'.split())
       
       

    知识点汇总

    • 数据持久化 - 数据库

       
       
       
      xxxxxxxxxx
      15
       
       
       
       
      1
      【1】在setting.py中定义相关变量
      2
      【2】pipelines.py中导入settings模块
      3
      def open_spider(self,spider):
      4
      """爬虫开始执行1次,用于数据库连接"""
      5
              
      6
          def process_item(self,item,spider):
      7
              """具体处理数据"""
      8
              return item 
      9
          
      10
      def close_spider(self,spider):
      11
      """爬虫结束时执行1次,用于断开数据库连接"""   
      12
      【3】settings.py中添加此管道
      13
      ITEM_PIPELINES = {'':200}
      14
      15
      【注意】 :process_item() 函数中一定要 return item ,当前管道的process_item()的返回值会作为下一个管道 process_item()的参数
       
       
    • 数据持久化 - csv、json文件

       
       
       
      xxxxxxxxxx
      8
       
       
       
       
      1
      【1】存入csv文件
      2
          scrapy crawl car -o car.csv
      3
      
      
      4
      【2】存入json文件
      5
          scrapy crawl car -o car.json
      6
      7
      【3】注意: settings.py中设置导出编码 - 主要针对json文件
      8
          FEED_EXPORT_ENCODING = 'utf-8'
       
       
    • 节点对象.xpath('')

       
       
       
      xxxxxxxxxx
      7
       
       
       
       
      1
      【1】列表,元素为选择器 @
      2
          [
      3
              <selector xpath='xxx' data='A'>,
      4
              <selector xpath='xxx' data='B'>
      5
          ]
      6
      【2】列表.extract() :序列化列表中所有选择器为Unicode字符串 ['A','B']
      7
      【3】列表.extract_first() 或者 get() :获取列表中第1个序列化的元素(字符串) 'A'
       
       
    • 课堂练习

       
       
       
      xxxxxxxxxx
      1
       
       
       
       
      1
      【熟悉整个流程】 : 将猫眼电影案例数据抓取,存入MySQL数据库
       
       

    瓜子二手车直卖网 - 二级页面

    • 目标说明

       
       
       
      xxxxxxxxxx
      9
       
       
       
       
      1
      【1】在抓取一级页面的代码基础上升级
      2
      【2】一级页面所抓取数据(和之前一样):
      3
          2.1) 汽车链接
      4
          2.2) 汽车名称
      5
          2.3) 汽车价格
      6
      【3】二级页面所抓取数据
      7
          3.1) 行驶里程: //ul[@class="assort clearfix"]/li[2]/span/text()
      8
          3.2) 排量:    //ul[@class="assort clearfix"]/li[3]/span/text()
      9
          3.3) 变速箱:  //ul[@class="assort clearfix"]/li[4]/span/text()
       
       

    在原有项目基础上实现

    • 步骤1 - items.py

       
       
       
      xxxxxxxxxx
      15
       
       
       
       
      1
      # 添加二级页面所需抓取的数据结构
      2
      3
      import scrapy
      4
      5
      class GuaziItem(scrapy.Item):
      6
          # define the fields for your item here like:
      7
          # 一级页面: 链接、名称、价格
      8
          url = scrapy.Field()
      9
          name = scrapy.Field()
      10
          price = scrapy.Field()
      11
          # 二级页面: 时间、里程、排量、变速箱
      12
          time = scrapy.Field()
      13
          km = scrapy.Field()
      14
          disp = scrapy.Field()
      15
          trans = scrapy.Field()
       
       
    • 步骤2 - car2.py

       
       
       
      xxxxxxxxxx
      43
       
       
       
       
      1
      """
      2
      重写start_requests()方法,效率极高
      3
      """
      4
      # -*- coding: utf-8 -*-
      5
      import scrapy
      6
      from ..items import CarItem
      7
      8
      class GuaziSpider(scrapy.Spider):
      9
          # 爬虫名
      10
          name = 'car2'
      11
          # 允许爬取的域名
      12
          allowed_domains = ['www.guazi.com']
      13
          # 1、去掉start_urls变量
      14
          # 2、重写 start_requests() 方法
      15
          def start_requests(self):
      16
              """生成所有要抓取的URL地址,一次性交给调度器入队列"""
      17
              for i in range(1,6):
      18
                  url = 'https://www.guazi.com/bj/buy/o{}/#bread'.format(i)
      19
                  # scrapy.Request(): 把请求交给调度器入队列
      20
                  yield scrapy.Request(url=url,callback=self.parse)
      21
      22
          def parse(self, response):
      23
              # 基准xpath: 匹配所有汽车的节点对象列表
      24
              li_list = response.xpath('//ul[@class="carlist clearfix js-top"]/li')
      25
              # 给items.py中的 GuaziItem类 实例化
      26
              item = CarItem()
      27
              for li in li_list:
      28
                  item['url'] = 'https://www.guazi.com' + li.xpath('./a[1]/@href').get()
      29
                  item['name'] = li.xpath('./a[1]/@title').get()
      30
                  item['price'] = li.xpath('.//div[@class="t-price"]/p/text()').get()
      31
                  # Request()中meta参数: 在不同解析函数之间传递数据,item数据会随着response一起返回
      32
                  yield scrapy.Request(url=item['url'], meta={'meta_1': item}, callback=self.detail_parse)
      33
      34
          def detail_parse(self, response):
      35
              """汽车详情页的解析函数"""
      36
              # 获取上个解析函数传递过来的 meta 数据
      37
              item = response.meta['meta_1']
      38
              item['km'] = response.xpath('//ul[@class="assort clearfix"]/li[2]/span/text()').get()
      39
              item['disp'] = response.xpath('//ul[@class="assort clearfix"]/li[3]/span/text()').get()
      40
              item['trans'] = response.xpath('//ul[@class="assort clearfix"]/li[4]/span/text()').get()
      41
      42
              # 1条数据最终提取全部完成,交给管道文件处理
      43
              yield item
       
       
    • 步骤3 - pipelines.py

       
       
       
      xxxxxxxxxx
      15
       
       
       
       
      1
      # 将数据存入mongodb数据库,此处我们就不对MySQL表字段进行操作了,如有兴趣可自行完善
      2
      # MongoDB管道
      3
      import pymongo
      4
      5
      class GuaziMongoPipeline(object):
      6
          def open_spider(self,spider):
      7
              """爬虫项目启动时只执行1次,用于连接MongoDB数据库"""
      8
              self.conn = pymongo.MongoClient(MONGO_HOST,MONGO_PORT)
      9
              self.db = self.conn[MONGO_DB]
      10
              self.myset = self.db[MONGO_SET]
      11
      12
          def process_item(self,item,spider):
      13
              car_dict = dict(item)
      14
              self.myset.insert_one(car_dict)
      15
              return item
       
       
    • 步骤4 - settings.py

       
       
       
      xxxxxxxxxx
      5
       
       
       
       
      1
      # 定义MongoDB相关变量
      2
      MONGO_HOST = 'localhost'
      3
      MONGO_PORT = 27017
      4
      MONGO_DB = 'guazidb'
      5
      MONGO_SET = 'guaziset'
       
       

    盗墓笔记小说抓取 - 三级页面

    • 目标

       
       
       
      xxxxxxxxxx
      4
       
       
       
       
      1
      【1】URL地址 :http://www.daomubiji.com/
      2
      【2】要求 : 抓取目标网站中盗墓笔记所有章节的所有小说的具体内容,保存到本地文件
      3
          ./data/novel/盗墓笔记1:七星鲁王宫/七星鲁王_第一章_血尸.txt
      4
          ./data/novel/盗墓笔记1:七星鲁王宫/七星鲁王_第二章_五十年后.txt
       
       
    • 准备工作xpath

       
       
       
      xxxxxxxxxx
      13
       
       
       
       
      1
      【1】一级页面 - 大章节标题、链接:
      2
          1.1) 基准xpath匹配a节点对象列表:  '//li[contains(@id,"menu-item-20")]/a'
      3
          1.2) 大章节标题: './text()'
      4
          1.3) 大章节链接: './@href'
      5
          
      6
      【2】二级页面 - 小章节标题、链接
      7
          2.1) 基准xpath匹配article节点对象列表: '//article'
      8
          2.2) 小章节标题: './a/text()'
      9
          2.3) 小章节链接: './a/@href'
      10
          
      11
      【3】三级页面 - 小说内容
      12
          3.1) p节点列表: '//article[@class="article-content"]/p/text()'
      13
          3.2) 利用join()进行拼接: ' '.join(['p1','p2','p3',''])
       
       

    项目实现

    • 1、创建项目及爬虫文件

       
       
       
      xxxxxxxxxx
      3
       
       
       
       
      1
      scrapy startproject Daomu
      2
      cd Daomu
      3
      scrapy genspider daomu www.daomubiji.com
       
       
    • 2、定义要爬取的数据结构 - itemspy

       
       
       
      xxxxxxxxxx
      6
       
       
       
       
      1
      class DaomuItem(scrapy.Item):
      2
          # 拷问: 你的pipelines.py中需要处理哪些数据? 文件名、路径
      3
          # 文件名:小标题名称  son_title: 七星鲁王 第一章 血尸
      4
          son_title = scrapy.Field()
      5
          directory = scrapy.Field()
      6
          content = scrapy.Field()
       
       
    • 3、爬虫文件实现数据抓取 - daomu.py

       
       
       
      xxxxxxxxxx
      51
       
       
       
       
      1
      # -*- coding: utf-8 -*-
      2
      import scrapy
      3
      from ..items import DaomuItem
      4
      import os
      5
      6
      class DaomuSpider(scrapy.Spider):
      7
          name = 'daomu'
      8
          allowed_domains = ['www.daomubiji.com']
      9
          start_urls = ['http://www.daomubiji.com/']
      10
      11
          def parse(self, response):
      12
              """一级页面解析函数:提取大标题+大链接,并把大链接交给调度器入队列"""
      13
              a_list = response.xpath('//li[contains(@id,"menu-item-20")]/a')
      14
              for a in a_list:
      15
                  item = DaomuItem()
      16
                  parent_title = a.xpath('./text()').get()
      17
                  parent_url = a.xpath('./@href').get()
      18
                  item['directory'] = './novel/{}/'.format(parent_title)
      19
                  # 创建对应文件夹
      20
                  if not os.path.exists(item['directory']):
      21
                      os.makedirs(item['directory'])
      22
                  # 交给调度器入队列
      23
                  yield scrapy.Request(url=parent_url, meta={'meta_1':item}, callback=self.detail_page)
      24
      25
          # 返回了11个response,调用了这个函数
      26
          def detail_page(self, response):
      27
              """二级页面解析函数:提取小标题、小链接"""
      28
              # 把item接收
      29
              meta_1 = response.meta['meta_1']
      30
              art_list = response.xpath('//article')
      31
              for art in art_list:
      32
                  # 只要有继续交往调度器的请求,就必须新建item对象
      33
                  item = DaomuItem()
      34
                  item['son_title'] = art.xpath('./a/text()').get()
      35
                  son_url = art.xpath('./a/@href').get()
      36
                  item['directory'] = meta_1['directory']
      37
                  # 再次交给调度器入队列
      38
                  yield scrapy.Request(url=son_url, meta={'item':item}, callback=self.get_content)
      39
      40
          # 盗墓笔记1: 传过来了75个response
      41
          # 盗墓笔记2: 传过来了 n 个response
      42
          # ... ...
      43
          def get_content(self, response):
      44
              """三级页面解析函数:提取具体小说内容"""
      45
              item = response.meta['item']
      46
              # content_list: ['段落1','段落2','段落3',...]
      47
              content_list = response.xpath('//article[@class="article-content"]/p/text()').extract()
      48
              item['content'] = '
      '.join(content_list)
      49
      50
              # 至此,一条item数据全部提取完成
      51
              yield item
       
       
    • 4、管道文件实现数据处理 - pipelines.py

       
       
       
      xxxxxxxxxx
      8
       
       
       
       
      1
      class DaomuPipeline(object):
      2
          def process_item(self, item, spider):
      3
              # filename: ./novel/盗墓笔记1:七星鲁王宫/七星鲁王_第一章_血尸.txt
      4
              filename = '{}{}.txt'.format(item['directory'], item['son_title'].replace(' ', '_'))
      5
              with open(filename, 'w') as f:
      6
                  f.write(item['content'])
      7
      8
              return item
       
       
    • 5、全局配置 - setting.py

       
       
       
      xxxxxxxxxx
      10
       
       
       
       
      1
      ROBOTSTXT_OBEY = False
      2
      DOWNLOAD_DELAY = 0.5
      3
      DEFAULT_REQUEST_HEADERS = {
      4
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      5
        'Accept-Language': 'en',
      6
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
      7
      }
      8
      ITEM_PIPELINES = {
      9
         'Daomu.pipelines.DaomuPipeline': 300,
      10
      }
       
       

    今日作业

     
     
     
    xxxxxxxxxx
    9
     
     
    1
    【1】腾讯招聘职位信息抓取(二级页面)
    2
        要求:输入职位关键字,抓取该类别下所有职位信息(到职位详情页抓取)
    3
        具体数据如下:
    4
        1.1) 职位名称
    5
        1.2) 职位地点
    6
        1.3) 职位类别
    7
        1.4) 发布时间
    8
        1.5) 工作职责
     
     
    9
        1.6) 工作要求
     
     
    python
  • 相关阅读:
    Head First Java pdf下载
    【ARC068F】Solitaire(dp,计数,思维)
    【BZOJ3270】博物馆(概率dp,高斯消元)
    【BZOJ3143】【HNOI2013】游走(期望dp,高斯消元)
    【BZOJ3622】已经没什么好害怕的了(dp,容斥原理,二项式反演)
    【BJWC2018】上学路线(dp,Lucas,crt)
    【BZOJ4987】Tree(树形dp)
    【SDOI201】黑白棋 /【XSY3064】小奇的博弈(博弈,nim,dp,组合数)
    【HNOI2017】礼物(FFT)
    【BZOJ2502】清理雪道(最大费用最大流)
  • 原文地址:https://www.cnblogs.com/yongqi-wang/p/13667901.html
Copyright © 2020-2023  润新知