Scarp框架

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

首先, 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[@id="89252votetotal"]/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头

ImagesPipeline

  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, 就再次执行.
  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-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;

scrapy和scrapy_redis入门的更多相关文章

  1. Scrapy 爬虫框架入门案例详解

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对 ...

  2. Python爬虫框架Scrapy教程(1)—入门

    最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...

  3. 浅析scrapy与scrapy_redis区别

    最近在工作中写了很多 scrapy_redis 分布式爬虫,但是回想 scrapy 与 scrapy_redis 两者区别的时候,竟然,思维只是局限在了应用方面,于是乎,搜索了很多相关文章介绍,这才搞 ...

  4. Scrapy爬虫快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  5. scrapy安装及入门使用

    scrapy安装及入门使用 安装 pip3.7 install Scrapy 输入scrapy命令查看是否安装成功 J-pro:myproject will$ scrapy Scrapy 2.1.0 ...

  6. scrapy爬虫框架入门教程

    scrapy安装请参考:安装指南. 我们将使用开放目录项目(dmoz)作为抓取的例子. 这篇入门教程将引导你完成如下任务: 创建一个新的Scrapy项目 定义提取的Item 写一个Spider用来爬行 ...

  7. Python爬虫Scrapy(二)_入门案例

    本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的Spider并提 ...

  8. 【python】Scrapy爬虫框架入门

    说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...

  9. Scrapy框架-scrapy框架快速入门

    1.安装和文档 安装:通过pip install scrapy即可安装. Scrapy官方文档:http://doc.scrapy.org/en/latest Scrapy中文文档:http://sc ...

随机推荐

  1. 用 Homebrew 带飞你的 Mac

    文章目录 资料 安装 基本用法 源镜像 Homebrew也称brew,macOS下基于命令行的最强大软件包管理工具,使用Ruby语言开发.类似于CentOS的yum或者Ubuntu的apt-get,b ...

  2. 用javascript来实现前端简单路由

    WEB开发中路由概念并不陌生,我们接触到的有前端路由和后端路由.后端路由在很多框架中是一个重要的模块,如Thinkphp,Wordpress中都应用了路由功能,它能够让请求的url地址变得更简洁.同样 ...

  3. JVM 辣鸡回收

    垃圾回收算法 标记清除法 先标记出需要回收的对象,然后一次性回收.缺点:会产生内存碎片,并且效率也不高. 标记压缩法 先标记出需要回收的对象,然后让存活对象向一端移动,移动的过程中进行回收辣鸡.避免了 ...

  4. (链表 双指针) leetcode 160. Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  5. (注意输入格式)bistuoj(旧)1237 成绩统计

    成绩统计 Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByteTotal Submit:88          ...

  6. secureCRT恶意终止下次无法启动

    secureCRT使用中恶意中断后会在C:\Documents and Settings\wuyipeng\Application Data目录下产生一个secureCRT.dmp文件 下次正常运行s ...

  7. 离线提取目标机hash

    ##看了大佬的文章学习到一个姿势在此将其记录一下复现过程 github项目地址:https://github.com/SecureAuthCorp/impacket.git python setup ...

  8. MySQL数据库详解之"双1设置"的数据安全的关键参数案例分享

    mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...

  9. flask flash消息

    请求完成,让用户知道状态发生了变化,可以使用flash确认消息 示例: xx.py from flask import Flask,render_template,request,redirect,u ...

  10. Accord.NET Framework 介绍

    阅读目录 1.基本功能与介绍 Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET  ...