鱼C论坛

 找回密码
 立即注册
查看: 1465|回复: 4

[已解决]python课后作业求助:1.写一个登录豆瓣的客户端,总是出现HTTP Error 418

[复制链接]
发表于 2021-12-5 12:49:27 | 显示全部楼层 |阅读模式

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

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

x
"""写一个登录豆瓣的客户端,总是不成功,提示urllib.error.HTTPError: HTTP Error 418:需要怎么改,求指正 """
  1. import re
  2. import urllib.request
  3. import http.cookiejar
  4. import urllib.parse

  5. #豆瓣的登陆url
  6. loginurl = 'https://www.douban.com/accounts/login'
  7. #构建一个CookieJar对象实例来保存cookie
  8. cookiejar = http.cookiejar.CookieJar()
  9. #使用HttpCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
  10. handler = urllib.request.HTTPCookieProcessor(cookiejar)
  11. #通过build_opener()来构建opener
  12. opener = urllib.request.build_opener(handler)

  13. data = {
  14.     "form_email":"your email",
  15.     "form_password":"your password",
  16.     "source":"index_nav" #没有的话登录不成功
  17. }

  18. data = {}
  19. data['form_email'] = "你的账号"
  20. data['form_password'] = "你的密码"
  21. data['source'] = 'index_nav'

  22. #从首页提交登录,以get方法访问页面,访问之后会自动保存cookie到cookiejar中
  23. response=opener.open(loginurl, urllib.parse.urlencode(data).encode('utf-8'))

  24. #验证成功跳转至登录页
  25. if response.geturl() == "https://www.douban.com/accounts/login":
  26.     html = response.read().decode('utf-8')

  27.     #验证码图片地址
  28.     imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html)
  29.     if imgurl:
  30.         url = imgurl.group(1)
  31.         #将验证码图片保存至同目录下
  32.         res = urllib.request.urlretrieve(url, 'v.jpg')
  33.         #获取captcha-id参数
  34.         captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>' ,html)

  35.         if captcha:
  36.             vcode = input('请输入图片上的验证码:')
  37.             data["captcha-solution"] = vcode
  38.             data["captcha-id"] = captcha.group(1)
  39.             data["user_login"] = "登录"
  40.             #提交验证码验证
  41.             response = opener.open(loginurl, urllib.parse.urlencode(data).encode("utf-8"))
  42.             ''' 登录成功跳转至首页 '''
  43.             if response.geturl() == "http://www.douban.com/":
  44.                 print('login success ! ')
复制代码
最佳答案
2021-12-5 13:50:03
  1. #豆瓣的登陆url
  2. # ....
  3. opener.addheaders = [('User-agent', 'Mozilla')]   # 修改默认的user-agent,否则会被反扒。
  4. opener = urllib.request.build_opener(handler)
复制代码

老教程都落伍了,建议换个教程。https://gitee.com/Python3WebSpider/Python3WebSpider
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-5 13:50:03 | 显示全部楼层    本楼为最佳答案   
  1. #豆瓣的登陆url
  2. # ....
  3. opener.addheaders = [('User-agent', 'Mozilla')]   # 修改默认的user-agent,否则会被反扒。
  4. opener = urllib.request.build_opener(handler)
复制代码

老教程都落伍了,建议换个教程。https://gitee.com/Python3WebSpider/Python3WebSpider
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-6 10:24:43 | 显示全部楼层
suchocolate 发表于 2021-12-5 13:50
老教程都落伍了,建议换个教程。https://gitee.com/Python3WebSpider/Python3WebSpider

感谢,请问下.add_header和.addheaders的效果是一样的吗?他们之间有什么区别?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-6 11:38:44 | 显示全部楼层
本帖最后由 suchocolate 于 2021-12-6 11:41 编辑
myqf123 发表于 2021-12-6 10:24
感谢,请问下.add_header和.addheaders的效果是一样的吗?他们之间有什么区别?


效果是一样的,都是修改默认的头中字段的信息。但这两个方法是不同对象的方法:
  1. # 1. openner 的 addheaders方法:
  2. >>> from urllib import request
  3. >>> url = "https://www.whatismyip.com"
  4. >>> proxy_support = request.ProxyHandler({'http': '125.108.106.64:9000'})
  5. >>> opener = request.build_opener(proxy_support)
  6. >>> dir(opener)
  7. ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_call_chain', '_open', 'add_handler', 'addheaders', 'close', 'error', 'handle_error', 'handle_open', 'handlers', 'open', 'process_request', 'process_response']  # 注意,没有add_headers方法
  8. >>> type(opener)  # openner对象
  9. <class 'urllib.request.OpenerDirector'>
  10. >>> opener.addheaders = [('User-agent', 'Firefox')]
  11. >>>



  12. # 2. Request对象的add_header方法
  13. >>> from urllib import request
  14. >>> req = request.Request(url='http://www.baidu.com')
  15. >>> dir(req)
  16. ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_data', '_full_url', '_parse', '_tunnel_host', 'add_header', 'add_unredirected_header', 'data', 'fragment', 'full_url', 'get_full_url', 'get_header', 'get_method', 'has_header', 'has_proxy', 'header_items', 'headers', 'host', 'origin_req_host', 'remove_header', 'selector', 'set_proxy', 'type', 'unredirected_hdrs', 'unverifiable']  # 注意没有addheaders方法
  17. >>> type(req)  # request对象
  18. <class 'urllib.request.Request'>
  19. >>> req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-6 11:51:07 | 显示全部楼层
suchocolate 发表于 2021-12-6 11:38
效果是一样的,都是修改默认的头中字段的信息。但这两个方法是不同对象的方法:

感谢解惑!大概明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 18:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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