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
原创粉丝点击