一、学习课题
使用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项目的文件夹。
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('<TD><A HREF="(.*?)">',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">(.*?)</font>', response.text, flags=re.S)
title = re.findall('<font color="#000000" size="3"><br><br><b>(.*?)</b>', 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.(.*?)加括号与不加括号的区别:
加括号是返回匹配到的数据,不包括其他匹配值
不加括号返回匹配到的数据,包括其他匹配值
例如:
<META content="《三国演义》" name=description> #《三国演义》为需要的信息
'<META content="(.*?)" name=description>' #会返回'《三国演义》'
'<META content=".*?" name=description>' #会返回<META content="《三国演义》" name=description>
4.关于正则表达式,有待进一步学习(MARK)
(二)yield的用法
挖个坑,找时间专题进行学习(MARK)
(三)@classmethod
挖个坑,找时间专题进行学习(MARK)