鱼C论坛

 找回密码
 立即注册
查看: 1398|回复: 6

[已解决]python豆瓣登陆问题

[复制链接]
发表于 2021-1-22 16:35:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Twilight6 于 2021-1-22 16:59 编辑

代码如下
  1. import re
  2. import urllib.request
  3. from http.cookiejar import CookieJar

  4. # 豆瓣的登录url
  5. loginurl = 'https://www.douban.com/accounts/login'
  6. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
  7. cookie = CookieJar()
  8. opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor)
  9. opener.addheaders = [headers]

  10. data = {
  11.     "form_email":"your email",
  12.     "form_password":"your password",
  13.     "source":"index_nav"
  14. }
  15. data = {}
  16. data['form_email'] = '你的账号'
  17. data['form_password'] = '你的密码'
  18. data['source'] = 'index_nav'

  19. response = opener.open(loginurl, urllib.parse.urlencode(data).encode('utf-8'))

  20. #验证成功跳转至登录页
  21. if response.geturl() == "https://www.douban.com/accounts/login":
  22.     html = response.read().decode()
  23.    
  24.     #验证码图片地址
  25.     imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html)
  26.     if imgurl:
  27.         url = imgurl.group(1)
  28.         # 将验证码图片保存至同目录下
  29.         res = urllib.request.urlretrieve(url, 'v.jpg')

  30.         # 获取captcha-id参数
  31.         captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>' ,html)

  32.         if captcha:
  33.             vcode = input('请输入图片上的验证码:')
  34.             data["captcha-solution"] = vcode
  35.             data["captcha-id"] = captcha.group(1)
  36.             data["user_login"] = "登录"

  37.             # 提交验证码验证
  38.             response = opener.open(loginurl, urllib.parse.urlencode(data).encode('utf-8'))

  39.             # 登录成功跳转至首页 '''
  40.             if response.geturl() == "http://www.douban.com/":
  41.                 print('登录成功!')
复制代码

为什么出现这种错误,找了好久都不知道怎么改
Traceback (most recent call last):
  File "F:/WebSpider/54/douban.py", line 22, in <module>
    response = opener.open(loginurl, urllib.parse.urlencode(data).encode('utf-8'))
  File "C:\Users\LENOV\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 522, in open
    req = meth(req)
  File "C:\Users\LENOV\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 1271, in do_request_
    for name, value in self.parent.addheaders:
ValueError: not enough values to unpack (expected 2, got 1)
最佳答案
2021-1-23 10:07:48
那位大人 发表于 2021-1-23 09:52
是headers不同的问题吗,我用我浏览器查的豆瓣headers,这跟你给的不一样;还有,运行倒是没错了,但啥 ...


headers写多种(mozilla、applewebkit,chrome)反倒可能触发反扒。headers只要不是默认的python-urllib,一般不会触发反扒。豆瓣登陆判断没那么简单,一下是以前别人写的:
  1. import requests
  2. from lxml import etree


  3. def main():
  4.     url = 'https://accounts.douban.com/j/mobile/login/basic'
  5.     headers = {'user-agent': 'firefox',
  6.                'X-Requested-With': 'XMLHttpRequest',
  7.                'cookie': 'bid=hIYyIduorJA; douban-fav-remind=1; __utma=30149280.307390223.1595495492.1596504502.1598348956.4; __utmz=30149280.1598348956.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/passport/login; __gads=ID=e5de2b79763a1dbd:T=1596504503:S=ALNI_Ma9hnIcfLisdJZ13EZO1GHBsanigg; apiKey=; _pk_id.100001.2fad=20a3a4214f898ade.1598348634.1.1598351524.1598348634.; _pk_ses.100001.2fad=*; last_login_way=account; push_noty_num=0; push_doumail_num=0; __utmc=30149280; __utmv=30149280.14229; douban-profile-remind=1; ps=y'}
  8.     data = dict()
  9.     data['ck'] = '_J_B'
  10.     data['name'] = '填入账号'
  11.     data['password'] = '填入密码'
  12.     data['remember'] = 'false'
  13.     data['ticket'] = ''
  14.     r = requests.post(url, headers=headers, data=data)
  15.     result = r.json()
  16.     print(result['description'])


  17. if __name__ == '__main__':
  18.     main()
复制代码

可以看到还得用cookie,判断也不是靠返回的header里的url判断,要看返回的json数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-22 17:58:54 | 显示全部楼层
很少用urllib了,好像是headers给的少了,随便加1个其他头就过了:
  1. loginurl = 'https://www.douban.com/accounts/login'
  2. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)', 'Connection': 'keep-alive'}
  3. cookie = CookieJar()
  4. handler = urllib.request.HTTPCookieProcessor(cookie)
  5. opener = urllib.request.build_opener(handler)
  6. opener.addheaders = [headers]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-22 19:06:40 | 显示全部楼层
suchocolate 发表于 2021-1-22 17:58
很少用urllib了,好像是headers给的少了,随便加1个其他头就过了:

headers给的少了是什么意思,我按照你的格式修改了一下,还是不行,一样的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-22 19:58:28 | 显示全部楼层
那位大人 发表于 2021-1-22 19:06
headers给的少了是什么意思,我按照你的格式修改了一下,还是不行,一样的错误

我这没有输出报错:
  1. import re
  2. import urllib.request
  3. from http.cookiejar import CookieJar

  4. # 豆瓣的登录url
  5. loginurl = 'https://www.douban.com/accounts/login'
  6. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)', 'Connection': 'keep-alive'}
  7. cookie = CookieJar()
  8. handler = urllib.request.HTTPCookieProcessor(cookie)
  9. opener = urllib.request.build_opener(handler)
  10. opener.addheaders = [headers]

  11. data = {
  12.     "form_email": "your email",
  13.     "form_password": "your password",
  14.     "source": "index_nav"
  15. }


  16. response = opener.open(loginurl, urllib.parse.urlencode(data).encode('utf-8'))

  17. # 验证成功跳转至登录页
  18. if response.geturl() == "https://www.douban.com/accounts/login":
  19.     html = response.read().decode()

  20.     # 验证码图片地址
  21.     imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html)
  22.     if imgurl:
  23.         url = imgurl.group(1)
  24.         # 将验证码图片保存至同目录下
  25.         res = urllib.request.urlretrieve(url, 'v.jpg')

  26.         # 获取captcha-id参数
  27.         captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>', html)

  28.         if captcha:
  29.             vcode = input('请输入图片上的验证码:')
  30.             data["captcha-solution"] = vcode
  31.             data["captcha-id"] = captcha.group(1)
  32.             data["user_login"] = "登录"

  33.             # 提交验证码验证
  34.             response = opener.open(loginurl, urllib.parse.urlencode(data).encode('utf-8'))

  35.             # 登录成功跳转至首页 '''
  36.             if response.geturl() == "http://www.douban.com/":
  37.                 print('登录成功!')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 09:52:50 | 显示全部楼层
本帖最后由 那位大人 于 2021-1-23 09:55 编辑
suchocolate 发表于 2021-1-22 19:58
我这没有输出报错:


是headers不同的问题吗,我用我浏览器查的豆瓣headers,这跟你给的不一样;还有,运行倒是没错了,但啥也没有出现,就空白一片,没有验证码输入的提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-23 10:07:48 | 显示全部楼层    本楼为最佳答案   
那位大人 发表于 2021-1-23 09:52
是headers不同的问题吗,我用我浏览器查的豆瓣headers,这跟你给的不一样;还有,运行倒是没错了,但啥 ...


headers写多种(mozilla、applewebkit,chrome)反倒可能触发反扒。headers只要不是默认的python-urllib,一般不会触发反扒。豆瓣登陆判断没那么简单,一下是以前别人写的:
  1. import requests
  2. from lxml import etree


  3. def main():
  4.     url = 'https://accounts.douban.com/j/mobile/login/basic'
  5.     headers = {'user-agent': 'firefox',
  6.                'X-Requested-With': 'XMLHttpRequest',
  7.                'cookie': 'bid=hIYyIduorJA; douban-fav-remind=1; __utma=30149280.307390223.1595495492.1596504502.1598348956.4; __utmz=30149280.1598348956.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/passport/login; __gads=ID=e5de2b79763a1dbd:T=1596504503:S=ALNI_Ma9hnIcfLisdJZ13EZO1GHBsanigg; apiKey=; _pk_id.100001.2fad=20a3a4214f898ade.1598348634.1.1598351524.1598348634.; _pk_ses.100001.2fad=*; last_login_way=account; push_noty_num=0; push_doumail_num=0; __utmc=30149280; __utmv=30149280.14229; douban-profile-remind=1; ps=y'}
  8.     data = dict()
  9.     data['ck'] = '_J_B'
  10.     data['name'] = '填入账号'
  11.     data['password'] = '填入密码'
  12.     data['remember'] = 'false'
  13.     data['ticket'] = ''
  14.     r = requests.post(url, headers=headers, data=data)
  15.     result = r.json()
  16.     print(result['description'])


  17. if __name__ == '__main__':
  18.     main()
复制代码

可以看到还得用cookie,判断也不是靠返回的header里的url判断,要看返回的json数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 10:49:51 | 显示全部楼层
suchocolate 发表于 2021-1-23 10:07
headers写多种(mozilla、applewebkit,chrome)反倒可能触发反扒。headers只要不是默认的python-urlli ...

好的,谢谢大佬,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 03:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表