---
# System prepended metadata

title: 爬蟲2
tags: [web crawler]

---

---
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>

雖然它很快就搶回來就是了，不過這邊也可以看到，這個是真的很容易就會洩漏，如果沒有好好隱藏的話是真的會出事的。