webRequest.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. # -*- coding: utf-8 -*-
  2. """
  3. -------------------------------------------------
  4. File Name: WebRequest
  5. Description : Network Requests Class
  6. Author : J_hao
  7. date: 2017/7/31
  8. -------------------------------------------------
  9. Change Activity:
  10. 2017/7/31:
  11. -------------------------------------------------
  12. """
  13. __author__ = 'J_hao'
  14. from requests.models import Response
  15. from lxml import etree
  16. import requests
  17. import random
  18. import time
  19. from handler.logHandler import LogHandler
  20. requests.packages.urllib3.disable_warnings()
  21. class WebRequest(object):
  22. name = "web_request"
  23. def __init__(self, *args, **kwargs):
  24. self.log = LogHandler(self.name, file=False)
  25. self.response = Response()
  26. @property
  27. def user_agent(self):
  28. """
  29. return an User-Agent at random
  30. :return:
  31. """
  32. ua_list = [
  33. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101',
  34. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122',
  35. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71',
  36. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95',
  37. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71',
  38. 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
  39. 'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
  40. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
  41. ]
  42. return random.choice(ua_list)
  43. @property
  44. def header(self):
  45. """
  46. basic header
  47. :return:
  48. """
  49. return {'User-Agent': self.user_agent,
  50. 'Accept': '*/*',
  51. 'Connection': 'keep-alive',
  52. 'Accept-Language': 'zh-CN,zh;q=0.8'}
  53. def get(self, url, header=None, retry_time=5, retry_interval=5, timeout=10, *args, **kwargs):
  54. """
  55. get method
  56. :param url: target url
  57. :param header: headers
  58. :param retry_time: retry time
  59. :param retry_interval: retry interval
  60. :param timeout: network timeout
  61. :return:
  62. """
  63. headers = self.header
  64. if header and isinstance(header, dict):
  65. headers.update(header)
  66. while True:
  67. try:
  68. self.response = requests.get(url, headers=headers, timeout=timeout, *args, **kwargs)
  69. return self
  70. except Exception as e:
  71. self.log.error("requests: %s error: %s" % (url, str(e)))
  72. retry_time -= 1
  73. if retry_time <= 0:
  74. resp = Response()
  75. resp.status_code = 200
  76. return self
  77. self.log.info("retry %s second after" % retry_interval)
  78. time.sleep(retry_interval)
  79. @property
  80. def tree(self):
  81. return etree.HTML(self.response.content)
  82. @property
  83. def text(self):
  84. return self.response.text