crawler.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import json
  2. from .utils import get_page
  3. from pyquery import PyQuery as pq
  4. class ProxyMetaclass(type):
  5. def __new__(cls, name, bases, attrs):
  6. count = 0
  7. attrs['__CrawlFunc__'] = []
  8. for k, v in attrs.items():
  9. if 'crawl_' in k:
  10. attrs['__CrawlFunc__'].append(k)
  11. count += 1
  12. attrs['__CrawlFuncCount__'] = count
  13. return type.__new__(cls, name, bases, attrs)
  14. class Crawler(object, metaclass=ProxyMetaclass):
  15. def get_proxies(self, callback):
  16. proxies = []
  17. for proxy in eval("self.{}()".format(callback)):
  18. print('成功获取到代理', proxy)
  19. proxies.append(proxy)
  20. return proxies
  21. def crawl_daxiang(self):
  22. url = 'http://vtp.daxiangdaili.com/ip/?tid=555546364094534&num=100'
  23. html = get_page(url)
  24. if html:
  25. urls = html.split('\n')
  26. for url in urls:
  27. yield url
  28. def crawl_kuaidaili(self):
  29. url = 'http://dev.kuaidaili.com/api/getproxy/?orderid=959961765125099&num=100&b_pcchrome=1&b_pcie=1&b_pcff=1&protocol=1&method=1&an_an=1&an_ha=1&quality=1&format=json&sep=2'
  30. html = get_page(url)
  31. if html:
  32. result = json.loads(html)
  33. ips = result.get('data').get('proxy_list')
  34. for ip in ips:
  35. yield ip
  36. def crawl_daili66(self, page_count=4):
  37. """
  38. 获取代理66
  39. :param page_count:
  40. :return:
  41. """
  42. start_url = 'http://www.66ip.cn/{}.html'
  43. urls = [start_url.format(page) for page in range(1, page_count + 1)]
  44. for url in urls:
  45. print('Crawling', url)
  46. html = get_page(url)
  47. if html:
  48. doc = pq(html)
  49. trs = doc('.containerbox table tr:gt(0)').items()
  50. for tr in trs:
  51. ip = tr.find('td:nth-child(1)').text()
  52. port = tr.find('td:nth-child(2)').text()
  53. yield ':'.join([ip, port])
  54. def crawl_proxy360(self):
  55. """
  56. 获取Proxy360
  57. :return:
  58. """
  59. start_url = 'http://www.proxy360.cn/Region/China'
  60. print('Crawling', start_url)
  61. html = get_page(start_url)
  62. if html:
  63. doc = pq(html)
  64. lines = doc('div[name="list_proxy_ip"]').items()
  65. for line in lines:
  66. ip = line.find('.tbBottomLine:nth-child(1)').text()
  67. port = line.find('.tbBottomLine:nth-child(2)').text()
  68. yield ':'.join([ip, port])
  69. def crawl_goubanjia(self):
  70. """
  71. 获取Goubanjia
  72. :return:
  73. """
  74. start_url = 'http://www.goubanjia.com/free/gngn/index.shtml'
  75. html = get_page(start_url)
  76. if html:
  77. doc = pq(html)
  78. tds = doc('td.ip').items()
  79. for td in tds:
  80. td.find('p').remove()
  81. yield td.text().replace(' ', '')