在日常爬蟲工作中,需要先進行賬號登陸才能爬取的網站不少,很多時候,在沒有登錄的情況下,我們可以訪問一部分頁面或請求一些接口,因爲畢竟網站本身需要做SEO,不會對所有頁面都設置登錄限制。但是,不登錄直接爬取會有一些弊端,弊端主要有以下兩點。
- 設置了登錄限制的頁面無法爬取。
2.一些頁面和接口雖然可以直接請求,但是請求一旦頻繁,訪問就容易被限制或者IP直接被封,,登陸後就好爬取了。
所以這種情況下我們爬蟲程序就需要要搭建cookies池,與IP代理池不同,Cookies池具有針對性,如果你爬微博就要構建一個微博cookies池,爬知乎就需要構建一個知乎cookies池;而IP代理池是通用的,可供不同的爬蟲任務共同使用。
本文我們以知乎來實現一個Cookies池的搭建過程。Cookies池中保存了許多知乎賬號和登錄後的Cookies信息,並且Cookies池還需要定時檢測每個Cookies的有效性,如果某Cookies無效,那就刪除該Cookies並模擬登錄生成新的Cookies。同時Cookies池還需要一個非常重要的接口,即獲取隨機Cookies的接口,Cookies運行後,我們只需請求該接口,即可隨機獲得一個Cookies並用其爬取。cookie池的實現如下:
# Redis數據庫地址、端口、密碼
REDIS_HOST = "localhost" # 注意本地就寫字符串形式的"localhost"
REDIS_PORT = 6379
REDIS_PASSWORD = None # 密碼沒有的話,就寫None
# 產生器使用的瀏覽器
BROSER_TYPE = "chrome" # 注意瀏覽器類型,是字符串形式的
# 產生器類,如擴展其他站點,請在此配置
GENERATOR_MAP = { # 注意字典後的類名也是字符串形式的
"https://www.zhihu.com/follow",
"zhihu":"ZhihuCookiesGenerator"
}
# 測試類,如擴展其他站點,請在此配置
TESTER_MAP ={
"weibo": "zhihuValidTester",
"zhihu": "zhihuValidTester"
# 'XXX':'XXXCookiesGenerator'
}
TESTER_URL_MAP = {
'weibo': 'www.zhihu.com/follow',
'zhihu': 'www.zhihu.com/follow'
}
# 產生器和驗證器循環週期
CYCLE = 120
# API地址和端口
API_HOST = '127.0.0.1' # host是字符串
API_PORT = 5000 # port不是字符串
# 產生器開關,模擬登錄添加Cookies
GENERATOR_PROCESS = True
# 驗證器開關,循環檢測數據庫中Cookies是否可用,不可用刪除
TESTER_PROCESS = True
# API接口服務
API_PROCESS = True
代理池的使用是做爬蟲的基礎技術,現在的爬蟲代理有api提取和隧道轉發2種方式,這裏給大家分享下隧道轉發的,供大家參考,代碼示例由億牛雲爬蟲代理專業提供:
#! -*- encoding:utf-8 -*-
import requests
import random
# 要訪問的目標頁面
targetUrl = "www.zhihu.com/follow"
# 要訪問的目標HTTPS頁面
# targetUrl = "www.zhihu.com/follow"
# 代理服務器(產品官網 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理驗證信息
proxyUser = "ERWERE"
proxyPass = "897857"
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host" : proxyHost,
"port" : proxyPort,
"user" : proxyUser,
"pass" : proxyPass,
}
# 設置 http和https訪問都是用HTTP代理
proxies = {
"http" : proxyMeta,
"https" : proxyMeta,
}
# 設置IP切換頭
tunnel = random.randint(1,10000)
headers = {"Proxy-Tunnel": str(tunnel)}
resp = requests.get(targetUrl, proxies=proxies, headers=headers)
print resp.status_code
print resp.text