使用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

posted @ 2019-07-07 17:41  心目  阅读(529)  评论(0编辑  收藏  举报