一、验证码识别

1、验证码和爬虫之间的关系

  • 验证码属于一种 反爬机制


  • 识别验证码中的数据,用于模拟登录

    2、识别验证码的操作

  • 人工肉眼识别 (不推荐,效率低))


  • 第三方自动识别(推荐使用)
    • 超级鹰 的使用流程:http://www.chaojiying.com
    • 注册该平台,下载该平台的Python开发文档
    • 把python源文件放到自己的项目中去
    • 稍微修改一下python源文件,就可以进行识别了,前提是需要有题分【没有就充值】
    • 在自己的python文件中import该文件
    • 然后实例化一个Chaojiying_Client(“用户名”,”密码”,”软件id”)
    • im = open(‘../二手房/a.jpg’, ‘rb’).read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    • print(chaojiying.PostPic(im, 1902)) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
    • 返回json数据 其中的 {‘err_no’: 0, ‘err_str’: ‘OK’, ‘pic_id’: ‘6125113035261700001’, ‘pic_str’: ‘7261’, ‘md5’: ‘2cd18ae5f5b652059c48b607e3184fca’} 为验证码
  • 使用模拟登录的话,最后可以查看一个返回结果的.status_code属性,如果是200 说明模拟登录成功

**

  • 实现模拟登录的初衷是 :登录完成后可以获得登录人的个人信息

    二、cookie

    http/https 协议特征:无状态

cookie: 服务端通过cookie 来判断用户是否已经登陆

  • 手动处理: 通过抓包工具获取cookie值,将该值封装headers字典中 【不建议】


  • 自动处理:

cookie值的来源是 :发送登录请求时,服务端返回的

session会话对象:**

  • 作用:可以进行请求的发送。


  • 如果请求过程中产生的cookie则该cookie会被自动存储/携带该session中


  1. 创建一个session对象 **session = request.Session()**

  2. 使用session对象进行模拟登录post 请求的发送(cookie会被存储到session中)


  1. 使用已经存储cookiesession对象对个人主页对应的url进行get请求发送


往往在进行模拟登录的时候 都会需要处理cookie, 所以 如果是模拟登录 就是用session.post()方法**

  1. # 获取session对象
  2. login_session = requests.Session()
  3. # 使用session对象发送post请求,服务器返回得到cookie会自动保存
  4. login_response = login_session.post(url=login_url, data=form_data, headers=headers)
  5. # 个人信息的url
  6. my_info_url = "http://www.renren.com/975495839/profile"
  7. # 获得个人信息的响应信息 使用session发送,会自动登录时服务器返回的cookie信息
  8. my_info_response = login_session.get(my_info_url, headers=headers)

三、模拟登陆

1、模拟登录古诗词网

  1. import requests
  2. from lxml import etree
  3. from chaojiying import Chaojiying_Client
  4. if __name__ == '__main__':
  5. url = "https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx"
  6. headers = {
  7. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  8. "Chrome/85.0.4183.121 Safari/537.36 "
  9. }
  10. # 进行第一次爬取,获得页面数据
  11. response = requests.get(url, headers=headers)
  12. # 生成tree
  13. page_tree = etree.HTML(response.text)
  14. # 解析出来验证码的src属性
  15. img_src = page_tree.xpath("//img[@id='imgCode']/@src")[0]
  16. # 拼接出完整的url
  17. img_url = "https://so.gushiwen.cn" + img_src
  18. # 发送请求,获取验证码数据
  19. img_response = requests.get(img_url)
  20. file_name = "./验证码/yzm.jpg"
  21. # 将验证码写入到文件中
  22. with open(file_name, "wb") as fp:
  23. fp.write(img_response.content)
  24. """
  25. 使用超级鹰来分析验证码
  26. 导入chaojiying.py中的class | from chaojiying import Chaojiying_Client
  27. 创建对象
  28. 调用他的postPic方法
  29. """
  30. chaojiying = Chaojiying_Client('qq2298320493', 'qq2298320493', '910477') # 用户中心>>软件ID 生成一个替换 96001
  31. im = open(file_name, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  32. # 得到验证码
  33. yzm = chaojiying.PostPic(im, 1902)['pic_str'] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
  34. print("验证码为 %s" % yzm)
  35. # 模拟登录
  36. login_url = "https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx"
  37. # 模拟表单登录信息
  38. login_form = {
  39. "__VIEWSTATE":"n05Ff/p8USORrfg5Tr/ZTleMtid6oM5CwmqZJlmPa3iLd0wVKLTc0VuqlTsdxpG3GNB"
  40. "/301JfVDcWnmUUwxZ8WwhSPdzCzqOHl3aHmiyu9uO6Z94Ks6HbhtuOW4=",
  41. "__VIEWSTATEGENERATOR": "C93BE1AE",
  42. "from": "http://so.gushiwen.cn/user/collect.aspx",
  43. "email": "2298320493@qq.com",
  44. "pwd": "qq2298320493",
  45. "code": yzm, # 验证码信息
  46. "denglu": "登录"
  47. }
  48. response = requests.post(login_url, data=login_form, headers=headers)
  49. with open("./login_rigth.html", "w", encoding="utf-8") as fp:
  50. fp.write(response.text)
  51. print(img_src)
  52. print(response.status_code)
  53. print("模拟登录完毕")

2、模拟登录人人网

  1. import requests
  2. from lxml import etree
  3. from chaojiying import Chaojiying_Client
  4. if __name__ == '__main__':
  5. url = "http://www.renren.com/SysHome.do"
  6. headers = {
  7. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  8. "Chrome/85.0.4183.121 Safari/537.36 "
  9. }
  10. response = requests.get(url, headers=headers)
  11. page_tree = etree.HTML(response.text)
  12. img_url = page_tree.xpath("//img[@id='verifyPic_login']/@src")[0]
  13. # 向验证码图片发送请求,下载图片
  14. img_response = requests.get(img_url, headers=headers)
  15. # 将获取的图片二进制数据 下载下来
  16. with open("./验证码/renrenyzm.jpg", "wb") as fp:
  17. fp.write(img_response.content)
  18. # 使用超级鹰 将验证码解析出来
  19. chaojiying = Chaojiying_Client('qq2298320493', 'qq2298320493', '910477') # 用户中心>>软件ID 生成一个替换 96001
  20. im = open('./验证码/renrenyzm.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  21. yzm_text = chaojiying.PostPic(im, 1006)['pic_str'] # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
  22. print("验证码为 %s" % yzm_text)
  23. # 发送post请求,模拟登录
  24. login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20201101556901"
  25. form_data = {
  26. "email": "17631503981",
  27. "icode": yzm_text,
  28. "origURL": " http://www.renren.com/975495839",
  29. "domain": "renren.com",
  30. "key_id": "1",
  31. "captcha_type": "web_login",
  32. "password": "7ee96119aec1653e5991bddba7b529d4dd7097338fe06708a60fc22618701376",
  33. "rkey": "039f51e435d2e317427e5feee225aa83",
  34. "f": ""
  35. }
  36. reponse = requests.post(url=login_url, data=form_data, headers=headers)
  37. with open("./人人网模拟登录.html", "w", encoding="utf-8") as fp:
  38. fp.write(response.text)
  39. print(response.status_code)