--- tags: web crawler --- # 爬蟲2 ## ssl憑證 雖然查了一下似乎用 `request` 不會遇到這樣的問題,不過還是寫一下以備不時之需 ```python= import ssl ssl._create_default_https_context = ssl._create_unverified_context ``` ## header 可能你之後開始爬蟲之後就會發現,ㄟ奇怪,為什麼這個網站就是不上我爬。因為網站可以很輕易的知道你是爬蟲,所以就直接把你檔掉了,那這時候我們要怎麼辦呢。我們就會需要用到`header` `header`其實很容易就可以看到,你可以打開`google chrome`,按下`ctrl+shift+i`然後到`network`的地方,重新整理頁面後隨便點一個地方,就可以看到了。 最樸素的作法就是我們可以直接把它轉成`dic` ```python myhead = { "User-Agent" : ..., "Cookie" : ..., "keep-alive": ... }; html = requests.get( URL, headers=myhead) ``` 但這樣好麻煩喔 :poop: ,我們有沒有快一點的作法,答案是有!!有人幫我們寫好了一個庫可以輕鬆的調用了。 它教**fake_useragent** ```python= from fake_useragent import UserAgent ua = UserAgent() myhaed = { "User-Agent": ua.random, "Cookie": ... }; ``` 等等,為什麼你`cookie`的地方還是空著的?我們來講他是什麼吧 ## 登入(cookie) 這邊簡單說明一下,如果你曾經用過網路 :poop: 你會發現有時後並不需要每一次都重新登錄,為什麼呢?原因是因為瀏覽器幫你把登入資訊存下來了(cookie),但也不是存密碼,是存一個神奇的東西叫做`cookie`,你登入的網站他們那邊也會存一個,所以你們只要比對成功就可以順利登入了。 我們便可以利用這一個特點來上`request`有登錄功能。 如果你必想要寫那麼多`code`的話,你可以先登入,然後一樣打開`ctrl+shift+i`到`network`,找到`header`的地方找cookie,後面就直接貼上就可以了。這樣做會比較輕鬆一點,就不用一直改`cookie`就可以直接登錄了,需要注意的是因為網站的儲存不是無限的,所以通常過了一定的時間就需要重新登錄,所以有時候你可能也須要一直登錄 第二種作法是你可以每次都重新登錄一次,不過這樣頗麻煩就是了。因為我是一個富有好奇心了人,我特別去研究了如何作到這件事情,因為通常`requests`是不能連續使用的,變成你即使登錄了也不知道怎麼用,所以我們就來看一個新語法 ## dandanjudge ```python= import requests as req from fake_useragent import UserAgent ua = UserAgent() headers = { "User-Agent": ua.random, "Cookie": "JSESSIONID=06FCA063D47171B49A6DF87B52E0F342" } result = req.get("https://dandanjudge.fdhs.tyc.edu.tw/Solution.json?data=Code&solutionid=200564&_=1680067551949", headers=headers) print(result.text) ``` ### requests.seesion 簡單來講它就是讓它可以連續?有點像之前每次都需要開一個新的分頁(沒有保留任何資料的那種,可能像無痕),但現在就一直用同一個頁面到不同的地方 ```python= sen_req = requests.session(); sen_req.post( LOGIN_URL, data=LOGIN_DATA, headers=myhead) DataAfterLogin = sen_req.get( URL ) ``` 但需要注意的是,如果你短時間登入太多次的話,很有可能會被封鎖 :poop: 我就有被封鎖過。 所以兩種方法其實可以混用?在你一開始測試的時候手動登入,然後確認程式碼完全沒有問題之後在改用session登入,這樣就可以讓其他人可以方便的使用你的程式了。 ## dandanjudge ```python= import requests as req from fake_useragent import UserAgent ua = UserAgent() headers = { "User-Agent": ua.random, } #psw = input() #acc = input() mydata = { "account":input(), "passwd": input(), "returnPage": "/Index", "token": "" } sen_req = req.session() login = sen_req.post("https://dandanjudge.fdhs.tyc.edu.tw/Login", headers=headers, data=mydata) print(login) result = sen_req.get("https://dandanjudge.fdhs.tyc.edu.tw/Solution.json?data=Code&solutionid=200564&_=1680067551949", headers=headers) print(result.text) ``` ## 注意 這邊必須提醒一下 ***Cookie不能隨便外傳*** ,如果有不懷好意的人拿到它的話,你的個資什麼的都有可能會被洩漏,這邊有一個範例? <iframe width="560" height="315" src="https://www.youtube.com/embed/CB7m8-VMKzw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> 雖然它很快就搶回來就是了,不過這邊也可以看到,這個是真的很容易就會洩漏,如果沒有好好隱藏的話是真的會出事的。