Scrapy 框架 (學習筆記-1)

wsAdmin發表於2019-08-17
1.windows 10
2.Python 3.7
3.Scrapy 1.7.3
4.mysql 5.5.53
1. Scrapy:是一套基於Twisted的一部處理框架,是純Python實現的爬蟲框架,使用者只需要定製開發幾個模組就可以輕鬆的實現一個爬蟲,用來抓取網頁內容或者各種圖片。
1. 安裝命令:pip install scrapy
2. 檢視是否安裝成功,命令: scrapy
1. 抓取豆瓣電影('https://movie.douban.com/top250')Top250資料,並將資料儲存為csv,json和儲存到資料庫中
2. 一個完整專案基本包括:新建專案、明確目標、製作爬蟲、儲存內容四個步驟。

(一)、新建專案

1. 建立專案
    命令: scrapy startproject [專案名稱]     例:scrapy startproject Douban
    專案目錄結構:
        # Douban
            # Douban
                # spiders
                    # __init__.py
                # __init__.py
                # items.py
                # middlewares.py
                # pipelines.py    
                # settings.py
            # scrapy.cfg
2.建立爬蟲 
    在spiders下執行命令: scrapy genspider [爬蟲名] [待爬取網站的域名]    例:scrapy genspider douban_top250 movie.douban.com (此時spiders目錄下會生成一個'douban_top250.py'爬蟲檔案)

==注意:爬蟲名稱不能與專案名稱重複==

(二)、明確目標

1. 明確要抓取哪些資料,並在 items.py 檔案中進行定義.
    例:
        import scrapy

        class DoubanItem(scrapy.Item):
            # define the fields for your item here like:
            # name = scrapy.Field()

            # 序號
            serial_num = scrapy.Field()
            # 電影名稱
            movie_name = scrapy.Field()
            # 電影介紹
            introduce = scrapy.Field()
            # 電影評論數
            evaluate_num = scrapy.Field()
            # 電影描述
            describe = scrapy.Field()
            # 電影星級
            star = scrapy.Field()

(三)、製作爬蟲

1.開啟爬蟲檔案(douban_top250.py)
    # -*- coding: utf-8 -*-
    import scrapy

    class DoubanTop250Spider(scrapy.Spider):
        # 爬蟲名稱
        name = 'douban_top250'
        # 允許的域名
        allowed_domains = ['movie.douban.com']
        # 入口URL
        start_urls = ['https://movie.douban.com/top250']

        def parse(self, response):
            pass
2.在settings.py檔案中開啟 'USER_AGENT' 並設定為正確的代理
3.輸出爬取的資訊
例:
    def parse(self, response):
        print(response.text)
4.執行爬蟲執行命令: scrapy crawl [爬蟲名稱]   例: scrapy crawl douban_top250

==注意:必須在spiders資料夾下執行scrapy crawl命令==

5.解析爬取的網頁資料,例:
# -*- coding: utf-8 -*-
import scrapy
from Douban.items import DoubanItem
class DoubanTop250Spider(scrapy.Spider):
    # 爬蟲名稱
    name = 'douban_top250'
    # 允許的域名
    allowed_domains = ['movie.douban.com']
    # 入口URL
    start_urls = ['https://movie.douban.com/top250']

    # 預設的解析方法
    def parse(self, response):
        # 匯入item檔案,例項物件
        res = DoubanItem()
        # 書寫詳細的xpath語句對資料進行解析
        # 獲取第一頁的所有電影
        movie_list = response.xpath('//div[@class="article"]/ol[@class="grid_view"]/li')
        # 迴圈獲得的電影
        for movie in movie_list:
            # 獲取電影序號
            res['serial_num'] = movie.xpath('.//div[@class="item"]/div[@class="pic"]/em/text()').extract_first()
            # 獲取電影名稱
            titles = movie.xpath('.//div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span/text()').extract()
            movie_name = ''
            for title in titles:
                movie_name = movie_name + "".join(title.split())
            res['movie_name'] = movie_name
            # 獲取電影介紹
            res['introduce'] = "".join(movie.xpath('.//div[@class="bd"]/p/text()').extract_first().split())
            # 獲取電影評論數
            res['evaluate_num'] = movie.xpath('.//div[@class="star"]/span[4]/text()').extract_first()
            # 獲取電影描述
            res['describe'] = movie.xpath('.//div[@class="bd"]/p[@class="quote"]/span/text()').extract_first()
            # 獲取電影的評分
            res['score'] = movie.xpath('.//div[@class="star"]/span[2]/text()').extract_first()
            # 將結果提交至管道pipelines裡面,進行資料的清洗以及儲存
            yield res
        # 解析下一頁規則
        string = response.xpath('.//span[@class="next"]/a/@href').extract_first()
        if string :
            href = self.start_urls[0] + string
            yield scrapy.Request(href,callback=self.parse)

(四)、儲存內容

1、將資料儲存為json、csv檔案

    命令:scrapy crawl [爬蟲名稱] -o [儲存檔名]
    例:
        1. scrapy crawl douban_top250 -o douban1.json
        2. scrapy crawl douban_top250 -o douban2.csv

2、將資料儲存至資料庫中

    1. 建立mysql資料庫及相關表
    2. 在settings.py檔案中開啟 EXTENSIONS 設定
    3. 在pipelines.py檔案中匯入pymysql模組
    4. pipelines.py檔案中類的命名是建立專案時自動生成的,一般為: [專案名稱]Pipeline
    5. 在類中process_item方法內進行儲存資料操作
    例:
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html

# 匯入pymysql模組
import pymysql

class DoubanPipeline(object):

    # 初始化相關屬性
    def __init__(self):
        # 連線database
        try:
            self.conn = pymysql.connect(
                host="127.0.0.1",  # 資料庫IP地址
                port=3306,  # 埠號
                db="python_movie",  # 資料庫名稱
                user="root",  # 使用者名稱
                password="root",  # 密碼
                charset="utf8",  # 編碼格式
                use_unicode=True,  # 指定字元的編碼、解碼格式
                cursorclass=pymysql.cursors.DictCursor,  # 資料返回格式
            )
            # 得到一個可以執行SQL語句的游標物件
            self.cursor = self.conn.cursor()
        except Exception as e:
            print(e)

    # 開啟爬蟲時執行,只執行一次
    def open_spider(self,spider):
        pass

    # 處理提取的資料(儲存資料)
    def process_item(self, item, spider):
        sql = "INSERT INTO movie (serial,`name`,introduce,evaluate,`describe`,score) VALUES (%s,%s,%s,%s,%s,%s)"
        # 執行sql語句
        try:
            self.cursor.execute(sql, tuple(item.values()))
            self.conn.commit()
        except Exception as e:
            print(e)

    # 關閉爬蟲時執行,只執行一次。 (如果爬蟲中間發生異常導致崩潰,close_spider可能也不會執行)
    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()

(五)、下載中介軟體編寫

1. 設定代理IP

1.在middlewares.py檔案中編寫
2.建立一個類,繼承 object,在此類中編寫代理IP
3.在類中建立方法
def process_request(self,request,spider):
        pass
注意:這個方法名稱是固定預設的,
4.在process_request方法中設定request中的meta屬性中的prproxy引數,引數值為自己的代理伺服器與埠號
request.meta['proxy'] = '[IP地址/域名]:[埠號 ]'
5.在process_request方法中設定代理的使用者名稱與密碼,固定格式為:
proxy_name_pass = '[使用者名稱]:[密碼]'
注意:使用者名稱與密碼中間用':'號分割
6.需要用base64.b64encode()對使用者名稱與密碼進行加密,而且base64.b64encode()只接受bytes格式的字串,故:
proxy_name_pass = base64.b64encode(b'[使用者名稱]:[密碼]')
7.設定http請求頭
request.headers['Proxy-Authorization'] = 'Basic ' + proxy_name_pass.decode()
8.將代理中間新增至settings.py中的 DOWNLOADER_MIDDLEWARES 中進行註冊
例:
在 middlewares.py 中編寫中介軟體
class my_proxy(object):
    # 這個方法名 'process_request' 是固定的
    def process_request(self,request,spider):
        # 設定代理伺服器IP地址
        request.meta['proxy'] = "這裡寫代理IP:這裡寫埠號"
        # 設定代理伺服器賬號與密碼(注意賬號與密碼用 ':' 號分割,並且將字串變為bytes格式)
        proxy_name_pass = b"這裡寫賬號:這裡寫密碼"
        # 加密賬號與密碼
        encode_name_pass = base64.b64encode(proxy_name_pass)
        # 設定代理服務請求頭(注意:Basic後面必須加空格,而且加密後的賬號與密碼必須轉為字串格式才能拼接)
        request.headers['Proxy-Authorization'] = 'Basic ' + encode_name_pass.decode()
在 settings.py 中設定中介軟體
# 注意,後面的數字,表示中介軟體的優先順序,多箇中間價同時啟用時優先順序不可以相同
DOWNLOADER_MIDDLEWARES = {
   'Douban.middlewares.DoubanDownloaderMiddleware': 543,
   'Douban.middlewares.my_proxy': 544,
}

2.設定User-Agent

1.同上,在middlewares.py中建立一個類,在預設的process_request()方法中編寫中介軟體
2.同上,將編寫的中介軟體新增至settings.py中的 DOWNLOADER_MIDDLEWARES 中進行註冊
3.具體操作直接上程式碼:
例:
在 middlewares.py 中編寫中介軟體
# 設定代理IP中介軟體
class my_proxy(object):
    def process_request(self,request,spider):
        # 設定代理伺服器IP地址
        request.meta['proxy'] = "這裡寫代理IP:這裡寫埠號"
        # 設定代理伺服器賬號與密碼(注意賬號與密碼用 ':' 號分割,並且將字串變為bytes格式)
        proxy_name_pass = b"這裡寫賬號:這裡寫密碼"
        # 加密賬號與密碼
        encode_name_pass = base64.b64encode(proxy_name_pass)
        # 設定代理服務請求頭(注意:Basic後面必須加空格,而且加密後的賬號與密碼必須轉為字串格式才能拼接)
        request.headers['Proxy-Authorization'] = 'Basic ' + encode_name_pass.decode()

# 設定隨機User_Agent中介軟體
class my_user_agent(object):
    def process_request(self,request,spider):
        # 在網路上搜尋User_Agent列表
        USER_AGENT_LIST = [
             "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
             "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
             "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
             "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
             "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
             "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
             "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
             "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
             "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
             "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
             "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
             "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
             "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
             "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
        ]
        # 隨機獲取一個user_agent,而random.choice()函式,表示從序列中隨機選取一個元素
        user_agent = random.choice(USER_AGENT_LIST)
        # 設定Http請求頭中的User_Agent
        request.headers['User_Agent'] = user_agent
在 settings.py 中設定中介軟體
# 注意,後面的數字,表示中介軟體的優先順序,多箇中間價同時啟用時優先順序不可以相同
DOWNLOADER_MIDDLEWARES = {
   'Douban.middlewares.DoubanDownloaderMiddleware': 543,
   'Douban.middlewares.my_proxy': 544,
   'Douban.middlewares.my_user_agent': 545,
}

==注意:1.中介軟體定義編寫完成以後,一定要在settings.py檔案中的 DOWNLOADER_MIDDLEWARES = {} 中註冊中介軟體,表示啟用此中介軟體;2.爬蟲檔名和爬蟲名稱不能相同,spider目錄內不能存在相同爬蟲名稱的專案檔案==

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章