crawler.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import json
  2. import re
  3. from .utils import get_page
  4. from pyquery import PyQuery as pq
  5. class ProxyMetaclass(type):
  6. def __new__(cls, name, bases, attrs):
  7. count = 0
  8. attrs['__CrawlFunc__'] = []
  9. for k, v in attrs.items():
  10. if 'crawl_' in k:
  11. attrs['__CrawlFunc__'].append(k)
  12. count += 1
  13. attrs['__CrawlFuncCount__'] = count
  14. return type.__new__(cls, name, bases, attrs)
  15. class Crawler(object, metaclass=ProxyMetaclass):
  16. def get_proxies(self, callback):
  17. proxies = []
  18. for proxy in eval("self.{}()".format(callback)):
  19. print('成功获取到代理', proxy)
  20. proxies.append(proxy)
  21. return proxies
  22. def crawl_daili66(self, page_count=4):
  23. """
  24. 获取代理66
  25. :param page_count: 页码
  26. :return: 代理
  27. """
  28. start_url = 'http://www.66ip.cn/{}.html'
  29. urls = [start_url.format(page) for page in range(1, page_count + 1)]
  30. for url in urls:
  31. print('Crawling', url)
  32. html = get_page(url)
  33. if html:
  34. doc = pq(html)
  35. trs = doc('.containerbox table tr:gt(0)').items()
  36. for tr in trs:
  37. ip = tr.find('td:nth-child(1)').text()
  38. port = tr.find('td:nth-child(2)').text()
  39. yield ':'.join([ip, port])
  40. def crawl_ip3366(self):
  41. for page in range(1, 4):
  42. start_url = 'http://www.ip3366.net/free/?stype=1&page={}'.format(page)
  43. html = get_page(start_url)
  44. ip_address = re.compile('<tr>\s*<td>(.*?)</td>\s*<td>(.*?)</td>')
  45. # \s * 匹配空格,起到换行作用
  46. re_ip_address = ip_address.findall(html)
  47. for address, port in re_ip_address:
  48. result = address+':'+ port
  49. yield result.replace(' ', '')
  50. def crawl_kuaidaili(self):
  51. for i in range(1, 4):
  52. start_url = 'http://www.kuaidaili.com/free/inha/{}/'.format(i)
  53. html = get_page(start_url)
  54. if html:
  55. ip_address = re.compile('<td data-title="IP">(.*?)</td>')
  56. re_ip_address = ip_address.findall(html)
  57. port = re.compile('<td data-title="PORT">(.*?)</td>')
  58. re_port = port.findall(html)
  59. for address,port in zip(re_ip_address, re_port):
  60. address_port = address+':'+port
  61. yield address_port.replace(' ','')
  62. def crawl_xicidaili(self):
  63. for i in range(1, 3):
  64. start_url = 'http://www.xicidaili.com/nn/{}'.format(i)
  65. headers = {
  66. 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  67. 'Cookie':'_free_proxy_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJWRjYzc5MmM1MTBiMDMzYTUzNTZjNzA4NjBhNWRjZjliBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMUp6S2tXT3g5a0FCT01ndzlmWWZqRVJNek1WanRuUDBCbTJUN21GMTBKd3M9BjsARg%3D%3D--2a69429cb2115c6a0cc9a86e0ebe2800c0d471b3',
  68. 'Host':'www.xicidaili.com',
  69. 'Referer':'http://www.xicidaili.com/nn/3',
  70. 'Upgrade-Insecure-Requests':'1',
  71. }
  72. html = get_page(start_url, options=headers)
  73. if html:
  74. find_trs = re.compile('<tr class.*?>(.*?)</tr>', re.S)
  75. trs = find_trs.findall(html)
  76. for tr in trs:
  77. find_ip = re.compile('<td>(\d+\.\d+\.\d+\.\d+)</td>')
  78. re_ip_address = find_ip.findall(tr)
  79. find_port = re.compile('<td>(\d+)</td>')
  80. re_port = find_port.findall(tr)
  81. for address,port in zip(re_ip_address, re_port):
  82. address_port = address+':'+port
  83. yield address_port.replace(' ','')
  84. def crawl_ip3366(self):
  85. for i in range(1, 4):
  86. start_url = 'http://www.ip3366.net/?stype=1&page={}'.format(i)
  87. html = get_page(start_url)
  88. if html:
  89. find_tr = re.compile('<tr>(.*?)</tr>', re.S)
  90. trs = find_tr.findall(html)
  91. for s in range(1, len(trs)):
  92. find_ip = re.compile('<td>(\d+\.\d+\.\d+\.\d+)</td>')
  93. re_ip_address = find_ip.findall(trs[s])
  94. find_port = re.compile('<td>(\d+)</td>')
  95. re_port = find_port.findall(trs[s])
  96. for address,port in zip(re_ip_address, re_port):
  97. address_port = address+':'+port
  98. yield address_port.replace(' ','')
  99. def crawl_iphai(self):
  100. start_url = 'http://www.iphai.com/'
  101. html = get_page(start_url)
  102. if html:
  103. find_tr = re.compile('<tr>(.*?)</tr>', re.S)
  104. trs = find_tr.findall(html)
  105. for s in range(1, len(trs)):
  106. find_ip = re.compile('<td>\s+(\d+\.\d+\.\d+\.\d+)\s+</td>', re.S)
  107. re_ip_address = find_ip.findall(trs[s])
  108. find_port = re.compile('<td>\s+(\d+)\s+</td>', re.S)
  109. re_port = find_port.findall(trs[s])
  110. for address,port in zip(re_ip_address, re_port):
  111. address_port = address+':'+port
  112. yield address_port.replace(' ','')
  113. def crawl_data5u(self):
  114. start_url = 'http://www.data5u.com/free/gngn/index.shtml'
  115. headers = {
  116. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  117. 'Accept-Encoding': 'gzip, deflate',
  118. 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
  119. 'Cache-Control': 'max-age=0',
  120. 'Connection': 'keep-alive',
  121. 'Cookie': 'JSESSIONID=47AA0C887112A2D83EE040405F837A86',
  122. 'Host': 'www.data5u.com',
  123. 'Referer': 'http://www.data5u.com/free/index.shtml',
  124. 'Upgrade-Insecure-Requests': '1',
  125. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
  126. }
  127. html = get_page(start_url, options=headers)
  128. if html:
  129. ip_address = re.compile('<span><li>(\d+\.\d+\.\d+\.\d+)</li>.*?<li class=\"port.*?>(\d+)</li>', re.S)
  130. re_ip_address = ip_address.findall(html)
  131. for address, port in re_ip_address:
  132. result = address + ':' + port
  133. yield result.replace(' ', '')