scrapy是什么?
scrapy是python开发的一个web抓取框架,用于抓取web站点并从中提取结构化的数据。由于它是一个框架,所以应用者可以根据需求自由修改。除此之外,它提供了多种类型爬虫的基类。可以应用在数据挖掘,信息处理和自动化测试等多方面。俗称’西瓜皮’,’小刮刮’。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的输入和输出。
架构图片如下,更方面理清流程:
- 流程
- 创建一个项目
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
…
3) 定义item
文件夹创建完成后,去items.py定义要爬取的数据。编辑文件如下(首先要确定好自己要爬取的内容,然后再到Item对对应的字段进行定义):
`
import scrapy
class Qiubai2Item(scrapy.Item):
author = scrapy.Field()
content = scrapy.Field()
comment = scrapy.Field()’
4)反爬虫
在用scrapy爬取目标网站时,由于多次高频率的爬取会对网站服务器造成压力或者说本身服务器不欢迎爬虫,一般会设置反爬虫来阻止爬虫的爬取。最简单的处理方法是对scrapy的user-agent进行修改。
- 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每次都是不同。
操作方法:1.列出常用的user_agent列表。2.在中间件中编写代码如下。
from scrapy import signals
import random
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",
]
class RandomUAMiddleware(object):
def process_request(self, request, spider):
request.headers["User-Agent"] = random.choice(USER_AGENTS)