爬蟲學習——Scrapy框架學習(三)

接前面博客

Scrapy爬蟲的第一個實例

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

產生步驟:

1、建立一個Scrapy爬蟲工程

選取一個目錄,D:\pythoncode,在這個目錄中執行建立爬蟲工程的命令

工程生成了一個目錄:

下面逐一介紹這些文件和子目錄的作用:

生成的工程目錄:

python123demo/   =======>外層目錄

  • scrapy.cfg  =========>部署Scrapy爬蟲的配置文件(這裏的部署的意思是將這樣的爬蟲放在特定的服務器上並且在服務器         配置好相應的接口,對於本機的爬蟲來講,不需要改變部署的配置文件)
  • python123demo/  =====>Scrapy框架的用戶自定義Python代碼

                  _init_.py ========>初始化腳本(用戶不需要編寫)

                  items.py  ========>Items代碼模板(繼承類)(對於一般例子用戶不需要編寫)

                  middlewares.py  ===>Middlewares代碼模板(繼承類)(若需要拓展,則需要編寫)

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

                  settings.py  =======>Scrapy爬蟲的配置文件(需要優化爬蟲功能,則需要修改某些配置項)

                  spiders/  ========>Spiders代碼模板目錄(繼承類)

                               _init_.py  ===>初始文件,無需修改

                               _pycache_/   ===>緩存目錄,無需修改

2、在工程中產生一個Scrapy爬蟲

輸入命令:scrapy genspider demo python123.io

這條命令的作用是生成一個demo名稱的spider,也是僅限於生成一個如下的demo.py文件

如果你出現以下結果,可能是你命令行沒有進到python123demo子目錄下

此時spiders目錄下會多一個demo.py文件

事實上,也可以手工來生成這個文件(和上面所說命令作用相對應)

看一下demo.py文件:

這個類叫什麼沒關係,必須是繼承scrapy.Spider的字類

allowed_domains:約束只能爬取這個域名以下的鏈接

parse()用於處理響應,解析內容形成字典,發現新的URL爬取請求

3、配置產生的spider爬蟲

修改demo.py文件

要實現的功能:將返回的html存成文件,修改parse()

修改代碼如下:

4、運行爬蟲,獲取網頁

執行命令:

捕獲的頁面存儲在這:

其實上述demo.py是scrapy提供的一個簡化版代碼,完整版代碼是:

上述代碼等價,我們需要知道yield關鍵字的含義

下面介紹yield關鍵字:

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

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

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

                生成器每次產生一個值(yield語句),函數被凍結,被喚醒後再產生一個值

給一個例子:                                                                       等價普通寫法:

def gen(n):                                                                def square(n):

       for i in range(n):                                                        ls=[i**2 for i in range(n)]

            yield i**2                          =========                  return ls

for i in gen(5):                                                            for i in square(5):

           print(i,"    ",end="")                                                print(i,"    ",end="")

打印結果爲:

0    1    4    9    16

生成器相比一次列出所有內容(普通寫法)的優勢:

①更節省存儲空間;

②響應更迅速;

③使用更靈活

生成器函數一次調用產生一個值後凍結,等到再次調用時再接着運行

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章