scrapy-1
来源:互联网 发布:搜狐网络大电影合作 编辑:程序博客网 时间:2024/06/06 23:59
1. scrapy是什么?
scrapy是python开发的一个web抓取框架,用于抓取web站点并从中提取结构化的数据。由于它是一个框架,所以应用者可以根据需求自由修改。除此之外,它提供了多种类型爬虫的基类。可以应用在数据挖掘,信息处理和自动化测试等多方面。俗称'西瓜皮','小刮刮'。
2.scrapy框架
- scrapy Engine:爬虫引擎,是工作的核心,负责数据流在系统所有组件中的流动
- scheduler:调度器,主要作用是从scrapy Engine中接受request并入队。
- Downloader:下载器,顾名思义,从页面中获取数据并提供给引擎。
- Spider:爬虫文件,用户编写用于分析获取到的response,并提取出item和额外跟进的URL的类。 - Item Pipeline:负责处理给spider提取出来的item。
- Downloader middlewares:下载器中间件,是引擎和下载器之间的特定钩子(specific hook),处理downloader传递给引擎的response.
- Spider middlewares:Spider中间件,在引擎和response之间的特定钩子(specific hook),处理spider的输入和输出。
架构图片如下,更方面理清流程:
![scrapy架构](http://img.blog.csdn.net/20170303094205406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlucWluZzg3MDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3.流程
- 创建一个项目
1)在要存储代码的目录中,用cmd运行下列命令:
C:\>scrapy startproject projectname
2)成功后进入目录如下:
projectname/
scrapy.cfg-配置文件
projectname/-Python模块,代码会在次添加
__init__.py
**items.py**-项目中的item文件(步骤3)
pipelines.py-项目中的pipelines文件
settings.py-项目的设置文件
spiders/-放置spider代码的目录
__init__.py
...
- 定义ITEM
定义item 文件夹创建完成后,去items.py定义要爬取的数据。
编辑文件如下(首先要确定好自己要爬取的内容,然后再到Item对对应的字段进行定义):
`
import scrapy class Qiubai2Item(scrapy.Item):
author = scrapy.Field()
content = scrapy.Field()
comment = scrapy.Field()'
- 反爬虫
在用scrapy爬取目标网站时,由于多次高频率的爬取会对网站服务器造成压力或者说本身服务器不欢迎爬虫,一般会设置反爬虫来阻止爬虫的爬取。最简单的处理方法是对scrapy的user-agent进行修改。
-1) settings.py里找到USER_AGENT
默认为'projectname (+http://www.yourdomain.com)',搜索常用的浏览器的user_agent并将默认值进行修改。
``` USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 ' ```
这样在进行爬取时,服务器会接收到我们设置的user-agent,有可能会躲过屏蔽顺利爬取数据。
-2) 这样只是单纯的设置了一个固定的user_agent,在多次爬取时依然有可能会被发现屏蔽,所以深处想一想,我们同样可以设置随机的user agent,爬虫在每次爬取时服务器接受到的user-agent每次都是不同。
操作方法:
- 首先搜索到常用的user_agent列表
USER_AGENTS = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",]
- 将其放入middlewares并编写代码:import random
class RandomUAMiddleware(object): def process_request(self, request, spider): request.headers["User-Agent"] = random.choice(USER_AGENTS)
comments:
1)为什么要在middlewares里写随机选取User-Agent的代码?spider middlewares就是spider中间件,处理spider的输入输出。
2)每个middlewares都是定义了一下或多个方法的类class。
- process_request方法(def process_request(self, request, spider)
每个request通过中间件时,该方法会被调用。每个中间件的返回值有三种:
*None: 返回值为None时会继续执行后面的中间件
*Request: 返回值为Request时会跳过后面的中间件
*Response:返回值为Response时会直接跳过访问网络过程,进入response处理的流程,也就是process_response方法。scrapy将不会再调用其他的process_request()或者process_exception()方法。- process_response方法(def process_response(request, response, spider))
如果process_request方法返回值为response,则会调用此方法对response进行处理。
- process_exception方法(def process_exception(request, exception, spider))
当下载处理器(download handler)或process_request()抛出异常(包括IgnoreRequest异常)时,Scrapy会调用此方法。process_exception方法会返回以下之一:
* None:返回值为None时scrapy将会继续处理该异常,接着调用已安装的其他中间件的Process_exception()方法,直到所有中间件都被调用完毕,则调用默认的异常处理。
* Response: 返回值为Response时, 则已安装的中间件的process_response()方法被调用,不会再调用其他中间件的process_exception()方法。
* Request:返回值为Request时, 则返回的request将会被重新调用下载,停止中间件的process_exception()方法执行。
3)要激活下载器中间件组件,要将其加入到DOWNLOADER_MIDDLEWARES设置中。spider里可以有多个middlewares,在setting里可以进行配置设置调用顺序。这个设置是字典,键是中间件的路径,值是中间件的顺序。
Downloader_MiddleWARES={'qiubai.middlewares.RandomUAMiddleware': 4000,'qiubai.middlewares.PrintUAMiddleware':4005}
0 0
- scrapy-1-初窥scrapy
- scrapy-1
- 《Learning Scrapy》1 Scrapy介绍
- Scrapy学习笔记(1)初探Scrapy
- Python 关于 Scrapy 1
- scrapy研究探索1
- Scrapy学习-1
- Scrapy教程1--7
- Scrapy学习日记1
- scrapy 学习1
- 1、初识scrapy
- Scrapy 入门记录(1)
- Learning Scrapy 1
- Scrapy爬取1
- 随笔1-scrapy
- Scrapy学习笔记(1)
- scrapy学习(1)
- scrapy
- Unity版本控制忽略文件
- Java复习之集合框架Set接口
- js杂记
- 安卓实战开发之把arr替换为library给eclipse使用(菜鸟学习)
- 支持向量机通俗导论(理解SVM的三层境界)(2)
- scrapy-1
- Ubuntu 16.04 desktop 配置VPN服务pptpd
- ROS 右手坐标系图
- 动归之状态压缩
- Java设计模式之适配器模式
- react 学习参考文章
- linux 下查看共享内存的使用以及删除共享内存(转)
- oracle视图详解
- 不错的sql