1、模拟豆瓣登录
''' |-- 代码解析: |-- 1、登录必须具备的条件:url,cookie,fromData fromData的参数如下: source: index_nav form_email: 1832785141@qq.com form_password: wfq8319274129 captcha-solution: rough captcha-id: K0dnHwvyM2evqk1Do8beSlpl:en login:登录 拿到这些参数必须弄懂具体各个参数是什么含义: form_email : 用户名 form_password : 密码 captcha-solution : 验证码图片的名字(如何确认:登录页面查看网页源代码搜索:captcha-solution;另外一种方法:登录页检查,用左上角箭头查看验证码框。得到以下的内容:) <input type="text" autocomplete="off" class="inp" id="captcha_field" name="captcha-solution" tabindex="3" placeholder="验证码"/> captcha-id : 验证码图片ID(如何确认:同captcha-solution方法一样) |-- 2、由于存在验证码,所以data字典内分两部分写入,一部分写入验证码之前的字段:source,form_email,form_password。一部分等获取验证码后,在写入: captcha-solution,captcha-id,login |-- 3、用reponse接受请求 |-- 4、读取返回来的数据 |-- 5、获取验证码的地址(方法:登录页检查,用左上角的箭头点击验证码图片就可以得到地址,具体如下:) <img id="captcha_image" src="https://www.douban.com/misc/captcha?id=XnfFdo9PtGEvzszCDcsba03p:en&size=s" alt="captcha" class="captcha_image" title="看不清楚?点图片可以换一个" style="cursor: pointer;"> 具体代码用:re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html) -- 这里需要注意的知识点:imgurl=re.search(), src="(.+?)"正则表达式 |-- 6、获取验证码的图片url:url = imgurl.group(1) 并把图片保存到目录下以便程序运行时输入具体的验证码:res = urllib.request.urlretrieve(url,'v.jpg') |-- 7、获取验证码的ID(方法同第5步一样,具体如下:) <input type="hidden" name="captcha-id" value="F3RK1x6AUPruX28jxjfSGfoI:en"> 具体代码用: re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>',html) --同样需要注意的知识点:re.search,value="(.+?) 正则表达式 |-- 8、再次写入captcha-solution,captcha-id,login |-- 9、再次用reponse读取返回的数据 |-- 10、做个检查点,判断返回的url是否是登录后的url ''' import re import urllib.request import urllib.parse from http.cookiejar import CookieJar import ssl ssl._create_default_https_context = ssl._create_unverified_context #登录需要的参数 login_url = "https://www.douban.com/accounts/login" cookie = CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor) data = {"form_email":"1832785141@qq.com", "form_password":"wfq8319274129", "source":"index_nav"} #request = urllib.request.Request(login_url,urllib.parse.urlencode(data).encode('utf-8'),method='POST') reponse = opener.open(login_url,urllib.parse.urlencode(data).encode('UTF-8')) #验证成功跳转至登录页 if reponse.geturl() == login_url: html = reponse.read().decode() #获取验证码图片地址 imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html) print("imgurl++",imgurl) if imgurl: #group()返回组号匹配的所有字符串即:验证码图片的url url = imgurl.group(1) print("url--",url) #将验证码图片保存至同目录下 res = urllib.request.urlretrieve(url,'v.jpg') #获取图片id:captcha-id captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>',html) #print("captcha==",captcha) if captcha: vcode = input('请输入验证码:') data["captcha-solution"]=vcode data["captcha-id"] = captcha.group(1) data["login"] = "登录" #提交验证码 reponse =opener.open(login_url,urllib.parse.urlencode(data).encode('UTF-8')) #登录成功,跳转至首页 if reponse.geturl() == "https://www.douban.com/": print("登录成功")
涉及到的知识点
1、https://www.cnblogs.com/tina-python/p/5508402.html
2、http://www.cnblogs.com/anni-qianqian/p/10019672.html (各类爬虫的实例!!!)
3、URLError错误解决方案:https://blog.csdn.net/sylmoon/article/details/78777770