博客 / 詳情

返回

【爬蟲開發】爬蟲開發從0到1全知識教程第14篇:scrapy爬蟲框架【附代碼文檔】

🏆🏆🏆教程全知識點簡介:1.Mongodb數據庫包括介紹、mongodb簡單使用(mongodb服務端啓動、啓動mongodb客户端進入mongo shell)。2. scrapy爬蟲框架涵蓋 ip使用、啓動爬蟲、停止爬蟲、scrapyd webapi。3. Gerapy包含通過Gerapy配置管理scrapy項目。4. appium移動端抓取涉及appium自動控制移動設備、appium-python-client模塊安裝、初始化獲取移動設備分辨率、定位元素提取文本方法、控制抖某音app滑動、自動滑動代碼整理。5. 爬蟲概述包括爬蟲概念、爬蟲基礎。6. http協議複習涵蓋http及https概念區別、爬蟲關注的請求頭響應頭、常見響應狀態碼、瀏覽器運行過程。7. requests模塊包含requests發送post請求、POST請求練習、requests.session狀態保持、課堂測試。8. 數據提取概述涉及響應內容分類、xml認識、html區別、常用數據解析方法。9. 數據提取-jsonpath模塊包括jsonpath模塊使用場景。10. 數據提取-lxml模塊涵蓋lxml模塊xpath語法、谷歌瀏覽器xpath helper插件安裝使用、xpath節點關係、xpath語法基礎節點選擇、xpath定位節點提取屬性文本內容語法、語法練習、lxml模塊安裝使用示例。11. Selenium 包含獲取當前標籤頁cookie信息、cookie轉化為字典、刪除cookie、頁面等待。12. 反爬與反反爬涵蓋常見反爬手段解決思路、服務器反爬原因、服務器反爬蟲類型、反爬蟲概念、反爬三個方向、基於身份識別反爬(session發送rKey獲取登錄信息、 加密、用户名 準備、js2py生成js執行環境)。

<!-- start:bj1 -->

📚📚倉庫code.zip 👉直接-->:   https://gitee.com/yinuo112/Backend/blob/master/爬蟲/爬蟲開發...    🍅🍅

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

scrapy爬蟲框架

介紹

知道常用的流程web框架有django、flask,那麼接下來, 會來學習一個全世界範圍最流行的爬蟲框架scrapy

內容

  • scrapy的概念作用和工作流程
  • scrapy的入門使用
  • scrapy構造併發送請求
  • scrapy模擬登陸
  • scrapy管道的使用
  • scrapy中間件的使用
  • scrapy_redis概念作用和流程
  • scrapy_redis原理分析並實現斷點續爬以及分佈式爬蟲
  • scrapy_splash組件的使用
  • scrapy的日誌信息與配置
  • scrapyd部署scrapy項目

scrapy官方文檔

https://scrapy-chs.readthedocs.io/zh_CN/0.24/index.html

scrapy中間件的使用

學習目標:
  1. 應用 scrapy中使用間件使用隨機UA的方法
  2. 應用 scrapy中使用ip的的方法
  3. 應用 scrapy與selenium配合使用

1. scrapy中間件的分類和作用

1.1 scrapy中間件的分類

根據scrapy運行流程中所在位置不同分為:

  1. 下載中間件
  2. 爬蟲中間件
1.2 scrapy中間的作用:預處理request和response對象
  1. 對header以及cookie進行更換和處理
  2. 使用ip等
  3. 對請求進行定製化操作,

但在scrapy默認的情況下 兩種中間件都在middlewares.py一個文件中

爬蟲中間件使用方法和下載中間件相同,且功能重複,通常使用下載中間件

2. 下載中間件的使用方法:

接下來 對騰訊招聘爬蟲進行修改完善,通過下載中間件來學習如何使用中間件 編寫一個Downloader Middlewares和 編寫一個pipeline一樣,定義一個類,然後在setting中開啓

Downloader Middlewares默認的方法:

  • process_request(self, request, spider):

    1. 當每個request通過下載中間件時,該方法被調用。
    2. 返回None值:沒有return也是返回None,該request對象傳遞給下載器,或通過引擎傳遞給其他權重低的process_request方法
    3. 返回Response對象:不再請求,把response返回給引擎
    4. 返回Request對象:把request對象通過引擎交給調度器,此時將不通過其他權重低的process_request方法
  • process_response(self, request, response, spider):

    1. 當下載器完成http請求,傳遞響應給引擎的時候調用
    2. 返回Resposne:通過引擎交給爬蟲處理或交給權重更低的其他下載中間件的process_response方法
    3. 返回Request對象:通過引擎交給調取器繼續請求,此時將不通過其他權重低的process_request方法
  • 在settings.py中配置開啓中間件,權重值越小越優先執行

3. 定義實現隨機User-Agent的下載中間件

3.1 在middlewares.py中完善代碼

lxml 文檔

import random
from Tencent.settings import USER_AGENTS_LIST # 注意導入路徑,請忽視pycharm的錯誤提示

class UserAgentMiddleware(object):
    def process_request(self, request, spider):
        user_agent = random.choice(USER_AGENTS_LIST)
        request.headers['User-Agent'] = user_agent
        # 不寫return

class CheckUA:
    def process_response(self,request,response,spider):
        print(request.headers['User-Agent'])
        return response # 不能少!
3.2 在settings中設置開啓自定義的下載中間件,設置方法同管道
DOWNLOADER_MIDDLEWARES = {
   'Tencent.middlewares.UserAgentMiddleware': 543, # 543是權重值
   'Tencent.middlewares.CheckUA': 600, # 先執行543權重的中間件,再執行600的中間件
}
3.3 在settings中添加UA的列表

paramiko 文檔

Bottle 文檔

USER_AGENTS_LIST = [
    "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"
]
運行爬蟲觀察現象

4. ip的使用

4.1 思路分析
  1. 添加的位置:request.meta中增加proxy字段
  2. 獲取一個ip,賦值給request.meta['proxy']

    • 池中隨機選擇ip
    • ip的webapi發送請求獲取一個ip
4.2 具體實現

免費ip:

class ProxyMiddleware(object):
    def process_request(self,request,spider):
        # proxies可以在settings.py中,也可以來源於ip的webapi
        # proxy = random.choice(proxies) 

        # 免費的會失效,報 111 connection refused 信息!重找一個ip再試
        proxy = 'https://1.71.188.37:3128' 

        request.meta['proxy'] = proxy
        return None # 可以不寫return

收費ip:

Automate the Boring Stuff

Scrapy-Redis 文檔

  
  
# 人民幣玩家的代碼(使用abuyun提供的ip)
  
  
import base64

  
  
# 隧道驗證信息  這個是在那個網站上申請的
  
  
proxyServer = 'http://proxy.abuyun.com:9010' # 收費的ip服務器地址,這裏是abuyun
proxyUser = 用户名
proxyPass =  
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)

class ProxyMiddleware(object):
    def process_request(self, request, spider):
        # 設置
        request.meta["proxy"] = proxyServer
        # 設置認證
        request.headers["Proxy-Authorization"] = proxyAuth
4.3 檢測ip是否可用

在使用了ip的情況下可以在下載中間件的process_response()方法中處理ip的使用情況,如果該ip不能使用可以替換其他ip

class ProxyMiddleware(object):
    ......
    def process_response(self, request, response, spider):
        if response.status != '200':
            request.dont_filter = True # 重新發送的請求對象能夠再次進入隊列
            return requst
在settings.py中開啓該中間件

5. 在中間件中使用selenium

以github登陸為例

openpyxl 文檔

5.1 完成爬蟲代碼
import scrapy

class Login4Spider(scrapy.Spider):
    name = 'login4'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/1596930226'] # 直接對驗證的url發送請求

    def parse(self, response):
        with open('check.html', 'w') as f:
            f.write(response.body.decode())
5.2 在middlewares.py中使用selenium

Scrapy 選擇器

import time
from selenium import webdriver


def getCookies():
    # 使用selenium模擬登陸,獲取並返回cookie
    username = input('輸入github賬號:')
    password = input('輸入github :')
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver',
                              chrome_options=options)
    driver.get('https://github.com/login')
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="login_field"]').send_keys(username)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="login"]/form/div[3]/input[3]').click()
    time.sleep(2)
    cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
    driver.quit()
    return cookies_dict
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.