利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。


利用Scrapy框架爬取散文网并搭建Gerapy框架


前言

本文以第一范文网(https://www.diyifanwen.com/)为例,介绍爬虫入门基础知识。。随着人工智能的不断发展,爬虫这门技术也越来越重要,很多人都开启了学习爬虫的道路,本文介绍了利用scrapy爬虫学习的一些基础知识以及代码示例。

一、Scrapy和Gerapy

1.1 scrapy简介

Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。

Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

1.2 scrapy框架

Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler 中间的通讯,信号、数据传递等。
Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件。
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第1张图片

1.3 Gerapy简介

Gerapy 是一款 分布式爬虫管理框架,支持 Python 3,基于 Scrapy开发,Gerapy 可以帮助我们:​更方便地控制爬虫运行,更直观地查看爬虫状态,更实时地查看爬取结果,更简单地实现项目部署,更统一地实现主机管理。

二、搭建scrapy框架

2.1 下载scrapy

打开cmd命令行,输入如下代码下载2.6.1版本。

pip install scrapy==2.6.1

(如果下载版本过高可能会版本不匹配。)

利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第2张图片

2.2 建立新的爬虫项目

在桌面新建文件夹,在该文件夹目录下进入cmd,输入如下代码:

scrapy startproject NewsData

出现如下所示代码证明创建成功。
在这里插入图片描述
此时该文件夹下会出现NewsData的文件夹
进入目录:爬虫\NewsData\NewsData,可以看到四个配置文件,分别是items,middlewares,piplines和settings,接下来我们就可以开始scrapy框架的配置。(小编用的是pycharm,看个人习惯,别的也可以。)

2.2.1 items的配置

定义要存入数据库的抓取内容:

import scrapy

class NewsdataItem(scrapy.Item):
    title = scrapy.Field()  # 文章标题
    url = scrapy.Field()  # 文章链接
    date = scrapy.Field()  # 发布日期
    content = scrapy.Field()  # 文章正文
    student_id = scrapy.Field()  # 学生学号
    site = scrapy.Field()  # 站点

2.2.2 middlewares的配置

添加header

from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
from scrapy.utils.project import get_project_settings
import random # 一定别忘了引入random

settings = get_project_settings()
class RotateUserAgentMiddleware(UserAgentMiddleware):
    def process_request(self, request, spider):
        referer = request.url
        if referer:
            request.headers["referer"] = referer
        USER_AGENT_LIST = settings.get('USER_AGENT_LIST')
        user_agent = random.choice(USER_AGENT_LIST)
        if user_agent:
            request.headers.setdefault('user-Agent', user_agent)
            print(f"user-Agent:{user_agent}")

2.2.3 pipelines的配置

(1)导入pymongo包和加载设置:

import pymongo
from scrapy.utils.project import get_project_settings

settings = get_project_settings()

(2)创建mongodb数据库的链接:

class NewsdataPipeline:
    # class中全部替换
    def __init__(self):
        host = settings["MONGODB_HOST"]
        port = settings["MONGODB_PORT"]
        dbname = settings["MONGODB_DATABASE"]
        sheetname = settings["MONGODB_TABLE"]
        # username = settings["MONGODB_USER"]  # monggodb没有密码的情况下就把这两行注释掉即可
        # password = settings["MONGODB_PASSWORD"]
        # 创建MONGODB数据库链接
        # client = pymongo.MongoClient(host=host, port=port, username=username, password=password)
        client = pymongo.MongoClient(host=host, port=port)  # 没有密码的时候
        # 指定数据库
        mydb = client[dbname]
        # 存放数据的数据库表名
        self.post = mydb[sheetname]

    def process_item(self, item, spider):
        data = dict(item)
        # 数据写入
        self.post.insert_one(data)  # insert()/insert_one()适用于高版本python
        return item

2.2.4 settings的配置

(1)将机器人协议的True改为False,有些站点不允许机器人爬取(一定要改,有些网站无法爬取的原因可能就是这个):

ROBOTSTXT_OBEY = False  # 不遵守机器人协议,有一些站点不允许机器人爬取,改成false即可爬取

(2)将DOWNLOADER_MIDDLEWARES注释解开加入中间件:

DOWNLOADER_MIDDLEWARES = {
        'NewsData.middlewares.RotateUserAgentMiddleware': 543,
}

(3)将ITEM_PIPELINES 注释解开用来执行pipelines函数:

ITEM_PIPELINES = {
    'NewsData.pipelines.NewsdataPipeline': 300,
}

(4)添加USER_AGENT_LIST

USER_AGENT_LIST = [
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3"
]

(5)添加MONGODB数仓设置
根据自己的数据库情况设置:

MONGODB_HOST = "localhost"  # 数仓IP
MONGODB_PORT = 27017  # 数仓端口号
MONGODB_DATABASE = "NewsData"  # 数仓数据库
MONGODB_TABLE = "News_Process_D"  # 数仓数据表单

三、创建python爬虫文件

3.1 创建文件

在NewsData目录下进入终端,输入

scrapy genspider news " "

news 为文件名称
“ “ 为目标引用的作用域,此处没有定义,默认全域。
创建成功后会在spiders文件下看到一个名为news的文件,这就是我们新建的爬虫文件,用pycharm打开进行编辑。

3.2 编辑python文件

代码如下:

import scrapy
from NewsData.items import NewsdataItem

class NewsSpider(scrapy.Spider):
    name = 'news'
    allowed_domains = []  # 作用域
    start_urls = [
        'https://www.diyifanwen.com/zuowen/gaozhongyilunwenzuowen/',
        'https://www.diyifanwen.com/zuowen/gaozhongshuomingwenzuowen/',
        'https://www.diyifanwen.com/zuowen/gaozhongyingyongwen-shenqingshu/',
        'https://www.diyifanwen.com/zuowen/gaozhongyingyongwen-duhougan/',
        'https://www.diyifanwen.com/zuowen/gaozhongyingyongwen-yanjianggao/',
        'https://www.diyifanwen.com/zuowen/gaozhongqitayingyongwen/',
        'https://www.diyifanwen.com/zuowen/gaokaozuowenshangxi/',
        'https://www.diyifanwen.com/zuowen/gaozhonghuatizuowen/',
        'https://www.diyifanwen.com/zuowen/gaokaolingfenzuowen/',
        'https://www.diyifanwen.com/zuowen/gaozhongzuowen/gkzwzd/',
        'https://www.diyifanwen.com/zuowen/gaosanxushisanwen/',
        'https://www.diyifanwen.com/zuowen/gaoyiyingyongwen/',
        'https://www.diyifanwen.com/zuowen/gaokaozuowenyuce/',
    ]


    def start_request(self):
        for url in self.start_urls:
            #item = NewsdataItem()
            #item["site"] = url[1]
            #item["item"] = url[2](若用字典形式,把这两行解开)

            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        title_list = response.xpath(
            '//*[@id="AListBox"]/ul/li/a/text()').extract()  # 如果最后是extract_first()就是匹配的第一个选项
        url_list = response.xpath(
            '//*[@id="AListBox"]/ul/li/a/@href').extract()
        # //*用于匹配所有符合要求的节点    //匹配子孙节点  /用于获取直接子节点
        # print(url_list) 此处为调试。

        for each in range(len(title_list)):
            item = NewsdataItem()
            # item = response.meta["item"]
            item["title"] = title_list[each]
            item["url"] = "http:" + url_list[each]
            item["student_id"] = '20201936'
            item["site"] = '第一范文网'


            yield scrapy.Request(url=item["url"], meta={"item": item}, callback=self.parse_detail)

    def parse_detail(self, response):
        item = response.meta["item"]
        item["content"] = response.xpath('//*[@id="ArtContent"]/p/text()').extract()
        item["date"] = response.xpath('//*[@id="artinfo"]/span[@class="time"]/text()').extract()
        return item

3.3 执行项目

在终端中输入

scrapy crawl news

最后的news为你命名的python文件名

3.4 结果显示

在数据库中查看生成的表单:
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第3张图片

四、搭建Gerapy

首先打开命令行,输入如下代码下载所需包:

pip install gerapy==0.9.11
pip install scrapyd

4.1项目初始化:

(1)初始化项目

gerapy init

执行完该命令之后会在当前目录下生成一个gerapy文件夹,进入该文件夹,会找到一个名为projects的文件夹​ ,如图:
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第4张图片
(2)进入gerapy目录下,输入如下代码:

gerapy migrate

(3)初始化超级用户 ,输入代码:

gerapy initadmin

记住用户名和密码,一般默认都是admin / password:admin

(4)启动服务,输入用户名密码

gerapy runserver 0.0.0.0:8000

在浏览器就可以进入127.0.0.1页面
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第5张图片

4.2 对gerapy的编辑

(5)编辑主机管理
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第6张图片
记得开启scrapyd服务,不然无法连接
连接成功后如图
在这里插入图片描述
(6)编辑项目管理:添加对应描述,然后点击打包,点击部署。
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第7张图片
(7)编辑任务管理:根据自己的需要设置时间,或者时间间隔,小编这里设置的时间间隔为1分钟为例(为了快速看运行情况)。
ps:目前版本还没有北京时间,推荐使用Hong_Kong时间
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第8张图片
查看任务状态,可以看到,已经成功了两次。
利用Scrapy框架爬取散文网,并简述Gerapy搭建流程。_第9张图片
Gerapy 与 scrapyd 关联
​ 我们仅使用scrapyd是可以调用scrapy进行爬虫的。 而使用Greapy是为了将使用命令行开启爬虫变成鼠标直接点击就可以实现。 在gerapy中配置了scrapyd后,不需要使用命令行,就可以通过图形化界面直接开启爬虫.

总结:
学习爬虫并不难,要有耐心,并且勤于练习, 还要养成记笔记的好习惯。熟能生巧,希望以上的范例可以对大家的爬虫入门有所帮助!

你可能感兴趣的:(python爬虫基础,scrapy,python,开发语言)