在Scrapy中使用爬蟲動態代理IP
阿新 • • 發佈:2018-12-17
本文介紹如何在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
- 在settings.py中配置下載中介軟體,程式碼如下:
# 配置下載中介軟體的連線資訊
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
'modetest.middlewares.IPPOOlS' : 125
}
- 在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" ]
- 建立下載中間檔案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)
- 在settings.py中配置下載中介軟體(合併了第三步的程式碼):
# 配置下載中介軟體的連線資訊
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
'modetest.uamid.Uamid': 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
}
#============================================
- 定義一個執行緒,定時從無憂代理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);
- 在您爬蟲的啟動類(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();