欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

scrapy 爬取纵横网实战

程序员文章站 2022-06-01 12:07:23
前言 闲来无事就要练练代码,不知道最近爬取什么网站好,就拿纵横网爬取我最喜欢的雪中悍刀行练手吧 准备 python3 scrapy 项目创建: cmd命令行切换到工作目录创建scrapy项目 两条命令 scarpy startproject与scrapy genspider 然后用pycharm打开 ......

前言

闲来无事就要练练代码,不知道最近爬取什么网站好,就拿纵横网爬取我最喜欢的雪中悍刀行练手吧

准备

  • python3
  • scrapy

项目创建:

cmd命令行切换到工作目录创建scrapy项目  两条命令 scarpy startproject与scrapy genspider    然后用pycharm打开项目

d:\pythonwork>scrapy startproject zongheng
new scrapy project 'zongheng', using template directory 'c:\users\11573\appdata\local\programs\python\python36\lib\site-packages\scrapy\templates\project', created in:
    d:\pythonwork\zongheng

you can start your first spider with:
    cd zongheng
    scrapy genspider example example.com

d:\pythonwork>cd zongheng

d:\pythonwork\zongheng>cd zongheng

d:\pythonwork\zongheng\zongheng>scrapy genspider xuezhong http://book.zongheng.com/chapter/189169/3431546.html
created spider 'xuezhong' using template 'basic' in module:
  zongheng.spiders.xuezhong

确定内容

首先打开网页看下我们需要爬取的内容

scrapy 爬取纵横网实战

其实小说的话结构比较简单 只有三大块  卷 章节 内容

因此 items.py代码:

# -*- coding: utf-8 -*-

# define here the models for your scraped items
#
# see documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class zonghengitem(scrapy.item):
    # define the fields for your item here like:
    # name = scrapy.field()
    book = scrapy.field()
    section = scrapy.field()
    content = scrapy.field()
    pass

内容提取spider文件编写

还是我们先创建一个main.py文件方便我们测试代码

from scrapy import cmdline
cmdline.execute('scrapy crawl xuezhong'.split())

然后我们可以在spider文件中先编写

# -*- coding: utf-8 -*-
import scrapy


class xuezhongspider(scrapy.spider):
    name = 'xuezhong'
    allowed_domains = ['http://book.zongheng.com/chapter/189169/3431546.html']
    start_urls = ['http://book.zongheng.com/chapter/189169/3431546.html/']

    def parse(self, response):
        print(response.text)
        pass

运行main.py看看有没有输出

发现直接整个网页的内容都可以爬取下来,说明该网页基本没有反爬机制,甚至不用我们去修改user-agent那么就直接开始吧

打开网页 f12查看元素位置 并编写xpath路径 然后编写spider文件

需要注意的是我们要对小说内容进行一定量的数据清洗,因为包含某些html标签我们需要去除

# -*- coding: utf-8 -*-
import scrapy
import re
from zongheng.items import zonghengitem


class xuezhongspider(scrapy.spider):
    name = 'xuezhong'
    allowed_domains = ['book.zongheng.com']
    start_urls = ['http://book.zongheng.com/chapter/189169/3431546.html/']

    def parse(self, response):
        xuezhong_item = zonghengitem()
        xuezhong_item['book'] = response.xpath('//*[@id="reader_warp"]/div[2]/text()[4]').get()[3:]
        xuezhong_item['section'] = response.xpath('//*[@id="readerft"]/div/div[2]/div[2]/text()').get()

        content = response.xpath('//*[@id="readerft"]/div/div[5]').get()
        #content内容需要处理因为会显示<p></p>标签和<div>标签
        content = re.sub(r'</p>', "", content)
        content = re.sub(r'<p>|<div.*>|</div>',"\n",content )

        xuezhong_item['content'] = content
        yield xuezhong_item

        nextlink = response.xpath('//*[@id="readerft"]/div/div[7]/a[3]/@href').get()
        print(nextlink)
        if nextlink:
            yield scrapy.request(nextlink,callback=self.parse)

有时候我们会发现无法进入下个链接,那可能是被allowed_domains过滤掉了 我们修改下就可以

唉 突然发现了到第一卷的一百多章后就要vip了 那我们就先只弄一百多章吧 不过也可以去其他网站爬取免费的 这次我们就先爬取一百多章吧


 

内容保存

接下来就是内容的保存了,这次就直接保存为本地txt文件就行了 

首先去settings.py文件里开启  item_pipelines

然后编写pipelines.py文件

# -*- coding: utf-8 -*-

# define your item pipelines here
#
# don't forget to add your pipeline to the item_pipelines setting
# see: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


class zonghengpipeline(object):
    def process_item(self, item, spider):
        filename = item['book']+item['section']+'.txt'
        with open("../xuezhongtxt/"+filename,'w') as txtf:
            txtf.write(item['content'])
        return item

由于选址失误导致了我们只能爬取免费的一百多章节,尴尬,不过我们可以类比运用到其他网站爬取全文免费的书籍

怎么样 使用scrapy爬取是不是很方便呢

scrapy 爬取纵横网实战