zoukankan      html  css  js  c++  java
  • 小爬爬5:scrapy介绍2

    1.scrapy:爬虫框架

    -框架:集成了很多功能且具有很强通用性的一个项目模板

    -如何学习框架:(重点:知道有哪些模块,会用就行)

      -学习框架的功能模板的具体使用.

    功能:(1)异步爬取(自带buffer)

       (2)高性能的数据解析+持久化存储操作.

    2.scrapy环境安装:

      Linux:
    
          pip3 install scrapy
    
    
      Windows:
    
          a. pip3 install wheel
    
          b. 下载地址twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
    
          c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
    
           #注意:这一步是需要参考python版本cp36或者cp35
      
        d. pip3 install pywin32 e. pip3 install scrapy

    3.scrapy数据解析

    scrapy使用流程

    (1)首先,可以切换想要创建的目录,直接在下面的Terminal中创建一个工程,切换回上一层目录.

    (2)创建一个工程命令:scrapy startproject scrapy1

    (3)看一下目录结构,我们先了解spiders文件夹和settings.py文件

    (4)settings.py里边,我们需要进行相关的属性配置

     spiders文件夹下面,我们需要新建"爬虫文件",

     我们再cd到我们刚才新建的工程内: cd scrapy1

    创建爬虫文件:scrapy genspider 爬虫文件名  起始url

          scrapy genspider first www.xxx.com

    (5)下面,我们看一下穿件的爬虫文件first.py:

    爬虫程序first.py,详细描述

    # -*- coding: utf-8 -*-
    import scrapy
    class FirstSpider(scrapy.Spider):
        name = 'first'
        #name爬虫文件的名称,爬虫文件的唯一标识,有多个爬虫文件的时候会用到
    
        # allowed_domains = ['www.xxx.com']
        # allowed_domains = ['www.baidu.com']
        #被允许的域名
        #如果修改成:www.baidu.com这个被允许的域名,那么只可以访问百度下的相关地址
        #因此我们知道这个allowed_domains是用来做限定的,这个可以注释掉
    
        #起始的url列表(可以放置多个url)
        #多个(都会被scrapy进行自动的请求发送)
        start_urls = ['https://www.baidu.com/','https://www.sogou.com/']
    
        #用来解析数据的parse函数,现在列表中有两个url,这两个都会被请求发送
        #因此会调用两次
        def parse(self, response):  #response是url请求之后得到的响应对象
            print(response)

    下面执行爬虫程序(见下图):scrapy crawl first

    我们看起来是仅仅执行这一个爬虫文件,但其实是执行了这整个工程

    如果仅仅执行这一个爬虫文件是没有任何意义的.

     

    运行:

    得到的内容,很像是一些日志信息.

    (6)我们可以看到其中有一条是"遵循robotstxt_obey"遵循robots协议,这也就意味着我们爬取不到任何的数据,

     因此我们应该设置,不遵从robots协议,具体在settings.py里边设置,

    ROBOTSTXT_OBEY = False

    (7)下面我们再在设置里,写"遵循UA伪装"

     

    (8)这个时候,我们再次运行这个爬虫程序:

    得到下面的结果:

    (9)start_urls列表里边的url会自动发送请求的,不管有多少个都会发生请求.

     parse这个函数就会得到response响应的响应

     (10)我们看到的信息可能会干扰我们看信息,我们可以设置不看日志

    这个时候,我们可以看到只要结果数据

    2.爬取糗事百科中的作者名称

     (1)回退到上一层:

    创建一个项目:scrapy startproject qiubaiPro

    (2)注意:我们创建爬虫文件一定要进入创建的工程内

    (3)先实现UA伪装和robots协议改写

    (4)下面,我们再实现爬虫文件的编写,先找到一个总的id="content-left",进行id定位

    一步步,推导出作者的这个名称:

     

     爬虫程序:qiubai.py

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai'
        # allowed_domains = ['www.xxx.com']
        #起始url
        start_urls = ['https://www.qiushibaike.com/text/']
    
        def parse(self, response):
            div_list=response.xpath('//*[@id="content-left"]/div')
            #拿到响应数据,进行xpath数据解析
            #注意,这里的xpath和etree里边的xpath是不同的
            for div in div_list:
                author=div.xpath('./div[1]/a[2]/h2/text()')[0]
                content=div.xpath('.a/div/span//text()')
                print(author,content)
                break
                #作者是字符串,
                #内容是列表(内容是列表对应的字符串数据)

    运行:下面的内容:

    出不来结果,原因是xpath出现的问题, 

    content=div.xpath('./a/div/span//text()')

     a的前边少了一个/

    我们可以通过检查,看下日志,检查下错误出现在哪个地方:scrapy crawl qiubai(爬虫的文件名)

    (5)下面是重新启动程序之后重新打开的命令:

     

    我看看到得到的结果

     下面我们加上extract()进行处理取数据

    如何取出列表中很多条的数据?

    Terminal中  cls命令是将内容推到上边

    下面我们改变一下内容

     

    我们得到下面的结果:

    当我们只知道列表中有一个数据用下边的方法extract_first()

    extract() 列表中有多条数据的时候,我们需要将内容拼接起来.

    运行.这个时候我们可以拿到作者和笑话,还有评论人的名称

    这个时候,我们将上边的代码中的break去掉,再次运行

    运行,得到全部的作者和笑话

  • 相关阅读:
    MySQL 初识别语句,数据库、表、行的增删改查
    mysql如何从全备文件中恢复单个库或者单个表
    Shell 同步时间脚本
    app手机端连接tomcat电脑端服务器
    大于号转义符>---小于号转义符<
    轻松实现页面提交中
    重复提交问题(一)
    json
    ExtJs 6.0+快速入门,ext-bootstrap.js文件的分析,各版本API下载(一)
    ExtJS 6 如何引入Dashboard模版
  • 原文地址:https://www.cnblogs.com/studybrother/p/10957878.html
Copyright © 2011-2022 走看看