由於前程無憂上崗位投遞記錄只保留兩個月,想記錄下。
程式**放在github
對於怎麼獲取登陸後的頁面,有兩種思路使用賬號,密碼登陸,如果該**登陸系統簡單的話,沒有驗證碼啥的,有驗證碼的話,可以使用圖形識別庫
使用cookie繞過登陸頁面cookie:
cookie(複數形態cookies),中文名稱為「小型文字檔案」或「小甜餅」[1],指某些**為了辨別使用者身份而儲存在使用者本地終端(client side)上的資料(通常經過加密)。定義於rfc2109。是網景公司的前雇員盧·蒙特利在2023年3月的發明[2]。
因為http協議是無狀態的,即伺服器不知道使用者上一次做了什麼,這嚴重阻礙了互動式web應用程式的實現。在典型的網上購物場景中,使用者瀏覽了幾個頁面,買了一盒餅乾和兩瓶飲料。最後結帳時,由於http的無狀態性,不通過額外的手段,伺服器並不知道使用者到底買了什麼,所以cookie就是用來繞開http的無狀態性的「額外手段」之一。伺服器可以設定或讀取cookies中包含資訊,藉此維護使用者跟伺服器會話中的狀態。
by wikipedia
我打算寫的是小工具,為了方便起見直接用使用cookie的方式。
期間遇到的坑解析網頁
在寫程式的過程中,關於beautifulsoup, requests,urlopen幾個的作用有點糊塗,在這遍整理下
beautifulsoup官方解釋beautiful soup提供一些簡單的、python式的函式用來處理導航、搜尋、修改分析樹等功能。它是乙個工具箱,通過解析文件為使用者提供需要抓取的資料,因為簡單,所以不需要多少**就可以寫出乙個完整的應用程式。
beautiful soup自動將輸入文件轉換為unicode編碼,輸出文件轉換為utf-8編碼。你不需要考慮編碼方式,除非文件沒有指定乙個編碼方式,這時,beautiful soup就不能自動識別編碼方式了。然後,你僅僅需要說明一下原始編碼方式就可以了。
beautiful soup已成為和lxml、html6lib一樣出色的python直譯器,為使用者靈活地提供不同的解析策略或強勁的速度。
requests文件裡的解釋requests 是 python http 庫,
requests 允許你傳送的 http/1.1 請求,無需手工勞動。你不需要手動為 url 新增查詢字串,也不需要對 post 資料進行表單編碼。keep-alive 和 http 連線池的功能是 100% 自動化的,一切動力都來自於根植在requests 內部的 urllib3。
urlopen
urlopen是urllib(urllib提供了一系列用於操作url的功能)裡的乙個方法,執行urlopen方法之後,返回乙個response物件,返回資訊便儲存在這裡面
使用cookie繞過登陸
####cookie
可以使用抓包軟體來獲取cookie,mac端用charles,windows可以用fiddler,當然也可以直接用chrome的開發者工具1
4cookie =
s = requests.get(url, cookies = cookie) # 返回的是response 物件
s.encoding='gbk' # 由於51的網頁編碼是gbk,轉碼防止亂碼
page = s.text # 讀取伺服器響應的內容,requests獲得的是requests物件
不過需要注意,就算使用了會話,方法級別的引數也不會被跨請求保持。下面的例子只會和第乙個請求傳送 cookie ,而非第二個1
10> s = requests.session()
> r = s.get('', cookies=)
> print(r.text)
> # '}'
> r = s.get('')
> print(r.text)
> # '}'
後來,就直接在每個requests.get()裡加乙個cookie引數。糾結好久,就是為了requests.get()少寫乙個引數,太不值了。
cookiejar就是乙個cookie檔案,在其他語言中就是實現儲存cookie的包。
如果想只設定一遍的話可以使用scrapy框架,裡面有解決方案
requests.get()返回的是什麼1
11import requests
def ():
url = ""
page = requests.get(url)
# page.encoding = 'gbk'
print(page)
get_current_info()
[finished in 0.4s]
headers設定
很多**禁止了類似python的爬蟲,所以需要模擬瀏覽器瀏覽,有的**更是需要登陸才能瀏覽。
模擬瀏覽器主要是增加乙個headers,在chrome瀏覽器上按下f12,就可以看到如下的headers資訊。
假設不自己加入headers資訊中的user-agent。python**登入時會預設使用user-agent: python-urllib/3.4
一般要加入的headers資訊有:1'host': '', 'accept': '', 'user-agent': '', 'accept-language': '', accept-encoding正則獲取
要獲取的是職位,薪資,公司名,地點。網頁結構如下:
起初寫的正則是1reg = re.compile(r'class="li l1">.*? target="_blank" title="(.*?)" ',re.s)
圓括號分組匹配使得findall返回元組,元組中,幾對圓括號就有幾個元素,保留空匹配。
但是每次都是返回空列表。
然後刪掉就可以匹配了不刪掉,返回的是空,還有程式執行的時間特別長,意味著程式沒找到相應的字元為什麼會找不到
惰性思維,一遇到問題就想著搜尋,網上有沒有現成的解決方法,卻不去自動思考下,嘗試去解決問題。後來想到通過列印的方法,是因為在網上找不到相應的解決方法,沒辦法,只能自己解決了。
列印出來發現1'rn ' # rn是回車換行符unix系統裡,每行結尾只有」」,即」n」;windows系統裡面,每行結尾是」」,即」rn」;mac系統裡,每行結尾是」」。乙個直接後果是,unix/mac系統下的檔案在windows裡開啟的話,所有文字會變成一行;而windows裡的檔案在unix/mac下開啟的話,在每行的結尾可能會多出乙個^m符號。
正則匹配錯誤 expected string or bytes-like object是為什麼
正則是用來匹配字串的
如果你用來匹配其它物件,如整數就會出現上述錯誤
正規表示式修飾符 - 可選標誌
正規表示式可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為乙個可選的標誌。多個標誌可以通過按位 or(|) 它們來指定。
re.s 使 . 匹配包括換行在內的所有字元
re.m、re.multiline
^和$分別匹配目標字串中行的起始和結尾,而不是嚴格匹配整個字串本身的起始 和結尾
re.s、rer.dotall
「.」(點號)通常匹配除了n(換行符)之外的所有單個字元;該標記表示「.」(點號) 能夠匹配全部字元
匹配包括換行符在內的任意字元,以下為正確的正規表示式匹配規則:
([ss]*)
同時,也可以用 「([dd]*)」、「([ww]*)」 來表示。
經驗教訓碰到需要自己寫程式解決問題時,可以完成任務為目的,不過過程怎麼,首先得把程式寫出來,至於優化,完美,效率這些問題可以在寫完之後在重構,查資料完善它。不然會陷入時間黑洞,背離初衷。
其實也和自己掌握的知識比較淺,有種坐井觀天的感覺,只能窺一斑但不能見全貌。知識的系統性,然後經驗也很重要,多讀多寫。
解決問題的步驟確定問題,我的問題是什麼?
什麼導致了這個問題,為什麼會產生這個問題?
怎麼解決問題?
詢問有經驗的人
一切無果後,先歸檔,然後問問自己有沒有別的解決方案
解決後,反思是缺少知識,還是粗心考慮不周等原因,缺啥補啥。
如果知識點問題,記下筆記,防止下次遇坑。經驗就是這麼來的
其中要注意的點,是要給尋找答案的過程中,設立時間盒,比如規定半小時內解決,如果解決不了先放一放,不然會成為時間黑洞,時間一下子就全耗進去了
python爬蟲 使用cookie登入豆瓣
64位win10系統,同時裝python2.7和python3.6兩個版本 本次使用python3.6 ide為pycharm,瀏覽器為chorme,使用的python第三方庫為requests 首先登陸豆瓣首頁,並且登入賬戶 注意練習爬蟲時最好用小號 右鍵檢查,點選network,然後按fn f5...
python 爬蟲 登入知乎
pytho3.4 requests.get request.post requests.session 1 通過瀏覽器f12開發者工具,找到登入時提交的表單以及請求的url 注意請求的url不是瀏覽器網域名稱框的url 因為知乎改了,現在不需要驗證碼了,所以中少了驗證碼的引數,不過 裡是有的 2 設...
python爬蟲登入豆瓣(一)
使用 第三方庫 requests 通過使用 chrome 瀏覽器抓包,可以得到這個請求,將其中的 headers 和 data 提交。最後輸出到 douban.html 的檔案中,即可檢視登入的介面。這次請求是第一次登入,所有介面為提示修改個人資訊。將賬號和密碼改為自己的帳號和密碼 data hos...