---
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>
雖然它很快就搶回來就是了,不過這邊也可以看到,這個是真的很容易就會洩漏,如果沒有好好隱藏的話是真的會出事的。