學爬蟲有一段時間了,前面沒有總結又重裝了系統,致使以前的代碼和思考都沒了。。因此仍是要及時整理總結備份。下面記錄我模擬登錄豆瓣的方法,方法一登上了豆瓣,方法二重定向到了豆瓣中「個人喜歡」列表,獲取了第一頁上我喜歡的帖子標題。html
方法一:使用requests庫和cookies登錄正則表達式
1 import re 2 pattern = re.compile('(.*?)/.*?') #只須要提取cookies的前兩項cookie sent,value就好了 3 fr = open('dealwithcookies.txt','r') #dealwithcookies是把網站上的cookies複製粘貼進去的文件 4 l = [] 5 for item in fr.readlines(): 6 item = str(item) 7 item = pattern.search(item).group(1) 8 #第七行使用item = re.search(pattern).group(1)會報錯‘TypeError: expected string or buffer’,使用item = pattern.search(item).group(1) 就不會有這個錯誤 9 l.append(item) 10 fr.close() 11 cookies = {} 12 for i in l: 13 key, value = i.split('\t',1) #每行有多個‘\t’,只分開第一個 14 cookies[key] = value
import requests s=requests.get(testurl, cookies=cookies)
問題:cookies必須手動獲取嗎?還在找解決方法瀏覽器
方法二:使用requests.post直接帶上用戶名/密碼/headers等信息登錄豆瓣,由於豆瓣有時須要填寫驗證碼,所以我先登錄一遍,使用豆瓣轉到的帶有驗證碼的網址將驗證碼下載到本地,手動輸入驗證碼後,將須要post的data加上驗證碼信息再post。cookie
代碼:app
# -*- encoding:utf-8 -*- import requests import urllib2 import re import urllib from bs4 import BeautifulSoup loginUrl = 'https://www.douban.com/accounts/login' formdata = {'form_email':'144XXXXX530@qq.com', 'form_password':'XXXXX', 'redir':'https://www.douban.com/people/67249180/likes/'} headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'} r = requests.post(loginUrl,data=formdata,headers=headers) page = r.text print r.url #此時page是須要填寫驗證碼再進行登錄的界面 soup = BeautifulSoup(page,'html.parser') captchaAddr = soup.find('img',id='captcha_image')['src'] #利用正則表達式獲取captcha的ID reCaptchaID = r'<input type="hidden" name="captcha-id" value="(.*?)"/' captchaID = re.findall(reCaptchaID,page) #print captchaID #保存到本地 urllib.urlretrieve(captchaAddr,"captcha.jpg") captcha = raw_input('please input the captcha:') formdata['captcha-solution'] = captcha formdata['captcha-id'] = captchaID r = requests.post(loginUrl,data = formdata,headers = headers) #獲取驗證碼之後再提交一遍 print r.url page = r.text if r.url == 'https://www.douban.com/people/67249180/likes/': soup = BeautifulSoup(page,'html.parser') result = soup.findAll('div',class_='title') #print result for item in result: print item.find('a').get_text()
其中字典的鍵值都是經過網頁源代碼得到的。post
使用BeautifulSoup匹配關鍵詞,也可使用正則表達式,看你以爲哪種的邏輯好理解了。網站