WebRequest.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. import requests
  15. import random
  16. import time
  17. class WebRequest(object):
  18. def __init__(self, *args, **kwargs):
  19. pass
  20. @property
  21. def user_agent(self):
  22. """
  23. return an User-Agent at random
  24. :return:
  25. """
  26. ua_list = [
  27. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101',
  28. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122',
  29. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71',
  30. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95',
  31. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71',
  32. 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
  33. 'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
  34. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
  35. ]
  36. return random.choice(ua_list)
  37. @property
  38. def header(self):
  39. """
  40. basic header
  41. :return:
  42. """
  43. return {'User-Agent': self.user_agent,
  44. 'Accept': '*/*',
  45. 'Connection': 'keep-alive',
  46. 'Accept-Language': 'zh-CN,zh;q=0.8'}
  47. def get(self, url, header=None, retry_time=5, timeout=30,
  48. retry_flag=list(), retry_interval=5, *args, **kwargs):
  49. """
  50. get method
  51. :param url: target url
  52. :param header: headers
  53. :param retry_time: retry time when network error
  54. :param timeout: network timeout
  55. :param retry_flag: if retry_flag in content. do retry
  56. :param retry_interval: retry interval(second)
  57. :param args:
  58. :param kwargs:
  59. :return:
  60. """
  61. headers = self.header
  62. if header and isinstance(header, dict):
  63. headers.update(header)
  64. while True:
  65. try:
  66. html = requests.get(url, headers=headers, timeout=timeout)
  67. # if filter(lambda key: key in html.content, retry_flag):
  68. # 原filter语句执行if判断所有情况均为True情况,python3与python2的区别?
  69. # python3中filter返回filter对象,即使为空,if会判断为True
  70. # python2中filter返回list对象,为空,if判断为False
  71. for f in retry_flag:
  72. if f in html.content:
  73. raise Exception
  74. return html
  75. except Exception as e:
  76. retry_time -= 1
  77. if retry_time <= 0:
  78. return
  79. time.sleep(retry_interval)