Python 爬取各大代理IP网站(元类封装)

 

import requests
from pyquery import PyQuery as pq
base_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
    'Accept-Encoding': 'gzip, deflate, sdch',
    'Accept-Language': 'zh-CN,zh;q=0.8'
}
def get_page(url):
    headers = dict(base_headers)
    print('Getting',url)
    try:
        r = requests.get(url,headers=headers)
        print('Getting result',url,r.status_code)
        if r.status_code == 200:
            return r.text
    except ConnectionError:
        pritn('Cramling Failed',url)
        return None
        


# 道生一:创建抽取代理的metaclass
class ProxyMetaclass(type):
    """
        元类,在FreeProxyGetter类中加入
        __CrawlName__,__CrawlFunc__和__CrawlFuncCount__
        三个参数,分别表示爬虫函数名,函数实例和爬虫函数的数量。
    """
    # __new__控制__init__的执行,所以在其执行之前
    # cls:代表要__init__的类,此参数在实例化时由Python解释器自动提供
    # name:类名
    # bases:代表继承父类的集合
    # attrs:类的方法及属性的集合
    def __new__(cls, name, bases, attrs):
        count = 0
        # 在attrs字典加入两个key,key的值是个列表
        attrs['__CrawlFunc__'] = []
        attrs['__CrawlName__'] = []
        for k, v in attrs.items():
            if 'crawl_' in k:
                attrs['__CrawlName__'].append(k) #函数名依次添加进attrs['__CrawlName__']列表
                attrs['__CrawlFunc__'].append(v) #函数实例依次添加进attrs['__CrawlFunc__']列表
                print(k,v)
                #print(attrs['__CrawlName__'])
                count += 1
        for k in attrs['__CrawlName__']:
            # 剔除原有的字典键值对
            attrs.pop(k)
        attrs['__CrawlFuncCount__'] = count
        print(attrs)
        return type.__new__(cls, name, bases, attrs)


# 一生二:创建代理获取类

class ProxyGetter(object, metaclass=ProxyMetaclass):
    def get_raw_proxies(self, site):
        proxies = []
        print('Site', site)
        for func in self.__CrawlFunc__:
            if func.__name__==site:
                this_page_proxies = func(self)
                for proxy in this_page_proxies:
                    print('Getting', proxy, 'from', site)
                    proxies.append(proxy)
          print(proxies)
return proxies def crawl_daili66(self, page_count=4): start_url = 'http://www.66ip.cn/{}.html' urls = [start_url.format(page) for page in range(1, page_count + 1)] # format和%s的用法一样 for url in urls: print('Crawling', url) html = get_page(url) if html: doc = pq(html) trs = doc('.containerbox table tr:gt(0)').items() for tr in trs: ip = tr.find('td:nth-child(1)').text() port = tr.find('td:nth-child(2)').text() yield ':'.join([ip, port])   ''' def crawl_proxy360(self): start_url = 'http://www.proxy360.cn/Region/China' print('Crawling', start_url) html = get_page(start_url) if html: doc = pq(html) lines = doc('div[name="list_proxy_ip"]').items() for line in lines: ip = line.find('.tbBottomLine:nth-child(1)').text() port = line.find('.tbBottomLine:nth-child(2)').text() yield ':'.join([ip, port])   ''' def crawl_goubanjia(self): start_url = 'http://www.goubanjia.com/free/gngn/index.shtml' html = get_page(start_url) if html: doc = pq(html) tds = doc('td.ip').items() for td in tds: td.find('p').remove() yield td.text().replace(' ', '') if __name__ == '__main__': # 二生三:实例化ProxyGetter crawler = ProxyGetter() print(crawler.__CrawlName__) # 三生万物 for site_label in range(crawler.__CrawlFuncCount__): site = crawler.__CrawlName__[site_label] # site_label是列表的索引值 myProxies = crawler.get_raw_proxies(site)

 

运行结果

D:\pythontest>python proxy_ip.py
crawl_goubanjia <function ProxyGetter.crawl_goubanjia at 0x00000000035D2510>
crawl_daili66 <function ProxyGetter.crawl_daili66 at 0x00000000035D2488>
{'__qualname__': 'ProxyGetter', '__module__': '__main__', '__CrawlName__': ['cra
wl_goubanjia', 'crawl_daili66'], '__CrawlFunc__': [<function ProxyGetter.crawl_g
oubanjia at 0x00000000035D2510>, <function ProxyGetter.crawl_daili66 at 0x000000
00035D2488>], 'get_raw_proxies': <function ProxyGetter.get_raw_proxies at 0x0000
0000035D2400>, '__CrawlFuncCount__': 2}
['crawl_goubanjia', 'crawl_daili66']
Site crawl_goubanjia
Getting http://www.goubanjia.com/free/gngn/index.shtml
Getting result http://www.goubanjia.com/free/gngn/index.shtml 403
[]
Site crawl_daili66
Crawling=== http://www.66ip.cn/1.html
Getting http://www.66ip.cn/1.html
Getting result http://www.66ip.cn/1.html 200
Getting 123.163.97.198:9999 from crawl_daili66
Getting 36.249.109.21:9999 from crawl_daili66
Getting 163.204.245.52:9999 from crawl_daili66
Getting 222.189.247.207:9999 from crawl_daili66
Getting 87.250.218.12:44168 from crawl_daili66
Getting 118.172.176.61:8080 from crawl_daili66
Getting 134.119.214.206:1080 from crawl_daili66
Getting 110.74.208.154:21776 from crawl_daili66
Crawling=== http://www.66ip.cn/2.html
Getting http://www.66ip.cn/2.html
Getting result http://www.66ip.cn/2.html 200
Getting 120.234.138.102:53779 from crawl_daili66
Getting 110.86.136.127:9999 from crawl_daili66
Getting 59.57.38.197:9999 from crawl_daili66
Getting 202.62.86.94:83 from crawl_daili66
Getting 210.22.176.146:37299 from crawl_daili66
Getting 180.183.136.212:8080 from crawl_daili66
Getting 183.87.153.98:49602 from crawl_daili66
Getting 222.124.2.186:8080 from crawl_daili66
Getting 123.169.126.9:3 from crawl_daili66
Getting 123.169.126.93:9999 from crawl_daili66
Getting 158.255.249.58:50100 from crawl_daili66
Getting 1.198.72.242:9999 from crawl_daili66
Crawling=== http://www.66ip.cn/3.html
Getting http://www.66ip.cn/3.html
Getting result http://www.66ip.cn/3.html 200
Getting 163.204.246.10:2 from crawl_daili66
Getting 186.159.112.6:53281 from crawl_daili66
Getting 163.204.246.102:9999 from crawl_daili66
Getting 88.87.72.72:8080 from crawl_daili66
Getting 193.169.118.6:53281 from crawl_daili66
Getting 196.216.220.204:36739 from crawl_daili66
Getting 185.109.62.124:808 from crawl_daili66
Getting 1.193.246.78:9999 from crawl_daili66
Getting 188.131.239.119:8118 from crawl_daili66
Getting 1.10.188.93:34871 from crawl_daili66
Getting 182.116.237.203:9999 from crawl_daili66
Getting 139.99.223.230:8080 from crawl_daili66
Crawling=== http://www.66ip.cn/4.html
Getting http://www.66ip.cn/4.html
Getting result http://www.66ip.cn/4.html 200
Getting 163.204.246.232:9999 from crawl_daili66
Getting 117.28.96.105:9999 from crawl_daili66
Getting 202.29.220.34:38961 from crawl_daili66
Getting 123.169.114.80:9999 from crawl_daili66
Getting 115.42.34.3:8080 from crawl_daili66
Getting 41.84.131.78:53281 from crawl_daili66
Getting 123.163.96.207:9999 from crawl_daili66
Getting 182.35.83.12:9999 from crawl_daili66
Getting 191.241.226.230:53281 from crawl_daili66
Getting 202.138.236.35:56413 from crawl_daili66
Getting 194.1.193.226:35646 from crawl_daili66
Getting 202.158.77.122:47284 from crawl_daili66

['123.163.97.198:9999', '36.249.109.21:9999', '163.204.245.52:9999', '222.189.247.207:9999', '87.250.218.12:44168',
'118.172.176.61:8080', '134.119.214.206:1080', '110.74.208.154:21776', '120.234.138.102:53779', '110.86.136.127:9999',
'59.57.38.197:9999', '202.62.86.94:83', '210.22.176.146:37299', '180.183.136.212:8080', '183.87.153.98:49602',
'222.124.2.186:8080', '123.169.126.9:3', '123.169.126.93:9999', '158.255.249.58:50100', '1.198.72.242:9999',
'163.204.246.10:2', '186.159.112.6:53281', '163.204.246.102:9999', '88.87.72.72:8080', '193.169.118.6:53281',
'185.109.62.124:808', '1.193.246.78:9999', '188.131.239.119:8118', '1.10.188.93:34871', '182.116.237.203:9999',
'139.99.223.230:8080', '163.204.246.232:9999', '117.28.96.105:9999', '202.29.220.34:38961', '123.169.114.80:9999',
'115.42.34.3:8080', '41.84.131.78:53281', '123.163.96.207:9999', '182.35.83.12:9999', '191.241.226.230:53281',
'202.138.236.35:56413', '194.1.193.226:35646','196.216.220.204:36739', '202.158.77.122:47284']


//看来只有一个代理网站能爬到数据

 

posted @ 2019-09-29 23:04  linyouyi  阅读(522)  评论(0编辑  收藏  举报