爬蟲(九)--scrapy框架

一、scrapy框架

(一)安裝

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy

(二)步驟

1.創建項目

在這裏插入圖片描述

在這裏插入圖片描述

2.配置

不遵循robot協議

在這裏插入圖片描述
請求頭

在這裏插入圖片描述

3.編寫想要獲取的url,並測試

在這裏插入圖片描述

啓動命令

scrapy crawl maoyan --nolog

在這裏插入圖片描述
在這裏插入圖片描述

4.設置想要提取的字段

在這裏插入圖片描述

5.實例化item對象

在這裏插入圖片描述

6.提取數據

在這裏插入圖片描述

extract_first()    # 提取出一個選擇器的data值
extract_first()    # 提取出一個list中所有選擇器data值,返回值爲list

在這裏插入圖片描述

7.存入item對象

在這裏插入圖片描述

(三)目錄結構

在這裏插入圖片描述

一定要嚴格按照這個目錄結構,不然運行命令會發生找不到命令的情況。

二、scrapy框架圖及組件

在這裏插入圖片描述
在這裏插入圖片描述

三、scrapy發送二次請求

在scrapy項目中,我們想要在parse方法中繼續發送一個請求,請求其他url,可以通過yield一個scrapy.Requests()對象完成。這樣scrapy引擎就會將它加入調度隊列中進行下載,將下載好的結果傳給該對象的callback參數鎖對應的回調方法。

在這裏插入圖片描述

該對象還有一個meta參數,用來傳遞參數

在這裏插入圖片描述

四、保存數據

將提取完全的item,保存到MongoDB中。

1.傳遞

將提取完全的item,使用yield item傳遞給pipelines.py中的process_item(self, item, spider)函數處理。
在這裏插入圖片描述

2.配置

要想使用pipelines.py中的類來存儲item,必須將該類配置到settings.py中。
在這裏插入圖片描述

3.存儲

在這裏插入圖片描述
因爲這個爬蟲程序不止要執行一次,不能每次執行都重新獲取一遍,要去重,即增量爬蟲。

增量爬蟲:讓我們爬蟲程序每次運行後,都能保證讓數據庫中數據穩定增長,不會出現重複。

所以給item增加一個datail_hash字段,保存detail_url的hash值。操作數據庫時,使用update就可以使用這個字段快速查找是否存在該數據,有的話就更新,沒有就插入。

五、自定義下載

即selenium+phantomjs

(一)步驟

1.創建一個MyMiddlerWare.py文件

在這裏插入圖片描述

2.創建一個類

這個類就是我們的下載中間件。當一個request在被下載器下載之前,使用這個中間件捕捉到它,可以提前對這個request做一些操作。當我們自己進行了下載之後,下載器發現就不會再下載了。

使用中間件的process_request方法。

def process_request(self, request, spider)

import time

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from scrapy.http import HtmlResponse

class MyMiddleWare(object):
    def __init__(self):
        self.driver = webdriver.PhantomJS()
        self.wait = WebDriverWait(self.driver,10)

    def process_request(self, request, spider):
        xpath = request.meta.get('xpath')
        self.driver.get(request.url)
        if xpath:
            self.wait.until(EC.presence_of_element_located((By.XPATH,xpath)))
        else:
            time.sleep(3)
        html = self.driver.page_source
        return HtmlResponse(url=request.url,body=html,encoding='utf-8',request=request)

3.配置

想要這個下載中間件生效,就要在settings.py中配置如下內容
在這裏插入圖片描述

六、scrapy設置初始請求的方法

(一)通過start_url

在這裏插入圖片描述

(二)通過start_requests()方法

在這裏插入圖片描述

這種方法的優點是可以手動設置url的一些request信息,比如可以自帶meta參數,比如可以給它設置一些請求頭。

七、scrapy中使用cookie

將cookie信息添加到請求頭中。
在這裏插入圖片描述

scrapy默認會自己定義cookie信息,所以只將cookie設置到請求頭中是不會生效的。

還需要設置禁用默認的cookie
在這裏插入圖片描述

八、LinkExtractor類

LinkExtractor類,能幫我們快速找到頁面指定位置處的所有鏈接,且會將相關信息也獲取到。

1.導包

from scrapy.linkextractors import LinkExtractor

2.創建一個le對象

對象接收的參數就是你想篩選鏈接的xpath,他會將你所傳入xpath的頁面元素中的所有鏈接及相關信息都篩選出來,這個參數是一個list,可以一次性接收多個xpath。

3.使用extract_links()方法取出

le = LinkExtractor(restrict_xpaths = ['//div[@class="l"]/ul/li/span[1]'])
links = le.extract_links(response)

在這裏插入圖片描述

4.取出url

for link in links循環這個links,使用link.url就能獲取到url了。
在這裏插入圖片描述

九、日誌

配置

LOG_FILE= 'biquge.log'    # 日誌文件的名稱
LOG_ENABLE  =True    # 開啓日誌
LGO_LEVEL = 'DEBUG'    # 日誌等級
LOG_ENCODING = 'utf-8'    # 編碼

5種日誌等級

  • CRITICAL:嚴重錯誤
  • ERROR:一般錯誤
  • WARNING:警告信息
  • INFO:一般信息
  • DEBUG:調試信息

十、編寫啓動文件

在這裏插入圖片描述

from scrapy import cmdline
cmdline.execute('scrapy crawl biquge_spider --nolog'.split())

不用再輸入命令,可以直接運行main.py文件運行項目。

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