热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

scrapy和scrapy_redis入门

Scarp框架需求获取网页的url下载网页内容(Downloader下载器)定位元素位置,获取特定的信息(Spiders蜘蛛)存储信息(ItemPipeline,一条一条从管里走)

Scarp框架

  1. 需求
  2. 获取网页的url
  3. 下载网页内容(Downloader下载器)
  4. 定位元素位置, 获取特定的信息(Spiders 蜘蛛)
  5. 存储信息(ItemPipeline, 一条一条从管里走)
  6. 队列存储(scheduler 调度器)

scrapy和scrapy_redis入门

首先, spiders 给我们一个初始的URL, spider获取列表页内的详情页的url.

其次, 将url 存储到scheduler内, 然后 scheduler 就会自动将url放到downloader内执行.

详情页download之后, 返回response给spiders.

再次, spiders会将response获取到并且查找需要的内容, 内容进行封装item.

最后, 这个item就会被传输到itempipeline中, 存储或者其他操作.

 

 

安装scrapy的方法:

pip install wheel

pip install 你的路径/Twisted-18.7.0-cp35-cp35m-win_amd64.whl

pip install scrapy

 

缺少win32api

 

https://germey.gitbooks.io/python3webspider/content/1.8.2-Scrapy%E7%9A%84%E5%AE%89%E8%A3%85.html

创建项目:

在pycharm中选中目录右键open terminal 进入命令窗口执行如下:

scrapy startproject scrapy_project(项目名)

 

创建spider 进入scrapy_project中

cd scrapy_project

scrapy genspider bole jobbole.com

(scrapy genspider 项目名(spider.py)  爬取网址)

 

运行, 创建一个main.py, main.py 的内容就是:(用于运行启动整个项目,可以避免每次都去terminal输入命令)

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

bole:要执行的spider里的py文件名

Scrapy文件结构

  • Items.py定义scrapy内部数据的模型文件

继承scrapy.item

属性 变量名=scrapy.Field()

  1. Pipelines.py (管道)当我们的items.py被返回的时候,会自动调用我们的pipelines.py类中的process_item()函数;所以pipelines.py中的类需要加到settings.py中的ITEM_PIPELINES字典中

 

ITEM_PIPELINES = {
'myproject.pipelines.XiaochengxuPipeline': 300,

#’项目名+pipelines+pipelines.py中的类’:300,
}

 

  1. Settings.py 配置各种参数 ROBOTSTXT_OBEY = False (是否遵守君子协议)

#下载延迟

3.1 DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyprojectDownloaderMiddleware': 543,
}

Isinstance 判断那个类的实例

  1. bole.py

通过xpath获取内容, xpath返回的元素内容是selector: extract_first() = [0]extract()

zan = response.xpath('//h10[@]/text()').extract_first()

 

extract_first() 获取selector内的data的内容

items.py

# 添加内容到item中 固定格式

titile = scrapy.Field()
zan = scrapy.Field()

 

 

bole.py

from myproject.items import BoleItem

#创建Item的类

item = BoleItem()

# 通过字典的形式填充item的类

item[‘title’] = title

item[‘zan’] = zan

# 相当于将item传给pipelines

yield item

 

Items.py

class BoleItem(scrapy.Item):

# 变量=scrapy.Field() 将bole.py的内容获取过来

title = scrapy.Field()
zan = scrapy.Field()

  1. 我们自己定义的item类需要继承scrapy.Item
  2. 我们需要定义的类里面的变量

名称 = scrapy.Field()

  1. pipelines.py

class BolePipeline(object):

def process_item(self, item, spider):

#变量=item['title'] 接收items中的内容

item 相关的操作:

  1. 打印
  2. 存储到MySQL
  3. 其它

 

Settings.py

ITEM_PIPELINES = {
# 'myproject.pipelines.MyprojectPipeline': 300,
'myproject.pipelines.BolePipeline': 300,

#固定格式.固定格式.pipeline.py中创建的类名:300 300是优先级 优先级越低优先级越高
}

Pycharm中点击Terminal 输入:

Scarpy shell +要访问的url

进入输入命令行然后输入要匹配的xpath或用其他方法要匹配的信息

//td[not(@class)][1]/a/text() 取没有class中的第一个

 

Yield 返回时多个参数meta={'item':item}

参数一:item['url_herf']让函数parse_detail去处理的url

参数二:meta={'item':item}可在函数parse_detail中item = response.meta['item']调用之后一同返回yield item

参数三:callback=self.parse_detail 之后要处理的函数

Yield scrapy.Request(item['url_herf'],meta={'item':item},callback=self.parse_detail)

 

# 没有此步数据库会报错1241 因为里面有换行符需要处理连接成字符串
新变量 = ''.join(旧变量)


返回302错误需要添加headers头

 

  1. 我们需要将这个ImagesPipeline放到setting的pipline的配置中
  2. 我们需要将这个图片存储的位置配置成功, setting中的IMAGES_STORE='img_download'
  3. 需要下载的URL必须存储在 item 中的 image_urls

 

拉勾网需要不记录COOKIE,需要在setting中将COOKIE:False 开启

 

Crawl模板

  1. scrapy genspider -t crawl lagou lagou.com
  2. LinkExtractor 获取需要的url的正则表达式
  3. callback就是页面返回以后,使用哪个函数处理页面的返回信息
  4. follow就是如果是true, 就会继续寻找当前页面的url处理, 如果是false, 就不在当前页面寻找url继续处理

数据的流程

  1. scrapy初始的内容是添加在 spiders内部的, 它的初始的url的获取通过两种方式, 第一种就是: start_urls, 第二种就是: 函数 start_request()
  2. spiders会将url 传递并存储到sheduler中, scheduler就是一个存储url(Request)的队列.
  3. scheduler 中的url, 我们会获取这些url放到downloader中去下载页面. CONCURRENT_REQUESTS就是downloader中同时下载的页面的最大值.
  4. downloader在下载结束之后, 会将下载后的response返回给spiders.
  5. downloader 在下载之前会经过 download middware, 可以在这里添加1, headers, 2, 代理
  6. spiders在获取到response之后, 会解析这个response, 获取特定需要的信息并生成items, yield item
  7. 在spiders获取到response之后, 还有可能生成新的url, 就再次执行2.
  8. item会被传递到item pipeline中, item pipeline会执行后续的操作(可能是存储, 展示, 函数).

 

每一个部分的作用于他们的输入输出

1 spiders:

  1. url生成的地方
  2. 返回值解析的地方
  3. item生成

输入:

  1. start_urls , start_request
  2. response(downloader给的)

输出:

  1. request
  2. item

 

2 Scheduler

  1. 存储Request

输入:

url(Request) 输入的模块是:spiders, pipeline, downloader

输出:

url (Request) 输出的模块只有downloader

 

3 Downloader

  1. 接受Request, 并下载这个Request
  2. 将response返回给spiders

输入:

Request, 来源是scheduler

输出:

response: 接收方spiders

request 接收方就是scheduler

 

4 itempipline

  1. 获取到item之后, 将它(存储, 展示, 其它)

输入:

item, spiders生成的

输出:

不确定, (数据库, 文件, 其它)

Request, 给scheduler

 

5 downloader middlewares

  1. 当scheduler的request经过的时候, 此时还没下载页面, 我们可以对Request进行修改 process_request
  2. 当 downloader 下载页面结束的时候, 也会经过downloader middlewares 我们可以根据response的内容做一些处理 process_response
  3. 当下载的过程中出现了异常, 也会经过downloader middlewares, process_exception

 

6 spiders middlewares

  1. 当Reuqest从spider发给sheduler的时候, 会经过spiders middleware, 可以做的操作是过滤Request, 去重等
  2. 当downloader 返回response的时候, 也能经过spiders middlewares, 这里一样是可以做一些根据返回值的过滤操作.

 

Redis安装

找到文件Redis-x64-3.2.100.msi安装

解压redis-desktop-manager.rar中一个文件夹 高版本为中文

在Python环境中安装scrapy-redis:pip install scrapy-redis

scrapy和scrapy_redis入门

scrapy-redis 的改造方法

  1. 要将一个Scrapy项目变成一个Scrapy-redis项目只需修改以下三点就可以了:

导包:from scrapy_redis.spiders import RedisSpider

  1. 将爬虫的类从scrapy.Spider变成RedisSpider;或者是 从scrapy.CrawlSpider变成scrapy_redis.spiders.RedisCrawlSpider。

2.将爬虫中的start_urls删掉。增加一个redis_key="xxx"。这个redis_key是为了以后在redis中控制爬虫启动的。爬虫的第一个url,就是在redis中通过这个发送出去的。

3.在配置文件中增加如下配置:

Scrapy-Redis相关配置

确保request存储到redis中

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

 

确保所有爬虫共享相同的去重指纹

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

设置redis为item pipeline

ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300}

 

在redis中保持scrapy-redis用到的队列,不会清理redis中的队列,从而可以实现暂停和恢复的功能。

SCHEDULER_PERSIST = True

 

设置连接redis信息

REDIS_HOST = '127.0.0.1'

REDIS_PORT = 6379

REDIS_PASSWORD = 123456

 

运行爬虫:

爬虫服务器上pychong。进入爬虫文件所在的路径,然后输入命令: scrapy runspider [爬虫文件.py]

 

Redis服务器上,推入一个开始的url链接:redis安装目录下运行redis-cli.exe;命令行输入:lpush [redis_key] start_url 开始爬取。

 

在Mysql中添加用户:grant all on *.* to root@’%’ identified by ’密码’;

在Mysql中查询用户:select user,host from mysql.user;


推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 本文总结了使用不同方式生成 Dataframe 的方法,包括通过CSV文件、Excel文件、python dictionary、List of tuples和List of dictionary。同时介绍了一些注意事项,如使用绝对路径引入文件和安装xlrd包来读取Excel文件。 ... [详细]
author-avatar
oth0037112
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有