utilFunction.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. -------------------------------------------------
  5. File Name: utilFunction.py
  6. Description : tool function
  7. Author : JHao
  8. date: 2016/11/25
  9. -------------------------------------------------
  10. Change Activity:
  11. 2016/11/25: 添加robustCrawl、verifyProxy、getHtmlTree
  12. -------------------------------------------------
  13. """
  14. import requests
  15. import time
  16. from lxml import etree
  17. from Util.LogHandler import LogHandler
  18. from Util.WebRequest import WebRequest
  19. # logger = LogHandler(__name__, stream=False)
  20. # noinspection PyPep8Naming
  21. def robustCrawl(func):
  22. def decorate(*args, **kwargs):
  23. try:
  24. return func(*args, **kwargs)
  25. except Exception as e:
  26. pass
  27. # logger.info(u"sorry, 抓取出错。错误原因:")
  28. # logger.info(e)
  29. return decorate
  30. # noinspection PyPep8Naming
  31. def verifyProxyFormat(proxy):
  32. """
  33. 检查代理格式
  34. :param proxy:
  35. :return:
  36. """
  37. import re
  38. verify_regex = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}"
  39. _proxy = re.findall(verify_regex, proxy)
  40. return True if len(_proxy) == 1 and _proxy[0] == proxy else False
  41. # noinspection PyPep8Naming
  42. def getHtmlTree(url, **kwargs):
  43. """
  44. 获取html树
  45. :param url:
  46. :param kwargs:
  47. :return:
  48. """
  49. header = {'Connection': 'keep-alive',
  50. 'Cache-Control': 'max-age=0',
  51. 'Upgrade-Insecure-Requests': '1',
  52. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko)',
  53. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  54. 'Accept-Encoding': 'gzip, deflate, sdch',
  55. 'Accept-Language': 'zh-CN,zh;q=0.8',
  56. }
  57. # TODO 取代理服务器用代理服务器访问
  58. wr = WebRequest()
  59. # delay 2s for per request
  60. time.sleep(2)
  61. html = wr.get(url=url, header=header).content
  62. return etree.HTML(html)
  63. def tcpConnect(proxy):
  64. """
  65. TCP 三次握手
  66. :param proxy:
  67. :return:
  68. """
  69. from socket import socket, AF_INET, SOCK_STREAM
  70. s = socket(AF_INET, SOCK_STREAM)
  71. ip, port = proxy.split(':')
  72. result = s.connect_ex((ip, int(port)))
  73. return True if result == 0 else False
  74. # noinspection PyPep8Naming
  75. def validUsefulProxy(proxy):
  76. """
  77. 检验代理是否可用
  78. :param proxy:
  79. :return:
  80. """
  81. if isinstance(proxy, bytes):
  82. proxy = proxy.decode('utf8')
  83. proxies = {"http": "http://{proxy}".format(proxy=proxy)}
  84. try:
  85. # 超过20秒的代理就不要了
  86. r = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10, verify=False)
  87. if r.status_code == 200 and r.headers['content-type'].lower().find('application/json') != -1 and r.json()['origin']:
  88. # logger.info('%s is ok' % proxy)
  89. return True
  90. except Exception as e:
  91. # logger.error(str(e))
  92. return False