本文只是提供一些经验,实际情况下因地制宜。
自己做了个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