base.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import random
  2. from retrying import retry
  3. import requests
  4. from loguru import logger
  5. from proxypool.setting import GET_TIMEOUT
  6. class BaseCrawler(object):
  7. urls = []
  8. @property
  9. def user_agent(self):
  10. """
  11. return an User-Agent at random
  12. :return:
  13. """
  14. ua_list = [
  15. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101',
  16. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122',
  17. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71',
  18. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95',
  19. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71',
  20. 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
  21. 'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
  22. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
  23. ]
  24. return random.choice(ua_list)
  25. @property
  26. def header(self):
  27. """
  28. basic header
  29. :return:
  30. """
  31. return {'User-Agent': self.user_agent,
  32. 'Accept': '*/*',
  33. 'Connection': 'keep-alive',
  34. 'Accept-Language': 'zh-CN,zh;q=0.8'}
  35. @retry(stop_max_attempt_number=3, retry_on_result=lambda x: x is None, wait_fixed=2000)
  36. def fetch(self, url, **kwargs):
  37. try:
  38. kwargs.setdefault('timeout', GET_TIMEOUT)
  39. kwargs.setdefault('verify', False)
  40. response = requests.get(url,headers=self.header, **kwargs)
  41. if response.status_code == 200:
  42. response.encoding = 'utf-8'
  43. return response.text
  44. except requests.ConnectionError:
  45. return
  46. @logger.catch
  47. def crawl(self):
  48. """
  49. crawl main method
  50. """
  51. for url in self.urls:
  52. logger.info(f'fetching {url}')
  53. html = self.fetch(url)
  54. for proxy in self.parse(html):
  55. logger.info(f'fetched proxy {proxy.string()} from {url}')
  56. yield proxy