Scrapy作爲一個優秀的爬蟲框架,儘管其體系已相當成熟,但實際操作中其實還是需要藉助其他插件的力量來完成某些網站的爬取工作,今天記錄一下博主爬蟲路上的一些坑及解決方案,避免大家走太多彎路。
一、DEBUG: Filtered duplicate request: GET xxx - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
對網站全站爬取數據時,遇到了這個報錯。
Scrapy
會對request
的URL去重(RFPDupeFilter),需要在scrapy.Request
方法中傳遞多一個參數,dont_filter=True
。
# 示例
yield scrapy.Request(url=self.urlList[self.urlIndex], callback=self.parse, dont_filter=True)
二、多個爬蟲集成selenium
如果你看過我上一篇Scrapy博文,就知道我是如何將selenium
集成到Scrapy
中。
其實,正確的做法,是需要將ChromeDriver
的配置,轉移到middlewares
中,不然如果按照我上一篇博文那麼去寫,將其配置寫在具體的各個蜘蛛裏的話,先是會導致代碼冗餘,關鍵是還會導致啓動一個蜘蛛的時候,會啓動多個ChromeDriver
。
三、關於ChromeDriver的配置細則
直接上代碼:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless") # 無頭(靜默)模式
chrome_options.add_argument("--disable-gpu") # 禁用GPU加速
chrome_options.add_experimental_option('prefs', {
"profile.managed_default_content_settings.images": 2}) # 非headless模式下不加載圖片
chrome_options.add_argument('blink-settings=imagesEnabled=false') # headless模式下不加載圖片
driver = webdriver.Chrome(chrome_options=chrome_options)
# 瀏覽器靜默模式下,最大化窗口是無效的 driver.maximize_window()
driver.set_window_size(1920, 1080) # 設置瀏覽器窗口大小
某些網站對不同的分辨率所展示的內容不一,所以最好在同一的分辨率下去抓取網頁,設置driver
瀏覽器窗口的方法有兩個driver.maximize_window()
和driver.set_window_size(1920, 1080)
,需要注意的是maximize_window
在headless
模式下無效,所以推薦使用set_window_size
。
四、反爬蟲進階
往往某些網站,會配置反爬蟲機制,諸如換USER_AGENTS換IP這些已經爛大街的操作我在這裏就不提及了。
使用過selenium
爬蟲的人,都知道其實就算使用了模擬瀏覽器去訪問某些網站,還是會被認定爲爬蟲做驗證碼攔截,而往往這個時候,你就算人工去做驗證操作,網頁往往還是一動不動,爲什麼?這裏先推薦一個B站的視頻給大家稍微科普一下。
被攔截的示例如下:
這是因爲你所啓動的瀏覽器,仍有太多你看不見的爬蟲特徵。這裏給大家推薦一個冷門的插件selenium-stealth,這款插件可以集成selenium
抹去ChromeDriver
上的蜘蛛痕跡。
至於插件的原理,建議感興趣的再自行研究stealth.min.js
這個東西。
示例使用代碼如下:
from selenium_stealth import stealth
chrome_options = Options()
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(chrome_options=chrome_options)
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
可以結合上邊的代碼添加Options配置。
順帶提一點,使用headless
模式跟stealth
插件後,會導致ajax
異步加載數據的網站,load不出來數據,原因不詳,建議爬取這種網站的時候,如果該網站沒有什麼驗證,可以將stealth
關閉,或者關閉無頭模式爬取。
五、繞過CloudFlare
相信大家做爬蟲的,對五秒盾CloudFlare
並不陌生,至於如何去繞過五秒盾的檢測,推薦大夥一個插件cloudflare-scrape,專門用於繞過CloudFlare
。
實際操作流程請自行查看文檔,可以拿這個網站練練手wallhere。
不過實際操作中,有些網站就算用了這個插件也繞不過,比如博主想要爬取的網站就繞不過五秒盾,作爲爬蟲菜雞,博主也不深究當場放棄(其他繞行方式不會)。
總結
這個世界上奇葩的網站多得是,遇到過令人作嘔的商品具有六種格式的價格形式的;也遇到過網站禁用了js,用不了xpath
的;還遇到過無限滾動加載,一個頁面幾千個DOM導致ChromeDriver
假死的…
不扯淡了,路還很長,Keep learning…