1. 程式人生 > >scrapy框架-- request

scrapy框架-- request

1.Scrapy 介紹

(1)Python開發的一個快速、高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料

(2)特點:資料結構化、分散式

 

2.Scrapy 安裝

2.1安裝步驟

2.1.1 安裝依賴包

2.1.1.1安裝lxml

pip install lxml

2.1.1.2安裝Twisted

(1)安裝wheel:pip3 install wheel

(2)下載Twisted包

①下載連結:https://www.lfd.uci.edu/~gohlke/pythonlibs/

②下載後,開啟下載檔案的目錄,開啟cmd

輸入:pip3 install Twisted-18.7.0-cp35-cp35m-win_amd64.whl

 

2.1.2 安裝scrapy

(1)安裝:pip install scrapy

 

(2)當我們安裝好scrapy,並且有配置scrapy的環境變數(D:\python3.5.4\Scripts),假如之前配過就不用配了

 

(3)如果配置好之後,在命令列敲scrapy會有一下反應

 

3.Scrapy 基本命令與結構

3.1 基本命令

3.1.1 檢視版本

 

3.1.2 建立專案

 

3.2結構

3.2.1 爬蟲專案結構

3.2.2 爬蟲結構

Scrapy是python編寫的框架,類裡面規則和python的一樣

4.Scrapy爬蟲步驟

4.1新建爬蟲檔案

4.2編寫爬取程式碼(簡單)
 

# coding:utf-8
import scrapy
class TestSpider(scrapy.spiders.Spider):
    '''
    TestSpider 我們定義的爬蟲類


    scrapy.spiders.Spider 是scrapy定義好的爬蟲
    '''

    # 定義爬蟲的名稱,需唯一
    name = "baiduSpider"

    # 允許爬取的範圍
    allowed_domains = [
        "https://www.baidu.com/"
    ]

    # 預設爬取的起始點
    start_urls = [
        "https://www.baidu.com"
    ]

    def parse(self,response):
        '''
        scrapy 會自動呼叫downloader的下載器,當請求成功scapy會自動呼叫parse,
        將結果返回到parse的response引數上
        '''
        # 除錯方法在是scrapy當中可以代替print
        self.log(response.body.decode())

 

4.3建立啟動檔案

 

4.4 編寫執行程式碼

 

4.5 settings設定

4.5.1 Scrapy預設請求頭配置

找到HEADERS,取消註釋,並新增上“UA”資訊

 

4.5.2 設定不啟動機器人協議

 

4.6 執行啟動檔案

4.6.1 執行後報錯處理

 

提示:需安裝win32的庫

(1)下載對應python版本的win32的庫

下載地址:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/

 

(2)下載後點擊安裝後重新啟動。成功爬取

 

5.Scrapy 請求處理

假如我們只是爬一個百度這樣寫是沒有問題的,但是如果爬小說網站,請求頭有變化,那麼我們剛才配置預設請求頭就不夠用了,所以我們需要配置自己的請求頭資訊。(settings中的HEADERS重新註釋掉)

5.1 生成器

(1)python 2.4版本之後更新出來的語法糖,可以很高效的減少程式記憶體損耗

Python2 : xrange

Python3  :  range

(2)正常函式

使用return返回值,在呼叫函式時,輸出相應的值

(3)yield函式

 

5.2 Request物件

在這裡我們瞭解一個scrapy的request物件

首先request物件是由scrapy.Request方法建立

引數:

(1)url 請求的url
(2)callback=None 請求的回撥函式,預設是parse
(3)method='GET', 請求的方式
(4)headers=None, 請求的頭部
(5)body=None, 請求的正文,可以是bytes或者str
(6)cookies=None, 請求攜帶的cookie
(7)meta=None, 數是一個字典用於傳遞引數,這裡可以帶表單資料,也可以帶代理如meta = {'proxy': 'xxx.xxxx.com:埠號'}
(8)encoding='utf-8', 字符集 url和body的字符集
(9)priority=0, 優先順序,優先順序越高,越先下載
(10)dont_filter=False, 是否對同一個url多次請求
(11)errback=None, 錯誤返回
(12)flags=None  標籤

 

5.3程式碼部分

(1)程式碼

# coding:utf-8
import scrapy
from scrapy import Request
class TestSpider(scrapy.spiders.Spider):
    '''
    TestSpider 我們定義的爬蟲類
    scrapy.spiders.Spider 是scrapy定義好的爬蟲
    '''

    # 定義爬蟲的名稱,需唯一
    name = "baiduSpider"
    

# 繼承並重寫start_requests方法,定義url和headers
    def start_requests(self):
        url = "https://www.baidu.com/"
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
        }
        yield Request(url,headers=headers)

    def parse(self,response):
        '''
        scrapy 會自動呼叫downloader的下載器,當請求成功scapy會自動呼叫parse,
        將結果返回到parse的response引數上
        '''
        # 除錯方法在是scrapy當中可以代替print
        self.log(response.body.decode())

 

(2)結果

 

5.4 補充說明

(1)執行程式碼後沒有報錯:

spider關鍵字出錯

資料匹配出錯

UA頭重複使用次數過多

(2)排錯,從Spoder opened開始查詢,爬取到的資訊、warn、error

 

(2)allowed_domains,允許爬取範圍www.baidu.com; Request裡的meta引數是一個字典用於傳遞引數,這裡可以帶表單資料,也可以帶代理如meta = {'proxy': 'xxx.xxxx.com:埠號'}