zoukankan      html  css  js  c++  java
  • 爬虫scrapy框架入门

    O、知识框架

    一、初步概念

      Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

      1.requests+selenium能解决90%的爬虫需求&scrapy加速

      2.scrapy使用了Twisted异步网络框架,加快下载速度。Twisted学习:https://www.cnblogs.com/chenyang920/p/7923364.html异步且非阻塞。

      3.视频学习:https://www.bilibili.com/video/av37438466

        笔记1:scrapy框架 | 爬虫课程

        笔记2:https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html

      4.工具使用

        Xpath在线测试:https://www.toolnb.com/tools/xpath.html 

        在线url编码解码工具:http://www.jsons.cn/urlencode/

        抓包:postman——https://www.postman.com/downloads/

        sojoson.v5网页加密:https://www.sojson.com/jsjiemi.html

    二、安装

      1. pythonIDE安装scrapy

        在anaconda的Prompt控制台直接使用pip install scrapy,遇到building 'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools,需要先安装Twisted框架,查找安装过程:Collecting Twisted>=13.1.0 (from scrapy)..Downloading…。记住Twisted的版本号,点击https://www.lfd.uci.edu/~gohlke/pythonlibs/这个网址下载对应的whl文件,在Prompt控制台上,进入该文件位置,利用pip install xxx命令安装该文件,再使用pip install scrapy,即可安装成功。

      2.搞定Header

        首先在Chrome控制台抓到的数据上点击鼠标左键→Copy→Copy as cURL。再访问https://curl.trillworks.com/,在“curl command”中将刚才拷贝的cURL粘贴进去,右边将自动生成Python代码。

      3.使用Fidder抓包

        https://www.cnblogs.com/zhaoyanjun/p/7068905.html

    三、scrapy工作流程

     

      1.调度器把requests-->引擎-->下载中间件--->下载器

      2.下载器发送请求,获取响应---->下载中间件---->引擎--->爬虫中间件--->爬虫

      3.爬虫提取url地址,组装成request对象---->爬虫中间件--->引擎--->调度器

      4.爬虫提取数据--->引擎--->管道

      5.管道进行数据的处理和保存

    四、实战

      1.在Anaconda Prompt控制台下切换到工作路径(xxx为自定义名字):

        1)创建一个scrapy项目:scrapy startproject xxx

        2)生成一个爬虫:scrapy genspider xxx xxx.com,前一个为爬虫名,后一个为允许爬取的范围。

        3)在项目文件夹下面启动爬虫:scrapy crawl xxx

      2.extract()与extract_first()

        extract()返回一个包含有字符串的列表,extract_first() 返回列表中的第一个字符串,列表为空没有返回None。

      3.Pipeline

        1)setting里面将Pipeline启动,多个Pipeline权重越小优先级越高。

        2)为了让数据在Pipeline中传递,要用return。

        3)Pipeline中的process_item方法名不能修改为其他的名称。

      4. spider中的parse方法必须有。

      5. response.xpath方法的返回结果是一个类list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法。

      6.yield

        1)yield使得这个函数编程一个生成器。

        2)yield能够传递的对象只能是:BaseItem,Request,dict,None。

        3)遍历这个函数的返回值的时候,挨个把数据读到内存,不会造成内存的瞬间占用过高。

      7.logging

        1)若要控制台不输出日志,在setting.py中设置:LOG_LEVEL="WARNING"。保存日志只需加上LOG_FILE=xxx.txt。(也可在运行命令时附加-s LOG_FILE=xxx.txt)。

        2)import logging,实例化logger的方式在任何文件中使用logger输出内容。

        3)普通项目:import logging,logging.basicConfig(…)#设置日志输出的样式和格式,实例化一个logger=logging.getLogger(….namin),在其他文件中调用Logger使用。

      8.翻页请求                                 

        1)找到下一页的url地址。

        2)构造url地址的请求,scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False]) 注:中括号中的参数为可选参数。

          callback:表示当前的url的响应交给哪个函数处理。

          meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,如下载延迟、请求深度等。

          dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动。

          method:指定POST或GET请求。

          headers:接收一个字典,其中不包括cookies。

          cookies:接收一个字典,专门放置cookies。

          body:接收一个字典,为POST的数据。

        3)传递给引擎。yield scrapy.Request(url,callback)

        4)在settings中设置ROBOTS协议。

          # False表示忽略网站的robots.txt协议,默认为True——ROBOTSTXT_OBEY = False

        5)item

          定义item即提前规划好哪些字段需要抓取,scrapy.Field()仅仅是提前占坑。在python大多数框架中,大多数框架都会自定义自己的数据类型(在python自带的数据结构基础上进行封装),目的是增加功能,增加自定义异常。

          Item使用之前需要先导入并且实例化,之后的使用方法和使用字典相同

      9.scrapy模拟登录

        1)携带cookies直接获取需要登录后的页面:重构scrapy的starte_rquests方法(如果start_url地址中的url是需要登录后才能访问的url地址,则需要重写start_request方法并在其中手动添加上cookie);cookie不能够放在headers中,在构造请求时有专门的cookies参数,能够接受字典形式的cookie;在setting中设置ROBOTS协议、USER_AGENT

        2)找到url地址,发送post请求存储cookie。

        3)找到对应的form表单,自动解析input标签,自动解析post请求的url地址,自动带上数据,自动发送请求。通过scrapy.FormRequest能够发送post请求,同时需要添加formdata参数作为请求体,以及callback——scrapy.FormRequest(url,formdata={需要用户填写的键对值},…)。scrapy.FormRequest.from_response()发送表单请求,接收的是response。

      10.scrapy调试

        使用scrapy.shelle.inspect_response函数实现:

        from scrapy.shell import inspect_response

        inspect_response(response, self)

        Ctrl-D(Windows下Ctrl-Z)来退出终端,恢复爬取。

      11.scrapy提升框架爬取数据效率

        1)增加并发线程开启数量:settings配置文件中,修改CONCURRENT_REQUESTS = 100,默认为32,可适当增加;

        2)降低日志级别:运行scrapy时会产生大量日志占用CPU,为减少CPU使用率,可修改log输出级别,settings配置文件中LOG_LEVEL='ERROR'LOG_LEVEL = 'INFO'

        3)禁止cookie

          scrapy默认自动保存cookie,占用CPU,如果不是真的需要cookie,可设置为不保存cookie,以减少CPU使用率,settings配置文件中:COOKIES_ENABLED = False 解开注释

        4)禁止请求重试:

          对于失败的请求会重新发送,则会减慢爬取速度,因此可以在对丢失少量数据也不影响时,禁止重试,settings配置文件中加:RETRY_ENABLED = False

        5)减少下载超时:

          如果对一个非常慢的链接进行爬取,减少下载超时可以让卡住的链接快速被放弃,从而提升效率,在settings配置文件中进行编写:DOWNLOAD_TIMEOUT = 10设置超时时间;

        6)禁止重定向:REDIRECT_ENABLED = FALSE

        7)使用user_agent池

        8)使用ip代理池

        9)设置延迟:DOWNLOAD_DELAY=3,避免被发现。

        10)不按照robots.txt:ROBOTSTXT_OBEY = FALSE

        11)配置请求头:DEFAULT_REQUEST_HEADERS={{….}}

      12.scrapy爬取JS生成的页面

        1)利用第三方中间件来提供JS渲染服务:scraoy-splash等,Splash是一个javascript渲染服务。

        2)利用pip安装scrapy-splash库:pip install scrapy-splash

        3)安装docker:Windows10专业版安装docker

          ①开启Hyper-V:应用和功能——>程序和功能——>启用或关闭Windows功能——>选中Hyper-V。

          ②下载安装Docker Toolbox Desktop:https://www.docker.com/get-srarted注册站号并登录,下载Windows版本:Docker for Windows Installer安装文件,一路Next,点击Finish完成安装。

          ③镜像加速:Docker运行后,系统右下角托盘Docker图标内右键选择Settings,配置窗口左侧导航菜单选择Daemon,修改Registrymirrors为”registry-mirrors”:[“https://registry.docker-cn.com”]

          ④Win+r输入cmd回车,输入命令docker pull scrapinghub/splash拉取镜像

          ⑤输入命令:docker run -p 8050:8050 scrapinghub/splash运行scrapinghub/splash。

          ⑥在scrapy的settings.py中配置splash服务:

            1)  添加splash服务器地址:SPLASH_URL = ‘http://localhost:8050’

            2)  将splash middleware添加到DOWNLOADER_MIDDLEWARE中:

              DOWNLOADER_MIDDLEWARES = {

              ‘scrapy_splash.SplashCookiesMiddleware’:723,

              ‘scrapy_splash.SplashMiddleware’:725,

              ‘scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware’:810,

              }

            3)Enable SplashDeduplicateArgsMiddleware:

              SPIDER_MIDDLEWARES={‘scrapy_splash.SplashDeduplicateArgsMiddleware’:100}

            4)Set a custom DUPEFILTER_CLASS:

              DUPEFILTER_CLASS = ‘scrapy_splash.SplashAwareDupeFilter’        

            5)a custom cache storage backend:

              HTTPCACHE_STORAGE = ‘scrapy_splash.SplashAwareFSCacheStorage’

            6)使用 scrapy_splash库中的SplashRequest进行请求爬取即可。

      以上配置修改时使用Ctrl+F在代码中查找相应位置进行修改。

    本文为博主原创文章,未经博主允许禁止转载,需转载请注明出处,欢迎指正!
  • 相关阅读:
    Oracle常用命令
    Infobright 数据仓库
    ORACLE RMAN备份及还原
    将数据库转换为归档日志模式
    Oracle SCN详解
    Android中Intent与Bundle 在传值时有什么不同
    如何让自定义Dialog上下居中
    activity中onResume()的用处
    TabHost 两种使用方法 直接让一个Activity 继承TabActivity 和 利用findViwById()方法取得TagHost组件
    豌豆荚进程与adb端口冲突
  • 原文地址:https://www.cnblogs.com/caoer/p/13424397.html
Copyright © 2011-2022 走看看