本文只是提供一些經驗,實際情況下因地制宜。
自己做了個Django項目,緩存用的是redis,部署到雲服務器上,想要通過爬蟲自動化註冊賬號。話不多說,一步步做。
首先要準備賬號數據,chorme利用ctrl+shift+i看一下注冊提交的是什麼數據。因爲post提交有個csrf驗證的東西,還有個驗證碼,這個我們先不管,先把其餘數據處理好。
當然也可以做成json格式,這裏用的是xlsx來做,接下來我們提取一下數據。
import xlrd
def get_data(filename,sheetnum):
dir_case = 'E:\\LearnPython\\' + filename + '.xlsx'
data = xlrd.open_workbook(dir_case)
table = data.sheets()[sheetnum]
nor = table.nrows
nol = table.ncols
dict1 = {}
for i in range(1, nor):
for j in range(nol):
title = table.cell_value(0, j)
ctype = table.cell(i, j).ctype
value = table.cell_value(i, j)
if ctype == 2 and value % 1 == 0.0: # ctype爲2且爲浮點
value = int(value) # 浮點轉成整型
value = str(value) # 轉成整型後再轉成字符串,如果想要整型就去掉該行
dict1[title] = value
yield dict1
這裏數字類型的賬號密碼和手機號碼後尾都加了.0,於是我利用ctype判斷格式後進行轉換爲整型。返回生成的dict1
接下來要獲取 csrfmiddlewaretoken 這個token,這個其實在網頁裏有出現
url = '註冊頁面'
req1 = requests.get(url)
soup = BeautifulSoup(req1.text, "html.parser")
csrfmiddlewaretoken = soup.find("input", attrs={'name': 'csrfmiddlewaretoken'})["value"]
這個頁面是每進行註冊就會重新產生的,所以應該將這個放到一個循環裏。
接下來獲取驗證碼了,驗證碼這些一般會存入緩存裏,大部分網站利用redis做緩存,於是我們寫了個獲取驗證碼的函數
def get_checkcode():
r = redis.StrictRedis(host="公網ip", password="password", port=6379, db=1)
for item in r.keys():
if item != b'runtime' and item != b'caches':
key = item
value = r.get(key)
ret = chardet.detect(value)
s1 = str(value, encoding='Windows-1252') # 將bytes轉換成str
print(s1)
res = re.search(' CheckCode”Œ(.*?)”u.', s1)
if res:
return res.group(1)
return None
利用chardet查看value的編碼,發現是windows-1252,怪不得用utf8和gbk都一直轉不成功,然後利用正則匹配出來驗證碼。
這個函數運行時候我是刷新頁面進行驗證的,等到放在requests.get後面又發現獲取不到驗證碼,原來redis都沒生成。
弄到這好想說直接selenium+打碼平臺來自動化算了,可是一想還挺吃虧的,自己的網站自己爬也要給別人錢。
於是又看了一遍註冊的過程,發現有個cookie裏有個csrftoken和sessionid,或許是我沒有加這兩個所以沒能生成驗證碼?
然後就找set-cookie這東西,發現requests好像只能拿到csrftoken這個set-cookie,一直拿不到session,再查看之前頁面原來在訪問之前頁面時候就有個set-cookie來設置session。
於是訪問主頁獲取sessionid再訪問註冊頁面獲取csrftoken
def get_session():
req1 = requests.get('主頁地址')
session = req1.headers['Set-Cookie']
return session
if __name__ == '__main__':
for i in get_data('01', 0):
req1 = requests.get(url)
csrftoken = req1.headers['Set-Cookie']
print(csrftoken[0:74])
soup = BeautifulSoup(req1.text, "html.parser")
csrfmiddlewaretoken = soup.find("input", attrs={'name': 'csrfmiddlewaretoken'})["value"]
data = i
data['csrfmiddlewaretoken'] = csrfmiddlewaretoken
session = get_session()
print(session[0:43])
這樣就有了請求頭,於是可正常生成驗證碼接着進行獲取。
完整代碼參見github