python+selenium使用

有時候遇到這種情況学辱,每個請求里面有cookies和header,但是抓包怎么也抓不到是怎么來的棍郎,用 scrapy和requests都不能執(zhí)行js晒骇,只能是爬取靜態(tài)的頁面锋八。利用scrapy-splash雖然可以爬取動態(tài)的頁面挂捅,但是自己必須起一個服務(wù)來跑scrapy-splash芹助。這個時候覺得還是采用selenium,selenium支持chrome和firefox等闲先。

    def __init__(self):
        chrome_options = Options()
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--hide-scrollbars')
        # 不顯示瀏覽器窗口
        # chrome_options.add_argument('--headless')
        self.browser = webdriver.Chrome(executable_path='/opt/webdriver/chrome/chromedriver',
                                        chrome_options=chrome_options)
        self.browser.set_page_load_timeout(30)

    # 重寫start_requests方法
    def start_requests(self):
        cookies = self.convert_cookies(self.get_cookies())
        for form_data in self.form_data_list:
            yield scrapy.FormRequest(self.start_url, method="POST", cookies=cookies, formdata=form_data,
                                     dont_filter=True)
        pass

    # 通過webdriver獲取cookies
    def get_cookies(self):
        self.browser.get(self.cookies_url)
        cookies = []
        try:
            WebDriverWait(self.browser, 100).until(
                expected_conditions.element_to_be_clickable((By.XPATH, "http://a[@class='searchbutton']")))
            cookies = self.browser.get_cookies()
        except Exception as e:
            self.logger.info("獲取cookies出錯")

        finally:
            # 關(guān)閉瀏覽器
            self.browser.quit()
        return cookies

    def convert_cookies(self, cookies):
        newcookies = {}
        for cookie in cookies:
            newcookies[cookie['name']] = cookie['value']
        return newcookies

    # 表單數(shù)據(jù)轉(zhuǎn)化為dict
    def fromData2Dict(self, formData):
        # urlencode會把空格轉(zhuǎn)化為+状土,此處做個轉(zhuǎn)換
        params = urllib.parse.unquote(formData).replace('+', ' ').split("&")
        nums = len(params)
        form_data = {}
        for i in range(0, nums):
            param = params[i].split("=", 1)
            key = param[0]
            value = param[1]
            form_data[key] = value
        return form_data

設(shè)置無頭模式,不顯示窗口(遇到問題:導(dǎo)致尋找不到頁面元素)

chrome_options.add_argument('--headless')

關(guān)閉沙盒:

options.add_argument('--no-sandbox')

遇到了的問題匯總:
1.在mac環(huán)境運行的好好的,在Linux環(huán)境一直報錯伺糠,DevToolsActivePort文件找不到蒙谓,參考了很多國外國內(nèi)的博客都寫的禁用沙箱然并卵。
比如:

chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-setuid-sandbox')
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  (Driver info: chromedriver=2.45.615279 (12b89733300bd268cff3b78fc76cb8f3a7cc44e5),platform=Linux 3.10.0-327.el7.x86_64 x86_64)

增加了無頭模式雖然可以跑训桶,但是無法找到頁面元素

2019-01-08 16:43:00 [selenium.webdriver.remote.remote_connection] DEBUG: Finished Request
[2019-01-08 16:43:00] 140734813173184 POST http://127.0.0.1:56931/session/cd22b1e86a32e3f65f5b2fb0a0795a49/element {"using": "xpath", "value": "http://a[@class='searchbutton']", "sessionId": "cd22b1e86a32e3f65f5b2fb0a0795a49"}
2019-01-08 16:43:00 [selenium.webdriver.remote.remote_connection] DEBUG: POST http://127.0.0.1:56931/session/cd22b1e86a32e3f65f5b2fb0a0795a49/element {"using": "xpath", "value": "http://a[@class='searchbutton']", "sessionId": "cd22b1e86a32e3f65f5b2fb0a0795a49"}
[2019-01-08 16:43:00] 140734813173184 http://127.0.0.1:56931 "POST /session/cd22b1e86a32e3f65f5b2fb0a0795a49/element HTTP/1.1" 200 358
2019-01-08 16:43:00 [urllib3.connectionpool] DEBUG: http://127.0.0.1:56931 "POST /session/cd22b1e86a32e3f65f5b2fb0a0795a49/element HTTP/1.1" 200 358

在看別人博客發(fā)現(xiàn)linux服務(wù)器是無界面的累驮,知道了xvfb這個概念:Xvfb在內(nèi)存中執(zhí)行所有的圖形操作,不需要借助任何顯示設(shè)備舵揭。就嘗試安裝一下看看是否能解決問題:

yum install Xvfb

還是一如既往的報錯谤专,決定降低chrome版本試試,看了下linux版本信息:

[root@localhost google]# uname -a
Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

我卸載了當(dāng)前的goole-chrome(版本信息:google-chrome-stable-71.0.3578.98),重新安裝了google-chrome(版本信息:google-chrome-stable-62.0.3202.94)午绳。chromedriver版本從2.45.615279改為了2.33.506092置侍。
最后還是報錯了:

File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.33.506092 (733a02544d189eeb751fe0d7ddca79a0ee28cce4),platform=Linux 3.10.0-327.el7.x86_64 x86_64)

不過,和以前的錯誤不一樣拦焚,感覺離成功更近了一步蜡坊。
查找資料安裝pyvirtualdisplay:

pip install pyvirtualdisplay

在代碼中使用:

from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 800))  
display.start()
driver = webdriver.Chrome()

功夫不負(fù)有心人代碼完美運行。
2.scrapy定義初始化方法赎败,本地python 3.7環(huán)境直接定義__init__(self)格式秕衙,但是Linux python 3.6的環(huán)境卻報錯,按理說使用的scrapy版本都是3.5.1僵刮。linux python 3.6的寫法:

def __init__(self, *args, **kwargs):
        super(SpdSpider, self).__init__(*args, **kwargs)

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灾梦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妓笙,更是在濱河造成了極大的恐慌若河,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寞宫,死亡現(xiàn)場離奇詭異萧福,居然都是意外死亡,警方通過查閱死者的電腦和手機辈赋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門鲫忍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膏燕,“玉大人,你說我怎么就攤上這事悟民“颖瑁” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵射亏,是天一觀的道長近忙。 經(jīng)常有香客問我,道長智润,這世上最難降的妖魔是什么及舍? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮窟绷,結(jié)果婚禮上锯玛,老公的妹妹穿的比我還像新娘膀跌。我一直安慰自己椅棺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布睁壁。 她就那樣靜靜地躺著为狸,像睡著了一般歼郭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钥平,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天实撒,我揣著相機與錄音姊途,去河邊找鬼涉瘾。 笑死,一個胖子當(dāng)著我的面吹牛捷兰,可吹牛的內(nèi)容都是我干的立叛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼贡茅,長吁一口氣:“原來是場噩夢啊……” “哼秘蛇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顶考,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赁还,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驹沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艘策,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年渊季,在試婚紗的時候發(fā)現(xiàn)自己被綠了朋蔫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罚渐。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驯妄,靈堂內(nèi)的尸體忽然破棺而出荷并,到底是詐尸還是另有隱情,我是刑警寧澤青扔,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布源织,位于F島的核電站,受9級特大地震影響赎懦,放射性物質(zhì)發(fā)生泄漏雀鹃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一励两、第九天 我趴在偏房一處隱蔽的房頂上張望黎茎。 院中可真熱鬧,春花似錦当悔、人聲如沸傅瞻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗅骄。三九已至,卻和暖如春饼疙,著一層夾襖步出監(jiān)牢的瞬間溺森,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工窑眯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屏积,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓磅甩,卻偏偏與公主長得像炊林,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卷要,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • selenium是什么:一個自動化測試工具(大家都是這么說的) selenium應(yīng)用場景:用代碼的方式去模擬瀏覽器...
    Philosopher_閱讀 9,747評論 0 8
  • 啾啾 啾啾渣聚, 清脆的鳥鳴, 喚醒沉睡的大地僧叉。 迎接黎明到來 采一縷晨光入室奕枝, 向世界道一聲 早安! 向自己五十歲的...
    郭建芬閱讀 394評論 1 1
  • 別怪罪迷惘瓶堕, 接受大量被劇透的真相隘道。 護士的手掌, 給不了生命原來的模樣。 也別慌張薄声。 啼哭当船, 本就理所應(yīng)當(dāng)。 ???
    濁凡_dc98閱讀 258評論 1 2
  • 答案很長默辨, 我準(zhǔn)備用一生來回答德频, 你準(zhǔn)備要聽了嗎?
    更好時代閱讀 227評論 0 0