- 尋找登陸需要的參數
__VIEWSTATE:aiMG0UXAfCzak10C7436ZC/RXoZbM2lDlX1iU/4wjjdUNsW8QU+s6W2/3M6XIKagQZrC7ooD8Upj8u+CnpQ+MXjDAp6fS/NM2nGhnKO0KOSXfT3jGHhJAOBouMI3Qnlp+JCQKPXfVDJPYwh169MGLFC6trY=
__VIEWSTATEGENERATOR: C93BE1AE
from: http://so.gushiwen.cn/user/collect.aspx
email: 賬號
pwd: 密碼
code: 驗證碼
denglu: 登錄
其中__VIEWSTATE,__VIEWSTATEGENERATOR和code是一個可以變化的量
- 獲取頁面源碼
import requests# 登陸界面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'headers = {'User-Agent': ''
}# 獲取頁面源碼
response = requests.get(url, headers=headers)
content = response.text
- 解析網頁源碼,獲取__VIEWSTATE和__VIEWSTATEGENERATOR的值
# 解析網頁源碼 獲取__VIEWSTATE和__VIEWSTATEGENERATOR
soup = BeautifulSoup(content, 'lxml')# 獲取__VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')# 獲取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
- 獲取驗證碼,這里使用的是session()方法
# 獲取驗證碼圖片
code_url = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code_url# session()方法 通過session的返回值,就能使請求變成一個對象
session = requests.session()
# 驗證碼url的內容
response_code = session.get(code_url)
# 這里要使用二進制數據,因為是要下載圖片
content_post = response_code.content
# wb是將二進制數據寫入到文件
with open('files/code.jpg', 'wb')as fp:fp.write(content_post)code = input('輸入驗證碼:')
- 登陸
# 登陸
data_post = {'__VIEWSTATE': viewstate,'__VIEWSTATEGENERATOR': viewstategenerator,'from': 'http://so.gushiwen.cn/user/collect.aspx','email': 賬號,'pwd': 密碼,'code': code,'denglu': '登錄'
}response_post = session.post(url, data=data_post, headers=headers)
content_post = response_post.text
# 保存到本地
with open('files/gushiwen.html', 'w', encoding='utf-8')as fp:fp.write(content_post)
完整代碼
import requests
from bs4 import BeautifulSoup
import chaojiying# 目標:通過登陸,進入到主界面# 登陸需要的參數
# __VIEWSTATE: aiMG0UXAfCzak10C7436ZC/RXoZbM2lDlX1iU/4wjjdUNsW8QU+s6W2/3M6XIKagQZrC7ooD8Upj8u+CnpQ+MXjDAp6fS/NM2nGhnKO0KOSXfT3jGHhJAOBouMI3Qnlp+JCQKPXfVDJPYwh169MGLFC6trY=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: 508785507@qq.com
# pwd: 20030904am
# code: e3lk
# denglu: 登錄
# 其中__VIEWSTATE,__VIEWSTATEGENERATOR和code是一個可以變化的量# 登陸界面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'headers = {'User-Agent': ''
}# 獲取頁面源碼
response = requests.get(url, headers=headers)
content = response.text# 解析網頁源碼 獲取__VIEWSTATE和__VIEWSTATEGENERATOR
soup = BeautifulSoup(content, 'lxml')# 獲取__VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')# 獲取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')# 獲取驗證碼圖片
code_url = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code_url# 使用session()方法 通過session的返回值,就能使請求變成一個對象
session = requests.session()
# 驗證碼url的內容
response_code = session.get(code_url)
# 這里要使用二進制數據,因為是要下載圖片
content_post = response_code.content
# wb是將二進制數據寫入到文件
with open('files/code.jpg', 'wb')as fp:fp.write(content_post)code = input('輸入驗證碼:')# 登陸
data_post = {'__VIEWSTATE': viewstate,'__VIEWSTATEGENERATOR': viewstategenerator,'from': 'http://so.gushiwen.cn/user/collect.aspx','email': '','pwd': '','code': code,'denglu': '登錄'
}response_post = session.post(url, data=data_post, headers=headers)
content_post = response_post.text
# 保存到本地
with open('files/gushiwen.html', 'w', encoding='utf-8')as fp:fp.write(content_post)
不過這種方法需要手動輸入驗證碼,太麻煩,還有一個可以花點小錢來解決這個問題的方法,那就是使用自動識別驗證碼的平臺,這里用的是超級鷹https://www.chaojiying.com/
- 先注冊一個賬號
- 進入用戶中心,購買積分(1塊錢有1000點,學習使用完全是夠了)
- 點擊開發文檔找到python語言下載,點擊下載
- 下載完成后解壓,放到程序文件夾目錄下
- 生成軟件ID
- 把這里替換成自己的賬號和密碼,最后一個是上一步生成的軟件ID,也要替換掉(如果是python3.4以上的版本,print需要加())
- 替換
code = input('輸入驗證碼:')
替換為
# 超級鷹識別驗證碼內容
chaojiying = Chaojiying_Client('賬號', '密碼', '軟件ID')
img = open('files/code.jpg', 'rb').read()
code = chaojiying.PostPic(img, 1902).get('pic_str')