啊,摸索了半天,總算有點頭緒了,因爲對網頁結構的不清晰,被折磨了很久。。。html
最近就專門研究這個爬蟲問題: 瀏覽器
1.簡單單頁網頁的爬取服務器
2.翻頁網頁的爬取(商品,新聞類啊)cookie
3.須要登錄網頁的爬取網絡
4.須要登錄加驗證的網頁爬取框架
5.scrapy 的框架問題scrapy
6.beautifulSoup、requests測試
7.cookeis、表單數據的查看網站
以上數據爬取以後,能夠進行數據挖掘。url
爲防止網站被惡意訪問,須要設置驗證碼登陸,避免非人類的訪問,Python爬蟲實現驗證碼登陸的原理則是先到登陸頁面將生成的驗證碼保存到本地,而後人爲輸入,包裝後再POST給服務器。
此過程當中涉及到了Cookie:
「Cookie」是小量信息,由網絡服務器發送出來以存儲在網絡瀏覽器上,從而下次這位獨一無二的訪客又回到該網絡服務器時,可從該瀏覽器讀回此信息。這是頗有用的,讓瀏覽器記住這位訪客的特定信息,如上次訪問的位置、花費的時間或用戶首選項(如樣式表)。Cookie 是個存儲在瀏覽器目錄的文本文件,當瀏覽器運行時,存儲在 RAM 中。一旦你從該網站或網絡服務器退出,Cookie 也可存儲在計算機的硬驅上。當訪客結束其瀏覽器對話時,即終止的全部 Cookie。(百度百科)
其實Cookie保存在本地主機上,避免用戶重複輸入用戶名和密碼,在鏈接服務器的時候將訪問鏈接和Cookie組裝起來POST給服務器。這裏涉及到了兩次向服務器POST,一次是Cookie,這裏還自行設計想要Cookie的內容,因爲是要登陸,Cookie中存放的則是用戶名和密碼。第二次POST則是向服務器提交驗證。
8.查看器查看元素:
chorme:開發者模式,或F12,而後再網絡裏面
火狐也相似。
下面借鑑了網上的代碼,而後稍稍的修改,模擬登錄加驗證的網頁爬取,豆瓣。
1 import re 2 import urllib.request # 下次利用requests庫的話,要更簡潔一些 3 import http.cookiejar 4 params = {} 5 params['form_email'] = input('請輸入你的登錄密碼(郵箱登錄):') 6 params['form_password'] = input('請輸入密碼:') 7 response = opener.open(loginurl, urllib.parse.urlencode(params).encode( 8 'utf-8')) # urllib.parse.urlencode(params).encode('utf-8') #這個是向服務 9 # 器POST的內容,能夠打印一下response.geturl()請求的鏈接看一下 10 if response.geturl()[0:33] == 'https://accounts.douban.com/login': 11 html = response.read().decode('utf-8') 12 # print(html),能夠先打印一下文件內容,爲了看到網頁元素更方便的寫正則,能夠複製下來,在須要獲取的地方用(.+?)表示,而後用group()元組來取得, 13 # 驗證圖片地址 14 imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html) 15 # imgurl即爲驗證圖片,src= 驗證圖片的地址 16 if imgurl: 17 url = imgurl.group(1) # 即提取出了驗證圖片地址 18 # print(url) 19 # 將驗證碼以v.jpg保存在本地,在輸入驗證碼的時候能夠手工輸入 20 res = urllib.request.urlretrieve(url, 'v.jpg') 21 # urlretrieve() 方法直接將遠程數據下載到本地。urlretrieve(url, filename=None, reporthook=None, data=None) filename:文件保存地址 22 captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>', html) 23 # print(captcha.group(1)) 24 if captcha: 25 vcode = input('請輸入圖片上的驗證碼:') 26 params["captcha-solution"] = vcode 27 params["captcha-id"] = captcha.group(1) # 這個是動態生成的,須要從網頁中得到 28 params["user_login"] = "登陸" 29 # 提交驗證碼驗證 30 response = opener.open(loginurl, urllib.parse.urlencode(params).encode('utf-8')) 31 if response.geturl() == "https://www.douban.com/": 32 print("login sucess!") 33 else: 34 print('login lose!')
那麼做爲小白的咱們該怎麼判斷,咱們的爬蟲已經登陸成功了呢?
下面進行test一下:
1 # < span > (你的帳號名)的賬號 < / span > ----> ture test:作測試 2 f = open('filepath', 'r+') 3 content = response.read() 4 f.write(content.decode()) # 這邊記得解碼一下,上面encode了。不然會報錯 bety 不能寫入 5 f.close() 6 a = '<span>(你的帳號名)的賬號</span>' 7 a in content.decode() # 判斷一下,有關於你的帳號信息是否是能夠讀取出來。
# 思路:
1.手動登陸頁面
2.看源代碼裏面是否跟你爬下來的源代碼一致便可
3.實質上只要檢驗一下你的帳號信息有沒有出如今源代碼中就ok啦。
# 總結: 暫時還停留在粗淺的入門階段,還有一些須要改進的地方,