scrapy安装与简介

2019-12-06

'''
安装 scrapy的依赖库lxml、zope.interface、twisted、pyOpenSSL、pywin32,都需要安装
pip install lxml
pip install zope.interface
twisted下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted;根据系统位数和python版本下载,下载后安装wheel,然后在安装下载的.whl文件
pip install wheel
pip install ad3-2.1-cp36-cp36m-win_amd64.whl
pip install pyOpenSSL
pywin32下载地址:https://pypi.python.org/pypi/pypiwin32,下载后安装下载的.whl文件;现在可直接安装pip install pywin32
pip install ad3-2.1-cp36-cp36m-win_amd64.whl
安装完以上的依赖库,在安装scrapy,可直接pip install scrapy会自动下载依赖库
pip install scrapy
'''
'''
创建项目
在项目目录打开cmd,输入scrapy startproject xiaozhu(项目名子) 创建一个项目主目录
'''

'''
介绍
items.py 定义爬去的字段
piplines.py 处理爬虫数据,写入数据库
settings.py 项目设置(user-argent,ip代理、爬取等待)
在spiders目录下创建一个用户自建的文件,用来编写爬虫的逻辑
'''

'''
两种运行方式
1、在项目目录下执行scrapy crawl xiaozhu(项目名)
2、在xiaozhu(项目)的目录下新建main.py,文件的内容为:
from scrapy import cmdline
cmdline.execute('scrapy crawl xiaozhu'.split())
然后运行main文件
'''

'''
各个部件:
ScrapyEngine:核心
Scheduler调度器:引擎发来的requests请求,调度器需要处理,然后交换引擎
Downloader下载器:把引擎发来的requests发出请求,得到response
Spider爬虫:负责把下载器得到的网页/结果进行分解,分解成数据+链接
ItemPipeline管道:详细处理Item
DownloaderMiddleware下载中间件:自定义下载的功能扩展组件
SpiderMiddleware爬虫中间件:对spider进行功能扩展
'''

'''
爬虫项目大概流程:
新建项目:scrapy startproject xxx
明确需要目标/产出:编写item.py
制作爬虫:在spider目录下创建xxspider.py文件,编写爬虫逻辑
存储内容:pipelines.py
'''

'''
ItemPipeline(对应的是pipeline.py文件)
1、爬虫提取出的数据存入item后,item中保存的数据需要进一步处理,比如清洗、去重、存储
2、pipline需要处理process_item函数
    a、process_item:spider提取出来的item作为参数传入,同时传入的还有spider,此方法必须实现,必须返回一个Item对象,被丢弃的item不会被之后的pipeline处理
3、init:构造函数
    a、进行一些必要的参数初始化
4、open_spider(spider):spider对象被开启的时候调用
5、close_spider(spider):当spider对象被关闭的时候调用
'''

'''
Spider:(对应的是文件夹spiders下的文件)
1、__init__:初始化爬虫名称,start_urls列表
2、start_resquests:生成Requests对象交给Scrapy下载并返回response
3、parse:根据返回的response解析出相应的item,item自动进入pipeline,如果需要解析出url,url自动交给requests模块,一直循环下去;start_resquests:此方法只能被调用一次,读取start_urls内容并启动循环过程
4、name:设置爬虫名称
5、start_urls:设置开始第一批爬取的url
6、allow_domains:spider允许爬取的域名列表
7、start_request(self):只被调用一次
8、log:日志记录
'''

'''
中间件:处于引擎和下载器中间的一层组件,用来伪装请求,对发出的请求和返回的结果进行预处理,在middlewares文件中,需要在settings中设置以便生效
2、一般一个中间件只完成一个功能
3、必须实现以下一个或者多个方法
    a、process_request(self,request,spider)
        在request通过的时候被调用,必须返回None或Response或request或raise IgnoreRequest
        None:scrapy将继续处理该request
        Request:scrapy会停止调用process_request并重新调度返回的request
        Response:scrapy不会调用其他的process_request或者process_exception,直接将该response作为结果同时调用process_response函数
    b、process_response(self,request,response,spider)
        跟process_request大同小异
        每次返回结果的时候会自动调用
        可以有多个,按顺序调用
'''

'''
1、为了防止爬虫进入死循环,需要去重:
    即在spider中的parse函数中,返回Request的时候加上dont_filter=False函数
    例:yield scrapy.Request(url=url,callback=self.parse,dont_filter=False)
2、如何在scrapy中使用selenium
    可以放入中间件中的process_request函数中,在函数中调用selenium,完成爬取后返回Response
    class MyMiddleWare(object):
        def process_request(self,resquest,spider):
            driver = webdriver.Chrome()
            html = driver.page_source
            driver.quit()
            return HtmlResponse(url=request.url,encoding="utf-8",body=html,request=request)
'''


'''
运行流程:
    1 引擎访问spider,询问需要处理的URL链接,spider收到请求,将需要处理的URL告诉引擎,然后将URL给引擎处理。
    2 引擎通知调度器,调度器得到通知将URL排序入队,并加以处理。
    3 引擎通知调度器,调度器将处理好的request返回给引擎
    4 引擎接收到request后告诉下载器,按照setting中配置的顺序下载这个request的请求
    5 下载器收到请求,将下载好后的东西返回给引擎。如果下载失败,下载器会通知引擎,引擎再通知调度器,调度器收到消息后会记录这个下载失败的request。
    6 引擎得到下载好的东西后,通知spider(这里responses默认是交给def parse()函数处理)
    7 Spider收到通知后,处理接收的数据
    8 Spider处理完数据后返回给引擎两个结果:一个是需要跟进的URL,另一个是获取到的item数据。
    9 引擎将接收到的item数据交给管道处理,将需要跟进的URL交给调度器处理。重复循环直到获取完需要的全部信息。

'''
'''
引擎打开一个网站,找到处理这个网站的spider,向spider请求第一个需要处理的url
引擎收到url后,通知调度器,调度器收到通知后将url排序入队列,并加以处理
引擎通知调度器,调度器将处理好的requests返回给引擎
引擎接收到request后告诉下载器,按照settings中的配置下载这个请求
下载器下载后将内容返回给引擎,如果失败,会通知引擎,引擎在通知调度器,调度器会将这个失败记录下来
引擎得到下载好的内容后,通知spider处理,
spiser收到消息后,处理接收的数据
spider处理完数据后返回给引擎两个结果,一个获得的item数据,一个是需要跟进的url
引擎将item数据交给管道处理,将新的url交给调度器,重复循环,直到获取完所有信息
'''

'''
scrapy是一个使用了Twisted异步网络框架的爬虫框架,只需要实现少量的代码即可快速的抓取网页内容,加快了下载速度,不用自己实现异步框架,包含了各种中间件接口,非常灵活

'''

{/if}