Scrapy爬蟲基本使用


一、Scrapy爬蟲的第一個實例

演示HTML地址

演示HTML頁面地址:http://python123.io/ws/demo.html

文件名稱:demo.html

產生步驟

步驟1:建議一個Scrapy爬蟲工程  

  

  生成的工程目錄

  python123demo/------------------------->外層目錄

    scrapy.cfg ------------------------->部署Scrapy爬蟲的配置文件(將這樣的爬蟲放大特定的服務器上,並且在服務器配置好相關的操作接口,對於本機使用的爬蟲來講,不需要改變部署的配置文件)

    python123demo/------------------->Scrapy框架的用戶自定義python代碼(Scrapy框架對應的所有文件所在的目錄)

      __init__.py--------------------->初始化腳本,用戶不需要編寫

      items.py------------------------>Items代碼模板(繼承類),Items類代碼模板,需要繼承Scrapy庫提供的Item的類,對於一般的例子,不需要用戶編寫這個文件

      middlewares.py-------------->Middlewares代碼模板(繼續類),用戶希望擴展middlewares的功能,需要把這些功能寫到這個文件中

      pipelines.py------------------->Pipelines代碼模板(繼承類)

      settings.py--------------------->Scrapy爬蟲的配置文件,如果希望優化爬蟲功能。需要修改settings.py文件中對應的配置項

      spiders/------------------------->Spiders代碼模板目錄(繼承類),目錄下存放的是python123demo這個工程中所建立的爬蟲,其中的爬蟲是要符合爬蟲模塊的約束

        __init__.py--------------->初始文件,無需修改

        —pycache__/----------->緩存目錄,無需修改

步驟2:在工程中產生一個Scrapy爬蟲 

  命令約定用戶需要給出爬蟲的名字以及所爬取的網站

  D:\pycodes>cd python123demo

  D:\pycodes\python123demo>scrapy genspider demo python123.io#生成一個名稱為demo的spider,也就是一個爬蟲
  Created spider 'demo' using template 'basic' in module:
    python123demo.spiders.demo

查看demo.py文件

# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):#這個類必須是繼承scrapy.Spider類的子類
    name = 'demo'#當前爬蟲的名字叫demo
    allowed_domains = ['python123.io']#最開始用戶提交給命令行的域名,指的這個爬蟲在爬取網站的時候,只能爬取這個域名以下的相關文件
    start_urls = ['http://python123.io/']#以列表包含的一個或多個url,就是scrapy框架所要爬取頁面的初始頁面

    def parse(self, response):#解析頁面的空方法
        pass

 

parse()用於處理響應,他可以解析從網絡中爬取的內容,並且形成字典類型,同時還能夠對網絡中爬取的內容發現其中隱含的新的需要爬取的URL

步驟3:配置產生的spider爬蟲

  修改demo.py文件,使他能夠按照我們的要求去訪問我們希望訪問的那個鏈接,並且對相關的鏈接內容進行爬取

  對鏈接的解析部分定義的功能是將返回的html頁面存成文件

# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):
    name = 'demo'
    #allowed_domains = ['python123.io']
    start_urls = ['http://python123.io/ws/demo.html']

    def parse(self, response):
        fname = response.url.split('/')[-1]
        with open(fname,'wb') as f:
            f.write(response.body)
        self.log('Saved file %s.' % name)

 

步驟4:運行爬蟲,獲取網頁。

  D:\pycodes\python123demo>scrapy crawl demo

D:\pycodes\python123demo>scrapy crawl demo
2019-08-06 11:43:58 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: python123demo)
2019-08-06 11:43:58 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.5.1, w3lib 1.19.0, Twisted 18.9.0, Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 18.0.0 (OpenSSL 1.1.0j  20 Nov 2018), cryptography 2.4.2, Platform Windows-10-10.0.17134-SP0
2019-08-06 11:43:58 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'python123demo', 'NEWSPIDER_MODULE': 'python123demo.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['python123demo.spiders']}
2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2019-08-06 11:43:58 [scrapy.core.engine] INFO: Spider opened
2019-08-06 11:43:59 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-08-06 11:43:59 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2019-08-06 11:43:59 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://python123.io/robots.txt> from <GET http://python123.io/robots.txt>
2019-08-06 11:44:00 [scrapy.core.engine] DEBUG: Crawled (404) <GET https://python123.io/robots.txt> (referer: None)
2019-08-06 11:44:00 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://python123.io/ws/demo.html> from <GET http://python123.io/ws/demo.html>
2019-08-06 11:44:00 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://python123.io/ws/demo.html> (referer: None)
2019-08-06 11:44:00 [scrapy.core.scraper] ERROR: Spider error processing <GET https://python123.io/ws/demo.html> (referer: None)
Traceback (most recent call last):
  File "d:\users\bj\appdata\local\programs\python\python36\lib\site-packages\twisted\internet\defer.py", line 654, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "D:\pycodes\python123demo\python123demo\spiders\demo.py", line 14, in parse
    self.log('Saved file %s.' % name)
NameError: name 'name' is not defined
2019-08-06 11:44:00 [scrapy.core.engine] INFO: Closing spider (finished)
2019-08-06 11:44:00 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 888,
 'downloader/request_count': 4,
 'downloader/request_method_count/GET': 4,
 'downloader/response_bytes': 1901,
 'downloader/response_count': 4,
 'downloader/response_status_count/200': 1,
 'downloader/response_status_count/301': 2,
 'downloader/response_status_count/404': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2019, 8, 6, 3, 44, 0, 978216),
 'log_count/DEBUG': 5,
 'log_count/ERROR': 1,
 'log_count/INFO': 7,
 'response_received_count': 2,
 'scheduler/dequeued': 2,
 'scheduler/dequeued/memory': 2,
 'scheduler/enqueued': 2,
 'scheduler/enqueued/memory': 2,
 'spider_exceptions/NameError': 1,
 'start_time': datetime.datetime(2019, 8, 6, 3, 43, 59, 189943)}
2019-08-06 11:44:00 [scrapy.core.engine] INFO: Spider closed (finished)

 

二、yield關鍵字的使用

yield是python3中33個關鍵字中的一個,也是非常重要的一個關鍵字

這個關鍵字與生成器這個概念息息相關

yield<---------------------------------->生成器

生成器是一個不斷產生值的函數

包含yield語句的函數是一個生成器

生成器在每次運行的時候,會產生一個值(yield語句),產生值之后,生成器被凍結,直到這個函數被再次喚醒的時候,生成器繼續執行,產生一個新的值

  生成器喚醒時,所使用的局部變量的值跟之前執行所使用的的值是一致的。

生成器寫法

  def gen(n):
    for i in range(n):
      yield i**2

  生成器的使用一般與循環搭配在一起,可以用一個for循環來調用生成器

>>> def gen(n):
...     for i in range(n):
...         yield i**2
...
>>> for i in gen(5):
...     print(i," ",end="")
...
0  1  4  9  16
#每次返回一個值,再次被調用時,才產生第二個值,使用的存儲空間仍然是一個元素的存儲空間

  在for循環中,每次調用生成器時,生成器會返回一個值,這個值被打印出來,同時由於for循環產生的循環遍歷會把調用gen產生的所有的值都能喚醒一次

普通寫法

>>> def square(n):
...     ls = [i**2 for i in range(n)]
...     return ls
...
>>> for i in square(5):
...     print(i," ",end="")
...
0  1  4  9  16
#列表將n=5之內的所有結果存儲起來,通過列表返回

  為何要有生成器?

  生成器相比一次列出所有內容的優勢

    更節省存儲空間

    響應更迅速

    使用更靈活

三、Scrapy爬蟲的基本使用

Scrapy爬蟲的使用步驟

  步驟1:創建一個工程和Spider模板

  步驟2:編寫Spider

  步驟3:編寫Item Pipeline(對Spider提取信息的后續處理做相關的定義)

  步驟4:優化配置策略

Scrapy爬蟲的數據類型

  Request類

    class scrapy.http.Request()

    Request對象表示一個HTTP請求

    由Spider生成,由Downloader執行

    

  Response類

    class scrapy.http.Response()

    Response對象表示一個HTTP響應。

    由Downloader生成,由Spider處理。

    

  Item類(由Spider產生的信息封裝的類)

    class scrapy.item.Item()

    Item對象表示一個從HTML頁面中提取的信息內容

    由Spider生成,由Item Pipeline處理

    Item類似字典類型,可以按照字典類型操作

Scrapy爬蟲提取信息的方法

  Scrapy爬蟲支持多種HTML信息提取方法

    Beautlful Soup

    lxml

    re

    XPath Selector

    CSS Selector

      CSS Selector的基本使用

      <HTML>.css('a::attr(href)').extract()  注:a是標簽名字,href標簽屬性

      CSS Selector由W3C組織(是國際公認的,也是比較權威的推進HTML頁面標准化的組織)維護並規范

 

      

 

      

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM