zoukankan      html  css  js  c++  java
  • 使用scrapy框架做武林中文网的爬虫

    一、安装
    首先scrapy的安装之前需要安装这个模块:wheel、lxml、Twisted、pywin32,最后在安装scrapy

    pip install wheel
    pip install lxml
    这个地址是一个下载python包的好地方
    https://www.lfd.uci.edu/~gohlke/pythonlibs/下载twisted
    pip install Twisted
    pip install pywin32
    pip install scrapy
    
    安装完成后
    输入scrapy 能够执行,并能提示版本,说明安装没问题
    

    二、Scrapy项目的创建 (获取武林中文网)https://m.50zw.la/

    1、在前面输入 scrapy 的时候有个选项是 startproject,这个选项是创建scrapy项目,我们在命令提示符中输入:
    scrapy startproject wlzw (wlzw)

    2、生成基础爬虫文件
    cd wlzw
    scrapy genspider spiderwlzw m.50zw.la 前一个是py文件名名后一个是要爬取的url
    生成一个名为spiderwlzw.py文件

    3、打开pycharm-->file-->open 找到建好的项目,显示项目结构

    init.py 保持默认,不修改

    items.py 保存爬取到的数据的容器

    middlewares.py 中间件配置文件

    settings.py 项目的设置文件,延迟等。

    pipelines.py 项目管道文件,对传入的项目类中的数据进行一个清理和入库

    spiders目录 该目录下 有一个init.py 文件,和第2步生成spiderwlzw.py文件

    三、设计数据库
    1、确认保存什么数据
    数据库为:novel
    表名
    Novel
    字段名
    title 圣墟
    author 作者:辰东
    type 类别:玄幻小说
    status 状态:连载中
    update_last 更新:2019-07-05 14:35:32
    update_last_status 最新:第1407章 女帝君临世间!
    brief_introduction 小说简介
    2、创建数据库和表
    1)、pycharm下方的Terminal输入
    python

        import sqlite3
        novel=sqlite3.connect("novel.sqlite")
        createtablesql="create table novel(title varchar(100),author varchar(50),type varchar(50),status varchar(50),update_last varchar(50),update_last_status varchar(100),brief_introduction varchar(500))"
        novel.execute(createtablesql);
        2)、完成创建数据库和表
        3)、按住这个文件拖动到右侧的Database中
    

    四、修改代码
    1、根据第三步定义的数据库表结构修改items.py代码
    import scrapy

    class WlzwItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()
        author = scrapy.Field()
        type = scrapy.Field()
        status = scrapy.Field()
        update_last = scrapy.Field()
        update_last_status = scrapy.Field()
        brief_introduction = scrapy.Field()
        pass
    
    2、修改spiderwlzw.py文件
        主要为三部分
            本页内的小说连接
            本页内的下一页连接
            打开每篇小说后的采集具体的数据
        
    import scrapy
    from wlzw.items import *
    #武林中文网
    
    class SpiderwlzwSpider(scrapy.Spider):
        name = 'wlzw'  #这里要和项目名称保持一致
        allowed_domains = ['m.50zw.la']
        start_urls = ['http://m.50zw.la/wapsort/1_1.html'] #这里只处理玄幻类小说
    
        #主站链接 用来拼接
        base_site = 'http://m.50zw.la'
    
        def parse(self, response):
            book_urls = response.xpath('//table[@class="list-item"]//a/@href').extract()
            print(book_urls)
            for book_url in book_urls:
                url = self.base_site + book_url
                yield scrapy.Request(url, callback=self.getInfo)
    
            #获取下一页
            next_page_url = self.base_site + response.xpath('//table[@class="page-book"]//a[contains(text(),"下一页")]/@href').extract()[0]
            yield scrapy.Request(next_page_url, callback=self.parse)
    
        def getInfo(self, response):
            item = WlzwItem()
    
            #提取信息
            item['text_id'] = response.url.split('_')[1].replace('/', '')
            item['title'] = response.xpath('//table[1]//p/strong/text()').extract()[0]
            item['author'] = response.xpath('//table[1]//p/a/text()').extract()[0]
            item['type'] = response.xpath('//table[1]//p/a/text()').extract()[1]
            item['status'] = response.xpath('//table[1]//p/text()').extract()[2][3:]
            item['update_last'] = response.xpath('//table[1]//p[5]/text()').extract()[0][3:]
            item['update_last_status'] = response.xpath('//table[1]//p[6]/a/text()').extract()[0][3:]
            item['brief_introduction'] = response.xpath('//div[@class="intro"]/text()').extract()[0]
    
            yield item
    3、修改pipeline.py
        import sqlite3
    
        class WlzwPipeline(object):
            def open_spider(self, spider):
                self.con = sqlite3.connect("novel.sqlite")
                self.cn = self.con.cursor()
    
            def process_item(self, item, spider):
                print(item)
                insert_sql = 'insert into novel(title ,author,type,status,update_last,update_last_status,brief_introduction) values("{}", "{}", "{}", "{}", "{}", "{}", "{}")'.format(item["title"], item["author"], item["type"], item["status"], item["update_last"], item["update_last_status"], item["brief_introduction"])
                print(insert_sql)
                self.cn.execute(insert_sql)
                self.con.commit()
                return item
    
            def spider_close(self, spider):
                self.con.close()
    
    4、修改setting.py
        ITEM_PIPELINES = {
           'wlzw.pipelines.WlzwPipeline': 300,
        }
    

    五、执行爬虫 (项目目录下执行)退到与工程同一目录下:
    scrapy crawl wlzw

  • 相关阅读:
    国内公有云对比(1)- 功能篇
    国内公有云对比(1.1)- 功能篇之新浪云
    人不成熟的六大特征
    HDU1506 Largest Rectangle in a Histogram (动规)
    windows pipe
    LeetCode || Candy
    Spin.js-CSS动画进度载入器
    poj 2932 Coneology (扫描线)
    虚拟存储器--虚拟地址与物理地址
    eclipse下的ssh框架整合过程及測试
  • 原文地址:https://www.cnblogs.com/programer-xinmu78/p/11146989.html
Copyright © 2011-2022 走看看