1. 程式人生 > >在Scrapy中使用爬蟲動態代理IP

在Scrapy中使用爬蟲動態代理IP

本文介紹如何在Scrapy中使用無憂代理(www.data5u.com)的爬蟲動態代理IP,以及如何設定User-Agent.

一、建立Scrapy工程 scrapy startproject 工程名

二、進入工程目錄,根據爬蟲模板生成爬蟲檔案 scrapy genspider -l # 檢視可用模板 scrapy genspider -t 模板名 爬蟲檔名 允許的域名

三、定義爬取關注的資料(items.py檔案) 四、編寫爬蟲檔案 五、設定IP池或使用者代理

IPPOOL = [ ]
# -*- coding: UTF-8 -*-
'''
Python 3.x
無憂代理IP Created on 2018年07月11日
描述:本段程式碼是Scrapy的代理中介軟體,用於設定代理IP
@author: www.data5u.com
'''
# 匯入隨機模組
import random
# 匯入data5u檔案中的IPPOOL
from data5u import IPPOOL
# 匯入官方文件對應的HttpProxyMiddleware
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware

class IPPOOlS(HttpProxyMiddleware):
  # 初始化
  def __init__(self, ip=''):
  self.ip = ip

  # 請求處理
  def process_request(self, request, spider):
  # 先隨機選擇一個IP
  thisip = random.choice(IPPOOL)
  print("當前使用IP是:"+ thisip)
  request.meta["proxy"] = "http://"+thisip
  1. 在settings.py中配置下載中介軟體,程式碼如下:
# 配置下載中介軟體的連線資訊
DOWNLOADER_MIDDLEWARES = {
   'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
  'modetest.middlewares.IPPOOlS' : 125    
}
  1. 在settings.py檔案中新增使用者UserAgent的資訊,如:
# 設定使用者代理池
UAPOOL= [
	"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]
  1. 建立下載中間檔案uamid.py(與settings.py同一個目錄),程式碼為:
# -*- coding: UTF-8 -*-
'''
Python 3.x
無憂代理IP Created on 2018年07月11日
描述:本段程式碼是Scrapy的下載中介軟體,用於模擬UserAgent
@author: www.data5u.com
'''
# 匯入隨機模組
import random
# 匯入settings檔案中的UAPOOL
from settings import UAPOOL
# 匯入官方文件對應的HttpProxyMiddleware
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

class Uamid(UserAgentMiddleware):
  # 初始化 注意一定要user_agent,不然容易報錯   
  def __init__(self, user_agent=''):
  self.user_agent = user_agent

  # 請求處理
  def process_request(self, request, spider):
    # 先隨機選擇一個使用者代理
    thisua = random.choice(UAPOOL)
    print("當前使用User-Agent是:"+thisua)
    request.headers.setdefault('User-Agent',thisua)
  1. 在settings.py中配置下載中介軟體(合併了第三步的程式碼):
# 配置下載中介軟體的連線資訊
DOWNLOADER_MIDDLEWARES = {
   'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
   'modetest.uamid.Uamid': 1    
}

  1. 整體的settings.py程式碼如下:
# -*- coding: UTF-8 -*-
'''
Python 3.x
無憂代理IP Created on 2018年07月11日
描述:本段程式碼是Scrapy的配置資訊
@author: www.data5u.com
'''

#========================================

# 設定IP池和使用者UserAgent

#  禁止本地Cookie
COOKIES_ENABLED = False

# 設定使用者代理池
UAPOOL = [
	"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", 
	"Mozilla/5.0 (Windows NT 10.0; Win64; x64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]

# 配置下載中介軟體的連線資訊
DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
    'modetest.middlewares.IPPOOlS' : 125,
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
    'modetest.uamid.Uamid': 1
}

#============================================
  1. 定義一個執行緒,定時從無憂代理API介面中獲取IP,存入data5u.py中的IPPOOL變數中,程式碼如下:
# -*- coding: UTF-8 -*-
'''
Python 3.x
無憂代理IP Created on 2018年07月11日
描述:本段程式碼定時從無憂代理API介面獲取代理IP,存入IP池中
@author: www.data5u.com
'''
import requests;
import time;
import threading;
from data5u import IPPOOL;
from requests.packages import urllib3;

# 獲取代理IP的執行緒類
class GetIpThread(threading.Thread):
    def __init__(self,apiUrl, fetchSecond):
        super(GetIpThread, self).__init__();
        self.fetchSecond=fetchSecond;
        self.apiUrl=apiUrl;
    def run(self):
        while True:
            # 獲取IP列表
            res = requests.get(self.apiUrl).content.decode()
            # 按照\n分割獲取到的IP
            IPPOOL = res.split('\n');
            # 休眠
            time.sleep(self.fetchSecond);
  1. 在您爬蟲的啟動類(if name == ‘main’:)裡面新增如下程式碼定時獲取代理IP:
# 這裡填寫無憂代理IP提供的API訂單號(請到使用者中心獲取)
    order = "請把這裡替換為您的IP提取碼";
    # 獲取IP的API介面
    apiUrl = "http://api.ip.data5u.com/dynamic/get.html?order=" + order;
    # 獲取IP時間間隔,建議為5秒
    fetchSecond = 5;
    # 開始自動獲取IP
    GetIpThread(apiUrl, fetchSecond).start();