Scrapy

一、Scrapy是什么?

1.Scrapy是一个健壮的爬虫框架,可以从网站中提取需要的数据。

是一个快速、简单,并且可扩展的方法。Scrapy使用异步网络框架来处理网络通信,可以获得较快的下载速度,因此,我们不需要去自己实现异步框架。并且Scrapy包含了各种中间件接口,可以灵活完成各种需求。所有我们只需要定开发几个模块就可以轻松的实现一个爬虫,用来抓取网页上的各种内容。

二、Scrapy架构

Scrapy_第1张图片

Scrapy Engine (引擎): 是框架的核心,负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。并在发生相应的动作时触发事件。

Scheduler (调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,提供给引擎。

**Downloader (下载器):**负责下载引擎发送的所有Requests请求,并将其获取到的Responses交还给引擎。

**Spider (爬虫):**负责处理由下载器返回的Responses,并且从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给Scrapy Engine,并且再次进入Scheduler。

**Item Pipeline (项目管道):**它负责处理Spider中获取到的Item,并进行进行后期处理(清理、验证、持久化存储)的地方.

**Downloader Middlewares (下载中间件):**引擎与下载器间的特定钩子,一个可以自定义扩展下载功能的组件。处理下载器传递给引擎的Response。

**Spider Middlewares(爬虫中间件):**引擎和Spider间的特定钩子,(处理进入Spider的Responses,和从Spider出去的Requests)

三、Scrapy流程

第一步:首先Spiders(爬虫)将需要发送请求的url(request)经过ScrapyEngine(引擎)交给Scheduler(调度器).

第二步:Scheduler(排序,入队)处理后,经过ScrapyEngine,DownloaderMiddlewares(可选,主要有User_Agent,Proxy代理)交给Downloader.

三步:Downloader向互联网发送请求,并接受下载响应(response)。将响应(response)经过ScrapyEngine,SpiderMiddlewares(可选)交给Spiders.

第四步:Spiders处理response,提取数据并将数据经过ScrapyEngine交给ItemPipeline保存(可以是本地,可以是数据库)。循环,提取url重新经过ScrapyEngine交给Scheduler进行下一个循环。知道无Url请求程序停止结束。直到无Url请求程序停止结束

1、创建一个项目

scrapy startproject 项目名称

scrapy.cfg 项目的配置文件

item.py 项目的目标文件

pipelines.py 项目的管道文件

settings.py 项目的设置文件

spiders/ 存储爬虫代码目录

2、创建一个爬虫

cd 项目名文件夹

scrapy genspider 爬虫名字 爬取域

四、爬虫和爬虫之间的较量

1、robots协议

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取(摘自百度百科)。

该协议位于网站的根目录下,一般的,爬虫访问某个站点时,应该先去访问根目录下的robots.txt文件,如果该文件存在,爬虫应当遵循该文件的内容,来确定可以爬取的范围。如果该文件不存在,则可以访问网站上所有没有被口令保护的页面。

应对措施:因为这个协议并不是强制规定,实际上它只是一个“君子协定”,所以,没有强制规定必须要遵循。Scrapy中,注释掉setting.py文件中的ROBOTSTXT_OBEY选项。

2、User-Agent访问控制

User-Agent是HTTP协议中的一部分,用于向访问的网站提供用户的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。有的网站会建立User-Agent的白名单,只有在白名单中的用户才能正常访问

应对措施:Scrapy中,可以通过设置setting.py文件中的USER_AGENT字段来伪造正常的User-Agent。或者新建一个USER_AGENTS列表来存放一些User-Agent,并在下载中间件中随机选择使用。

3、IP访问控制

如果某一个ip短时间内频繁访问一个网站,很容易引起网站管理员的注意,如果管理员将这个ip地址拉入黑名单,那么这个爬虫就无法继续访问这个网站。

应对措施:首先需要避免短时间内连续访问,比如在setting.py文件中设置延时让爬虫每隔一段时间访问一次网站。Scrapy中,通过setting.py文件中的DOWNLOAD_DELAY字段来设置下载延时。(单位:秒),其次,可以设置IP代理来进行访问,用不同的ip就不怕被封掉了。网上可以找到免费或者付费的ip代理,但是质量参差不齐,需要自己进行筛选。

Scrapy中,在setting.py文件中新建一个PROXIES列表来存放一些代理,并在下载中间件中随机选择使用。ip代理列表格式如下:免费ip没有访问验证用户名和密码,所以用户名、密码可以为空。

``

PROXIES = [
        {"ip_port" :"ip地址1:端口号", "user_passwd" : "访问验证用户名:访问验证密码"【可以为空】},
        {"ip_port" :"ip地址2:端口号", "user_passwd" : "访问验证用户名:访问验证密码"【可以为空】},
        {"ip_port" :"ip地址3:端口号", "user_passwd" : "访问验证用户名:访问验证密码"【可以为空】},
        {"ip_port" :"ip地址4:端口号", "user_passwd" : "访问验证用户名:访问验证密码"【可以为空】},
        {"ip_port" :"ip地址5:端口号", "user_passwd" : "访问验证用户名:访问验证密码"【可以为空】},
]

然后需要设置下载中间件,下载中间件是出于引擎和下载器之间的一层组件,Scrapy可以有多个中间件被加载运行。在setting.py文件中设置下载中间件。当每一个请求通过下载中间件的时候,process_request(self, request, spider)方法会被调用,所以,编写middlewares.py:

``

import random
import base64

from ScrapyTest02.settings import USER_AGENTS
from ScrapyTest02.settings import PROXIES

# 随机的User-Agent
class RandomUserAgent(object):
    def process_request(self, request, spider):
        useragent = random.choice(USER_AGENTS)
        #print useragent
        request.headers.setdefault("User-Agent", useragent)

class RandomProxy(object):
    def process_request(self, request, spider):
        proxy = random.choice(PROXIES)

        if proxy['user_passwd'] is None:
            # 没有代理账户验证的代理使用方式
            request.meta['proxy'] = "http://" + proxy['ip_port']

        else:
            # 对账户密码进行base64编码转换
            base64_userpasswd = base64.b64encode(proxy['user_passwd'])
            # 对应到代理服务器的信令格式里
            request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswd
            request.meta['proxy'] = "http://" + proxy['ip_port']

4、通过js文件现在

一般到这一步来说,基本就是终极办法了,因为爬虫它仅仅是个程序,有些东西它是不认识的。比如网站的滑动验证功能。

**解决方法:**因为网页是“开放”的,所以呈现在浏览器中的就是最终的显示效果。那么,我们也有终极大杀器:PhantomJS。它是一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。

使用Selenium+PhantomJS,可以运行非常强大的爬虫,可以处理cookie,JavaScript,header以及其他你想做的任何事情。只要在浏览器中能看到的东西,都能给抓下来。

5、字体加密

自定义字体反爬,通过调用自定义的ttf文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容!

应对方法:

1.下载字体

2.映射文件

3.替换网页

5、字体加密

自定义字体反爬,通过调用自定义的ttf文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容!

应对方法:

1.下载字体

2.映射文件

3.替换网页

4.解析网页

你可能感兴趣的:(Scrapy)