python爬虫小练手之用Scrapy爬取某小说网站中三国演义

一、学习课题

使用Scrapy爬取某小说网站的内容

二、学习目标

1.掌握Scrapy的安装方法
2.掌握Scrapy的基本用法

三、所用到的工具

1.pycharm
2.Scrapy库
3.re(正则)库 (还可以用etree,xpath,bs4等)
4.Powershell

四、开始项目

(一)安装Scrapy库

打开cmd命令行工具,输入以下代码

pip install scrapy
  • 拓展内容:
    调用镜像库
    1.临时使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy

2.设为默认(升级 pip 到最新的版本 (>=10.0.0) 后进行配置)

pip install pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

(二)创建项目

1.在桌面(或别处)创建一个文件夹,命名为scrapy项目,作为存放scrapy项目的文件夹。

title.png

2.在文件夹中按住shfit键+鼠标右键调出powershell窗口
3.输入代码:

scrapy startproject sgyy   #sgyy为项目名称

4.scrapy项目文件目录下自动生成了sgyy文件夹

(三)创建爬虫

1.在sgyy目录下进入powershell
2.输入代码:

scrapy genspider sgyyspider purepen.com    #scrapy genspider+爬虫名+域名
#运行后在scrapy项目\sgyy\sgyy\spiders 目录下生成了sgyyspider.py文件,这就是创建的爬虫核心

(四)编写爬虫

在pycharm中打开sgyyspider.py文件进行编写爬虫

# -*- coding: utf-8 -*-
import scrapy   
import re           #正则


class SgyyspiderSpider(scrapy.Spider):
    name = 'sgyySpider'                      #爬虫名字
    allowed_domains = ['purepen.com']        #网站
    start_urls = ['http://www.purepen.com/sgyy/index.htm']    #第一次开始采集的网址(要爬取的网站)


    def parse(self, response):
#   从这里以上是scrapy自动创建好的内容,start_urls采集的信息返回交给了response
        html = re.findall('',response.text)
        #.*?匹配任何你需要的信息 除了换行
        #.匹配任何单个字符 除了换行符
        #*数量词 任意多个字符
        #?在数量词后表示非贪婪模式
        for i in html:
            url = f'http://www.purepen.com/sgyy/{i}'  #.format
#            print(url)
            yield scrapy.Request(url, callback=self.parseDetail)
    def parseDetail (self,response):
        text = re.findall('face="宋体" size="3">(.*?)', response.text, flags=re.S)
        title = re.findall('

(.*?)', response.text) if text and title: self.save2File(title[0],text[0]) @classmethod def save2File(cls, title, text): with open(f'{title}.text', 'a', encoding='utf-8')as fp: fp.write(text)

(五)运行爬虫

在爬虫文件目录下打开powershell输入以下代码

scrapy crawl sgyySpider

(六)运行结果

在爬虫文件夹下生成了我们想要爬取的小说内容,每一章节为一个txt文件,共120个

五、总结

(一)关于re正则表达式

1.(.*?)匹配任何你需要的信息 除了换行
2.如果想让匹配的信息包括换行,则在re.findall()中传入参数:

flags=re.S

3.(.*?)加括号与不加括号的区别:
加括号是返回匹配到的数据,不包括其他匹配值
不加括号返回匹配到的数据,包括其他匹配值
例如:

     #《三国演义》为需要的信息
''         #会返回'《三国演义》'
''           #会返回

4.关于正则表达式,有待进一步学习(MARK)

(二)yield的用法

挖个坑,找时间专题进行学习(MARK)

(三)@classmethod

挖个坑,找时间专题进行学习(MARK)

你可能感兴趣的:(python爬虫小练手之用Scrapy爬取某小说网站中三国演义)