首页 > 数据库 >从python 单机版爬虫 scrapy 到 分布式scrapy-redis 爬虫用最简单的步骤创建实例

从python 单机版爬虫 scrapy 到 分布式scrapy-redis 爬虫用最简单的步骤创建实例

时间:2024-01-17 19:35:05浏览次数:24  
标签:单机版 cnblogs self redis 爬虫 item scrapy

scrapy 是很强大的模块化爬虫框架,具有很高的灵活性,使用频率很高,使用该框架能大大提高开发效率,scrapy-redis是在scrapy框架开发了组件,替换队列部分,实现多台服务器并行运行爬虫,提高爬取速度。下面是用最简单的例子从建立普通scrapy爬虫,然后数据保存mysql ,最后简单替换几行就能使用scrapy-redis改造为分布式爬虫。

一  创建最简单的爬取cnblogs  首页标题的爬虫

1  使用命令行安装 scrapy

pip install scrapy

2 使用命令行运行scrapy命令创建 scrapy项目

 scrapy startproject cnblogprojct

  进入 新创建的scrapyproject 目录并创建爬虫 

cd cnblogprojct
scrapy genspider cnblogs cnblogs.com

  然后基本的框架就创建好了

打开cnblogs.py

增加:

print(response.css('title'))

  如下图

 然后用命令行运行爬虫

scrapy crawl cnblogs

  可以看到已经抓取并打印cnblogs的标题

 到这里一个简单的scrapy就完成了。下面我们尝试把抓取的标题写入csv文件

cnblogs.py 爬虫类的 parse 方法改为以下代码

    def parse(self, response):
        item = {}
        item['title'] = response.css('title')
        item['description'] = response.css('description')
        return item

  然后 用命令行运行

scrapy crawl cnblogs -o cnblogshome.csv

就会把网页标题和描述保存到csv文件

到这里,已经可以写爬取网页并保存到文件了,下面继续进化,保存到mysql数据库

安装mysql和异步处理twisted(提高并发能力)

pip install pymysql
pip install twisted

 打开pipelines.py 编辑 CnblogprojctPipeline 类

class CnblogprojctPipeline:
    def __init__(self, dbpool):
        # logging.debug("=======5555555==========")
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        # 获取settings文件中的配置
        dbparms = dict(
            host='127.0.0.1',
            db='test',
            user='root',
            passwd='123456',
            charset='utf8',
            cp_reconnect=True,
            cursorclass=pymysql.cursors.DictCursor,
            use_unicode=True,
        )

        # 使用Twisted中的adbapi获取数据库连接池对象
        dbpool = adbapi.ConnectionPool("pymysql", **dbparms)
        return cls(dbpool)

    def process_item(self, item, spider):
        logging.debug("=======23223==========")
        # 使用teisted使mysql插入变成异步执行
        # 使用数据库连接池对象进行数据库操作,自动传递cursor对象到第一个参数
        query = self.dbpool.runInteraction(self.do_insert, item)
        # 设置出错时的回调方法,自动传递出错消息对象failure到第一个参数
        logging.debug(query)
        query.addErrback(self.handle_error, item, spider)  # 处理异常

    def handle_error(self, failure, item, spider):
        # 处理异步插入的异常
        logging.error(str(failure))

    def do_insert(self, cursor, item):
        now = datetime.datetime.now()
        now_format = (now + datetime.timedelta(hours=13)).strftime("%Y-%m-%d %H:%M:%S")

        insert_sql = """
                insert into web(title,addtime)
                values (%s,%s)
        """
        cursor.execute(insert_sql, (
            str(item["title"]),now_format
        ))

  打开setting.py 把里面将ITEM_PIPELINES给解注释了,这样爬虫 parse(self, response) 返回的item就会进入pipelines.py 的 CnblogprojctPipeline 里面

然后命令行运行

scrapy crawl cnblogs

数据就写到数据库里了

二 使用scrapy-redis 改为分布式爬虫,这样可以部署多台服务器爬取,并且因为使用同一来源:redis,所以不会重复爬

1 命令行安装模块

pip install scrapy_redis

2 在cnblogs.py  引入

from scrapy_redis.spiders import RedisSpider

并把 CnblogsSpider 继承改为RedisSpider, 并增加 redis_key = "cnblogs:start_urls"    (redis爬虫会从这个redis 队列获取需要爬取url)并把 allowed_domains ,start_urls 变量注释掉

class CnblogsSpider(RedisSpider):
    name = "cnblogs"
    redis_key = "cnblogs:start_urls"
    # allowed_domains = ["www.cnblogs.com"]
    # start_urls = ["https://www.cnblogs.com"]

然后在给redis写入需要爬取的url

I:\pythonproject\cnblogprojct> redis-cli
127.0.0.1:6379> lpush cnblogs:start_urls https://www.cnblogs.com/

运行爬虫

scrapy crawl cnblogs

有些网站禁止了爬虫,可以试一下在setting.py里 的USER-AGENT 开启并写入真实的UA

USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"

至此,使用 scrapy爬虫框架完成分布式爬虫完成,后面写下如何部署。

 

标签:单机版,cnblogs,self,redis,爬虫,item,scrapy
From: https://www.cnblogs.com/jinshao/p/17968386

相关文章

  • C语言爬虫程序编写的爬取APP通用模板
    互联网的飞快发展,尤其是手机终端业务的发展,让越来越多的事情都能通过手机来完成,电脑大部分的功能也都能通过手机实现,今天我就用C语言写一个手机APP类爬虫教程,方便后期拓展APP爬虫业务。而且这个模板是通用的适合各种APP爬虫,下面跟着我看下具体的代码吧。下面就是我给大家提供一个基......
  • 爬虫-多线程抓取图片
    一、目的利用多线程的方式爬取图片,地址:其他电脑动态壁纸-其他桌面动态壁纸-元气壁纸(cheetahfun.com)二、分析F12分析网页结构,图片的地址都在class="flexflex-wrapjustify-betweenfont-normal"标签中的li里面,只需要在a标签中img中  根据前面学过的内容,......
  • K8S单机版部署
    安装etcd、kubernetesKubernetes中几乎所有的资源对象(Node、Pod、ReplicationController、Service等)都能通过kubectl工具执行增删改查操作并保存在etcd中持久化存储。因此Kubernetes和etcd密不可分。可在root权限下,输入如下指令安装etcd和kubernetesyuminstall-yetcdkuber......
  • python爬虫利器之Playwright
    Playwright是微软在2020年初开源的新一代自动化测试工具,它的功能类似于Selenium、Pyppeteer等,都可以驱动浏览器进行各种自动化操作。它的功能也非常强大,对市面上的主流浏览器都提供了支持,API功能简洁又强大。虽然诞生比较晚,但是现在发展得非常火热。1.Playwright的特点......
  • 每日总结2024/1/15(爬虫学习)
    原文链接python爬虫-Python3.x+Fiddler抓取APP数据-学习分享-SegmentFault思否我爬取的为浏览器数据  可以看到在这里我们成功爬取到了浏览器数据,但是在实现python中爬取数据遇到了很多版本以及配置缺少的问题,同时我的版本中http为2,不知道有没有其他影响,代码目前......
  • Python和易语言爬虫哪个速度更快
    在网络时代,爬虫技术成为了信息获取和数据分析的重要工具。Python和易语言都是常见的编程语言,而且都可以用于编写爬虫程序。本文将比较Python和易语言在爬虫方面的速度,并给出一些建议。Python是一种高级编程语言,具有强大的生态系统和广泛的应用领域。它有许多优秀的第三方库和框架,如......
  • 快乐学Python,数据分析之使用爬虫获取网页内容
    在上一篇文章中,我们了解了爬虫的原理以及要实现爬虫的三个主要步骤:下载网页-分析网页-保存数据。下面,我们就来看一下:如何使用Python下载网页。1、网页是什么?浏览器画网页的流程,是浏览器将用户输入的网址告诉网站的服务器,然后网站的服务器将网址对应的网页返回给浏览器,由浏览器将......
  • 网络爬虫-梨视频下载
    一、分析要在地址https://www.pearvideo.com/video_1747820中下载视频,首先要找打视频的源地址,查看源代码未发现有源代码,在元素中找,视频播放的时候,在<video>标签中找下载链接 注意:视频不播放,是看不到视频源地址的,把视频下载地址单独复制下来如下src="https://video.pearvi......
  • 网络爬虫-处理cookie登录的问题,seesion的用法
    一、以17k的小说网的登录为例,网址小说_17K小说网|最新小说下载-一起免费看小说当想要在小说网中看一下书架上的书都有哪些,必须得先登录一个账户才能看到,不同的用户登录看到内容也是不一样的,服务器是如何区分的呢?这里要引入cookie,不同的用户访问到服务器的时候,除了访问地......
  • Python逆向爬虫入门教程: 酷狗音乐加密参数signature逆向解析
    数据来源分析......