网页爬虫 - python requests库模拟登陆学校教务网遇到数据库繁忙
高洛峰
高洛峰 2017-04-17 18:01:26
0
5
641

第一次写爬虫也是第一次在SF提问题=。=
思路就是get登陆下网址获得一个cookie然后带着cookie以post方式登陆
headers伪造和浏览器一模一样
服务器总是返回一个数据库繁忙的界面,找了很久也不知道原因在哪


s = requests.Session()
x = s.get(loginUrl)
r = s.post(postUrl,data=
{
'zjh':'********',
'mm':'********',
'v_yzm':CodeRecognition()
}
,headers = headers)


print(x.headers)
print(x.request.headers)
print(r.headers)
print(r.request.headers)


f=file("cookie.txt","w+")
f.write(r.text)
f.close()

CodeRecognition() 这个验证码识别模块源码太长就不贴出来了,就是先用urllib库访问验证码地址 http://222.195.242.222:8080/validateCodeAction.do 把图片下载到本地,然后对图像二值化灰度等处理后调用Tesseract-OCR识别并返回

补充内容:在chrome中用EditThisCookie管理工具删掉网站的cookie然后刷新页面,登录会失败,返回数据库繁忙。但是我用session先访问网站返回给了我一个setcookie,然后带着这个cookie post表单为什么还是会有这个错误呢?

这是在sublime3中运行打印出的内容:

{'Transfer-Encoding': 'chunked', 'Set-Cookie': 'JSESSIONID=bhazvcnoUA-YYbw_WQZsv; path=/', 'Keep-Alive': 'timeout=8, max=500', 'Server': 'Apache', 'Connection': 'Keep-Alive', 'Cache-Control': 'private', 'Date': 'Sun, 15 May 2016 09:06:53 GMT', 'Content-Type': 'text/html; charset=GBK'}

{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.9.1'}

{'Transfer-Encoding': 'chunked', 'Keep-Alive': 'timeout=8, max=499', 'Server': 'Apache', 'Connection': 'Keep-Alive', 'Date': 'Sun, 15 May 2016 09:06:53 GMT', 'Content-Type': 'text/html; charset=GBK'}

{'Origin': 'http://222.195.242.222:8080', 'Content-Length': '77', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Accept': '*/*', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36', 'Host': '222.195.242.222:8080', 'Referer': 'http://222.195.242.222:8080/', 'Cookie': 'JSESSIONID=bhazvcnoUA-YYbw_WQZsv', 'Content-Type': 'application/x-www-form-urlencoded'}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(5)
Peter_Zhu
import requests

cookies = {}

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/50.0.2661.86 Safari/537.36'
}


def get_code():
    url = 'http://222.195.242.222:8080/validateCodeAction.do'
    resp = requests.get(url, headers=headers)
    cookies['JSESSIONID'] = resp.cookies.get('JSESSIONID')
    with open('code.jpg', 'wb') as img:
        img.write(resp.content)


def login(username, password, code):
    url = 'http://222.195.242.222:8080/loginAction.do'
    form = {
        'zjh1': '',
        'tips': '',
        'lx': '',
        'evalue': '',
        'eflag': '',
        'fs': '',
        'dzslh': '',
        'zjh': username,
        'mm': password,
        'v_yzm': code
    }
    resp = requests.post(url, headers=headers, data=form, cookies=cookies)


def get_info():
    url = 'http://222.195.242.222:8080/xjInfoAction.do?oper=xjxx'
    resp = requests.get(url, headers=headers, cookies=cookies)
    print(resp.text)


if __name__ == '__main__':
    username = input(input your username: );
    password = input(input your password: );
    get_code()
    code = input('input the code: ')
    login(username, password, code)
    get_info()

上面的程式碼可以拿到資料
基本想法就是
GET取得驗證碼時伺服器會回傳一個cookie
帶著這個cookie再POST表單就行了
最近剛好在寫學校幾個網站的爬蟲,遇到且解決了不少問題
這個比我們學校那個好搞…

黄舟

貴校的教務系統真是...
樓主,做爬蟲是要有耐心的,今天我正好沒事做所以幫你看了看,以下是我能夠成功請求的代碼。對於一個呼叫總是失敗的接口,首先應該想到自己的那幾個關鍵數據是否正確,如果確實正確但還是返回奇怪的錯誤,那就得考慮其他的字段,在瀏覽器裡調試可以看到,POST的請求data裡面還有其他幾個空字段,當然,這裡可能確實對後台的判斷來說沒有意義,但不代表所有的都沒有意義,所以出現錯誤的時候就得加上去嘗試,當然,當data裡面欄位正確以後還是錯誤就得考慮HTTP頭中的資訊了,主要的是Origin和Referer和User-Agent,如果還是不行,那就很有可能是Cookie欄位的資訊沒有加上了,如下,一次一次地增加欄位最終發現是cookie的問題

r = requests.post('http://222.195.242.222:8080/loginAction.do', data={'zjh': '201406478', 'mm': '201406478', 'v_yzm': 'v2tt', 'tips': '', 'zjh1': '', 'lx': '', 'evalue': '', 'eflag': '', 'fs': '', 'dzslh': ''}, headers={'Origin': 'http://222.195.242.222:8080', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36', 'Referer': 'http://222.195.242.222:8080/', 'Accept-Encoding': 'Accept-Encoding: gzip, deflate', 'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2', 'Upgrade-Insecure-Requests': '1', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive'}, cookies={'JSESSIONID': 'daeIK_SalL_r8cpMsrYsv'})

此時不再回傳資料庫繁忙了,而是驗證碼出錯後重定向的頁面了。

最後,當爬蟲真的需要耐心,特別是設定有反爬蟲策略的站點

巴扎黑

溫馨提示,你的帳號密碼已經暴露了。

小葫芦

哈哈,有人用這個帳號登上去了嗎

PHPzhong

沒做馬賽克處理.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板