开源项目:https://github.com/SpiderClub/haipproxy,看爬代理的网址列表应该是最多的。
CRAWLER_TASKS = [
{
'name': 'mogumiao.com',
'resource': ['http://www.mogumiao.com/proxy/free/listFreeIp',
'http://www.mogumiao.com/proxy/api/freeIp?count=15'],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'json',
'parse_rule': {
'detail_rule': ['msg'],
'ip_key': 'ip',
'port_key': 'port',
},
'interval': 5,
'enable': 1,
},
{
# now we can't get proxies from it,but it required by ip181
'name': 'xdaili.cn',
'resource': ['http://www.xdaili.cn:80/ipagent/freeip/getFreeIps?page=1&rows=10'],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'json',
'parse_rule': {
'detail_rule': ['RESULT'],
'ip_key': 'ip',
'port_key': 'port',
},
'interval': 10,
'enable': 0,
},
{
'name': 'xicidaili.com',
'resource': ['http://www.xicidaili.com/nn/%s' % i for i in range(1, 6)] +
['http://www.xicidaili.com/wn/%s' % i for i in range(1, 6)] +
['http://www.xicidaili.com/wt/%s' % i for i in range(1, 6)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1
},
{
'name': 'kuaidaili.com',
'resource': ['https://www.kuaidaili.com/free/inha/%s' % i for i in range(1, 6)] +
['https://www.kuaidaili.com/proxylist/%s' % i for i in range(1, 11)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 4,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1
},
{
'name': 'kxdaili.com',
'resource': [
'http://www.kxdaili.com/dailiip/%s/%s.html#ip' % (i, j) for i in range(1, 3) for j in range(1, 11)
],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1
},
{
'name': 'mrhinkydink.com',
'resource': ['http://www.mrhinkydink.com/proxies.htm'],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'css',
'pre_extract': '.text',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 2 * 60,
'enable': 1,
},
{
'name': 'nianshao.me',
'resource': ['http://www.nianshao.me/?stype=1&page=%s' % i for i in range(1, 11)] +
['http://www.nianshao.me/?stype=2&page=%s' % i for i in range(1, 11)] +
['http://www.nianshao.me/?stype=5&page=%s' % i for i in range(1, 11)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1 # it seems the website is down
},
{
'name': '66ip.cn',
'resource': ['http://www.66ip.cn/%s.html' % i for i in range(1, 3)] +
['http://www.66ip.cn/areaindex_%s/%s.html' % (i, j)
for i in range(1, 35) for j in range(1, 3)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 4,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 2 * 60,
'enable': 1
},
{
'name': 'baizhongsou.com',
'resource': ['http://ip.baizhongsou.com/'],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': True,
'protocols': None
},
'interval': 30,
'enable': 1
},
{
'name': 'data5u.com',
'resource': [
'http://www.data5u.com/free/index.shtml',
'http://www.data5u.com/free/gngn/index.shtml',
'http://www.data5u.com/free/gwgn/index.shtml'
],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//ul[contains(@class, "l2")]',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'span li::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 10,
'enable': 1,
},
{
# can not access
'name': 'httpsdaili.com',
'resource': ['http://www.httpsdaili.com/?stype=1&page=%s' % i for i in range(1, 8)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr[contains(@class, "odd")]',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 3 * 60,
'enable': 0,
},
{
'name': 'ip181.com',
'resource': ['http://www.ip181.com/'] +
['http://www.ip181.com/daili/%s.html' % i for i in range(1, 20)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 10,
'enable': 1,
},
{
'name': 'ip3366.net',
'resource': ['http://www.ip3366.net/free/?stype=1&page=%s' % i for i in range(1, 3)] +
['http://www.ip3366.net/free/?stype=3&page=%s' % i for i in range(1, 3)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 30,
'enable': 1
},
{
'name': 'iphai.com',
'resource': [
'http://www.iphai.com/free/ng',
'http://www.iphai.com/free/wg',
'http://www.iphai.com/free/np',
'http://www.iphai.com/free/wp',
'http://www.iphai.com/'
],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'swei360.com',
'resource': ['http://www.swei360.com/free/?page=%s' % i for i in range(1, 4)] +
['http://www.swei360.com/free/?stype=3&page=%s' % i for i in range(1, 4)],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 30,
'enable': 1,
},
{
'name': 'yundaili.com',
'resource': [
'http://www.yun-daili.com/free.asp?stype=1',
'http://www.yun-daili.com/free.asp?stype=2',
'http://www.yun-daili.com/free.asp?stype=3',
'http://www.yun-daili.com/free.asp?stype=4',
],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr[contains(@class, "odd")]',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 6 * 60,
'enable': 1,
},
{
'name': 'ab57.ru',
'resource': ['http://ab57.ru/downloads/proxyold.txt'],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'text',
'parse_rule': {
'pre_extract': None,
'delimiter': '\r\n',
'redundancy': None,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'proxylists.net',
'resource': ['http://www.proxylists.net/http_highanon.txt'],
'parse_type': 'text',
'task_queue': SPIDER_COMMON_TASK,
'parse_rule': {
'pre_extract': None,
'delimiter': '\r\n',
'redundancy': None,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'my-proxy.com',
'resource': [
'https://www.my-proxy.com/free-elite-proxy.html',
'https://www.my-proxy.com/free-anonymous-proxy.html',
'https://www.my-proxy.com/free-socks-4-proxy.html',
'https://www.my-proxy.com/free-socks-5-proxy.html'
],
'task_queue': SPIDER_COMMON_TASK,
# if the parse method is specified, set it in the Spider's parser_maps
'parse_type': 'myproxy',
'interval': 60,
'enable': 1,
}, {
'name': 'us-proxy.org',
'resource': ['https://www.us-proxy.org/'],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tbody//tr',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'socks-proxy.net',
'resource': [
'https://www.socks-proxy.net/',
],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tbody//tr',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'sslproxies.org/',
'resource': ['https://www.sslproxies.org/'],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tbody//tr',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'atomintersoft.com',
'resource': [
'http://www.atomintersoft.com/high_anonymity_elite_proxy_list',
'http://www.atomintersoft.com/anonymous_proxy_list',
],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': True,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'rmccurdy.com',
'resource': [
'https://www.rmccurdy.com/scripts/proxy/good.txt'
],
'task_queue': SPIDER_COMMON_TASK,
'parse_type': 'text',
'parse_rule': {
'pre_extract': None,
'delimiter': '\n',
'redundancy': None,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
# there are some problems using crawlspider, so we use basic spider
'name': 'coderbusy.com',
'resource': ['https://proxy.coderbusy.com/'] +
['https://proxy.coderbusy.com/classical/https-ready.aspx?page=%s' % i for i in range(1, 21)] +
['https://proxy.coderbusy.com/classical/post-ready.aspx?page=%s' % i for i in range(1, 21)] +
['https://proxy.coderbusy.com/classical/anonymous-type/anonymous.aspx?page=%s'
% i for i in range(1, 6)] +
['https://proxy.coderbusy.com/classical/anonymous-type/highanonymous.aspx?page=%s'
% i for i in range(1, 6)] +
['https://proxy.coderbusy.com/classical/country/cn.aspx?page=%s' % i for i in range(1, 21)] +
['https://proxy.coderbusy.com/classical/country/us.aspx?page=%s' % i for i in range(1, 11)] +
['https://proxy.coderbusy.com/classical/country/id.aspx?page=%s' % i for i in range(1, 6)] +
['https://proxy.coderbusy.com/classical/country/ru.aspx?page=%s' % i for i in range(1, 6)],
'task_queue': SPIDER_AJAX_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 1,
'port_pos': 2,
'extract_protocol': False,
'split_detail': False,
'protocols': None
},
'interval': 2 * 60,
'enable': 1,
},
{
'name': 'proxydb.net',
'resource': ['http://proxydb.net/?offset=%s' % (15 * i) for i in range(20)],
'task_queue': SPIDER_AJAX_TASK,
'parse_type': 'common',
'parse_rule': {
'detail_rule': 'a::text',
'split_detail': True,
},
'interval': 3 * 60,
'enable': 1,
},
{
'name': 'cool-proxy.net',
'resource': ['https://www.cool-proxy.net/proxies/http_proxy_list/country_code:/port:/anonymous:1/page:%s'
% i for i in range(1, 11)],
'task_queue': SPIDER_AJAX_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': -1,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 30,
'enable': 1,
},
{
'name': 'goubanjia.com',
'resource': ['http://www.goubanjia.com/'],
'task_queue': SPIDER_AJAX_TASK,
'parse_type': 'goubanjia',
'interval': 10,
'enable': 1,
},
{
'name': 'cn-proxy.com',
'resource': [
'http://cn-proxy.com/',
'http://cn-proxy.com/archives/218'
],
'task_queue': SPIDER_GFW_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tbody//tr',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'free-proxy-list.net',
'resource': [
'https://free-proxy-list.net/',
'https://free-proxy-list.net/uk-proxy.html',
'https://free-proxy-list.net/anonymous-proxy.html',
],
'task_queue': SPIDER_GFW_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tbody//tr',
'infos_pos': 0,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'xroxy',
'resource': ['http://www.xroxy.com/proxylist.php?port=&type=&ssl=&country=&latency=&reliability=&'
'sort=reliability&desc=true&pnum=%s#table' % i for i in range(20)],
'task_queue': SPIDER_GFW_TASK,
'parse_type': 'xroxy',
'interval': 60,
'enable': 1,
},
{
'name': 'proxylistplus',
'resource': [
'http://list.proxylistplus.com/Fresh-HTTP-Proxy-List-1',
'http://list.proxylistplus.com/SSL-List-1'
],
'task_queue': SPIDER_GFW_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr[contains(@class, "cells")]',
'infos_pos': 1,
'infos_end': -1,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': False,
'split_detail': False,
'protocols': None
},
'interval': 3 * 60,
'enable': 1,
},
{
'name': 'cnproxy.com',
'resource': ['http://www.cnproxy.com/proxy%s.html' % i for i in range(1, 11)] +
['http://www.cnproxy.com/proxyedu%s.html' % i for i in range(1, 3)],
'task_queue': SPIDER_AJAX_GFW_TASK,
'parse_type': 'cnproxy',
'interval': 60,
'enable': 1,
},
{
'name': 'free-proxy.cz',
'resource': ['http://free-proxy.cz/en/proxylist/main/%s' % i for i in range(1, 30)],
'task_queue': SPIDER_AJAX_GFW_TASK,
'parse_type': 'free-proxy',
'interval': 3 * 60,
'enable': 1,
},
{
'name': 'proxy-list.org',
'resource': ['https://proxy-list.org/english/index.php?p=%s' % i for i in range(1, 11)],
'task_queue': SPIDER_AJAX_GFW_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'css',
'pre_extract': '.table ul',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'li::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': True,
'protocols': None
},
'interval': 60,
'enable': 1,
},
{
'name': 'gatherproxy',
'resource': [
'http://www.gatherproxy.com/',
'http://www.gatherproxy.com/proxylist/anonymity/?t=Elite',
'http://www.gatherproxy.com/proxylist/anonymity/?t=Anonymous',
'http://www.gatherproxy.com/proxylist/country/?c=China',
'http://www.gatherproxy.com/proxylist/country/?c=Brazil',
'http://www.gatherproxy.com/proxylist/country/?c=Indonesia',
'http://www.gatherproxy.com/proxylist/country/?c=Russia',
'http://www.gatherproxy.com/proxylist/country/?c=United%20States',
'http://www.gatherproxy.com/proxylist/country/?c=Thailand',
'http://www.gatherproxy.com/proxylist/port/8080',
'http://www.gatherproxy.com/proxylist/port/3128',
'http://www.gatherproxy.com/proxylist/port/80',
'http://www.gatherproxy.com/proxylist/port/8118'
],
'task_queue': SPIDER_AJAX_GFW_TASK,
'parse_type': 'common',
'parse_rule': {
'pre_extract_method': 'xpath',
'pre_extract': '//tr',
'infos_pos': 1,
'infos_end': None,
'detail_rule': 'td::text',
'ip_pos': 0,
'port_pos': 1,
'extract_protocol': True,
'split_detail': False,
'protocols': None
},
'interval': 60,
'enable': 1,
},
] # crawler will fetch tasks from the following queues
CRAWLER_TASK_MAPS = {
'common': SPIDER_COMMON_TASK,
'ajax': SPIDER_AJAX_TASK,
'gfw': SPIDER_GFW_TASK,
'ajax_gfw': SPIDER_AJAX_GFW_TASK
} # validator scheduler will fetch tasks from resource queue and store into task queue
VALIDATOR_TASKS = [
{
'name': 'http',
'task_queue': TEMP_HTTP_QUEUE,
'resource': VALIDATED_HTTP_QUEUE,
'interval': 5, # 20 minutes
'enable': 1,
},
{
'name': 'https',
'task_queue': TEMP_HTTPS_QUEUE,
'resource': VALIDATED_HTTPS_QUEUE,
'interval': 5,
'enable': 1,
},
{
'name': 'weibo',
'task_queue': TEMP_WEIBO_QUEUE,
'resource': VALIDATED_WEIBO_QUEUE,
'interval': 5,
'enable': 1,
},
{
'name': 'zhihu',
'task_queue': TEMP_ZHIHU_QUEUE,
'resource': VALIDATED_ZHIHU_QUEUE,
'interval': 5,
'enable': 1,
},
] # validators will fetch proxies from the following queues
TEMP_TASK_MAPS = {
'init': INIT_HTTP_QUEUE,
'http': TEMP_HTTP_QUEUE,
'https': TEMP_HTTPS_QUEUE,
'weibo': TEMP_WEIBO_QUEUE,
'zhihu': TEMP_ZHIHU_QUEUE
} # target website that use http protocol
HTTP_TASKS = ['http'] # target website that use https protocol
HTTPS_TASKS = ['https', 'zhihu', 'weibo'] # todo the three maps may be combined in one map
# validator scheduler and clients will fetch proxies from the following queues
SCORE_MAPS = {
'http': VALIDATED_HTTP_QUEUE,
'https': VALIDATED_HTTPS_QUEUE,
'weibo': VALIDATED_WEIBO_QUEUE,
'zhihu': VALIDATED_ZHIHU_QUEUE
} # validator scheduler and clients will fetch proxies from the following queues which are verified recently
TTL_MAPS = {
'http': TTL_HTTP_QUEUE,
'https': TTL_HTTPS_QUEUE,
'weibo': TTL_WEIBO_QUEUE,
'zhihu': TTL_ZHIHU_QUEUE
} SPEED_MAPS = {
'http': SPEED_HTTP_QUEUE,
'https': SPEED_HTTPS_QUEUE,
'weibo': SPEED_WEIBO_QUEUE,
'zhihu': SPEED_ZHIHU_QUEUE
}
因为项目参考了Github上开源的各个爬虫代理的实现,参考了下面的项目:
开源项目:https://github.com/TimoGroom/IPProxys
突破反爬虫的利器:开源IP代理池【转】
突破反爬虫的一个常用做法是使用代理IP,可以是作为初学者或者个人来说,买一些代理ip成本稍微高一些,因此最近写了一个开源项目IPProxys,用来为个人提供代理ip。
IPProxys原理:通过爬取各大代理网站提供的免费IP,进行去重,并验证ip的可用性,将有效的ip存储到sqlite中,并提供一个HTTP接口供爬虫程序获取ip。
IPProxys项目已经上传到github中,链接为/qiyeboy/IPProxys。下面对整个项目工程进行一下说明,如下图所示:
api包:主要是实现http服务器,提供api接口(通过get请求,返回json数据)
data文件夹:主要是数据库文件的存储位置和qqwry.dat(可以查询换ip软件的地理位置)
db包:主要是封装了一些数据库的操作
spider包:主要是爬虫的核心功能,爬取代理网站上的代理ip
test包:测试一些用例,不参与整个项目的运行
util包:提供一些工具类。查询ip的地理位置
validator包:用来测试ip地址是否可用
:主要是配置信息(包括配置ip地址的解析方式和数据库的配置)
整个项目的代码量不大,大家可以根据自己的需求进行修改,也可以提出自己的想法和建议帮助我改进这个项目。
如何使用IPProxys项目呢?
1.将项目目录clone到当前文件夹 $gitclone
2.切换工程目录 $cdIPProxys
3.运行脚本 windows上运行效果如下图所示:
项目依赖项:
需要安装sqlite数据库
安装requests库:pipinstallrequests
安装lxml:apt-getinstallpython-lxml
当IPProxys运行起来后,外部的爬虫如何获取ip呢? 外部的爬虫只需要向IPProxys所在主机的8000端口发送GET请求即可。GET请求的参数为:
访问http://127.0.0.1:8000/?types=0&count=5&country=中国这个链接的含义是获取5个ip地址在中国的高匿代理。
响应为JSON格式,返回数据为:
{"ip":"220.160.22.115","port":80},
{"ip":"183.129.151.130","port":80},
{"ip":"59.52.243.88","port":80},
{"ip":"112.228.35.24","port":8888},
{"ip":"106.75.176.4","port":80}
一般爬取到的有效ip大约有60个左右,基本上满足个人的需要。
看了下源码,爬的服务器列表如下:
parserList = [
{
'urls': ['http://m.66ip.cn/%s.html'% n for n in ['index']+range(2,12)],
'type':'xpath',
'pattern': ".//*[@class='profit-c']/table/tr[position()>1]",
'postion':{'ip':'./td[1]','port':'./td[2]','type':'./td[4]','protocol':''}
},
{
'urls': ['http://m.66ip.cn/areaindex_%s/%s.html'%(m,n) for m in range(1,35) for n in range(1,10)],
'type':'xpath',
'pattern': ".//*[@id='footer']/div/table/tr[position()>1]",
'postion':{'ip':'./td[1]','port':'./td[2]','type':'./td[4]','protocol':''}
},
{
'urls': ['http://www.kuaidaili.com/proxylist/%s/'% n for n in range(1,11)],
'type': 'xpath',
'pattern': ".//*[@id='index_free_list']/table/tbody/tr[position()>0]",
'postion':{'ip':'./td[1]','port':'./td[2]','type':'./td[3]','protocol':'./td[4]'}
},
{
'urls': ['http://www.kuaidaili.com/free/%s/%s/'% (m,n) for m in ['inha', 'intr', 'outha', 'outtr'] for n in range(1,11)],
'type':'xpath',
'pattern': ".//*[@id='list']/table/tbody/tr[position()>0]",
'postion':{'ip':'./td[1]','port':'./td[2]','type':'./td[3]','protocol':'./td[4]'}
},
{
'urls': ['http://www.cz88.net/proxy/%s'% m for m in ['index.shtml']+['http_%s.shtml' % n for n in range(2, 11)]],
'type':'xpath',
'pattern':".//*[@id='boxright']/div/ul/li[position()>1]",
'postion':{'ip':'./div[1]','port':'./div[2]','type':'./div[3]','protocol':''} },
{
'urls': ['http://www.ip181.com/daili/%s.html'% n for n in range(1, 11)],
'type':'xpath',
'pattern': ".//div[@class='row']/div[3]/table/tbody/tr[position()>1]",
'postion':{'ip':'./td[1]','port':'./td[2]','type':'./td[3]','protocol':'./td[4]'} },
{
'urls': ['http://www.xicidaili.com/%s/%s'%(m,n) for m in ['nn', 'nt', 'wn', 'wt'] for n in range(1, 8) ],
'type':'xpath',
'pattern': ".//*[@id='ip_list']/tr[position()>1]",
'postion':{'ip':'./td[2]','port':'./td[3]','type':'./td[5]','protocol':'./td[6]'}
},
{
'urls':['http://www.cnproxy.com/proxy%s.html'% i for i in range(1,11)],
'type':'module',
'moduleName':'CnproxyPraser',
'pattern':r'<tr><td>(\d+\.\d+\.\d+\.\d+)<SCRIPT type=text/javascript>document.write\(\"\:\"(.+)\)</SCRIPT></td><td>(HTTP|SOCKS4)\s*',
'postion':{'ip':0,'port':1,'type':-1,'protocol':2}
}
]
此外,https://www.baibianip.com/api/generatedymatic.html,有专门返回免费的ip代理列表,
什么是开放代理、私密代理、百变IP-Proxy、独享代理?有什么区别?
开放代理:是由全网扫描而来,就是别人搭建了代理服务器被我们扫到了拿来用,百变IP采用分布在全球各地的100台云服务器使用自行研发的扫描软件,借助于nmap工具+Lua,7*24*365不间断全网扫描、验证。开放代理的稳定性和速度等不如私密代理,对可靠性要求低的用户可以选择这个。
私密代理:非扫描而来的,而是百变IP租用中国各地资源,专门为客户搭建的代理通道,千万IP出口池,具有高匿、高速、稳定的特点。
独享代理:是私密代理的一种,只是当前服务器单独给指定的用户使用。
百变IP-Proxy:是私密代理的一种,是百变IP自主研发的一款分布式代理IP转发系统,统一入口,免提取,设置白名单即可使用,将请求智能转发到分布在全国各地的高匿代理服务器上,专为爬虫设计,超级方便。
。。。。
代理IP从哪找
由于开python培训有讲过爬虫的缘故,这个问题已经被ask无数次了,一般问的基友也都是爬虫防ban用的,那么在此,我把我个人尝试过的代理渠道都写一下。总体来讲,质量好的都不便宜,便宜的质量都比较渣,一分钱一分货
1)通过程序扫出来的代理
通过程序扫IP段、端口找出来的临时性代理。
诸如百度搜索“HTTP代理”,写着“每日更新”、“国内高匿免费”什么的都是这类,购买的话都很廉价。我用过的有:
西刺(免费代理IP_HTTP代理服务器IP_隐藏IP_QQ代理)
云代理(云代理 - 高速http代理ip每天更新)
......
基本都大同小异,没有哪个好那个坏,几个平台提供的代理至少有3成的重复率。
这类代理,有效期都不高,即便批量验证过在使用时还是会废掉一部分,可以应付低效率的采集、刷单次访问量,但是搞别的的还是算了吧
2)ADSL拨号服务器
ADSL拨号,断线重连切IP,淘宝有卖的,限定地区拨号、全国拨号都有。相对较稳定,至少比扫描出来的强很多,但切换IP耗时较长,需要几秒到1分钟之间。
所以如果采集是每访问一次切一次IP的话,效率会很慢,只能等当前IP被对方ban掉的时候在拨号换新的IP。
去年刷百度下拉、搞百度点击器的代理切换曾用过ADSL拨号,比较稳定,有些效果,当然也用过上面扫出来的代理,太烂,没法用。但是限于换IP需要断线重连,导致不容易并发执行任务,所以要大规模化要有些成本。
ADSL拨号可以应付对效率要求不高的采集、刷访问量、刷点击之类的。
3)第三方访问
比如通过“谷歌网页翻译”、“有道网页翻译”、“http代理浏览器”等第三方访问渠道请求目标网页。
速度慢,且采集捕获目标内容的时候多了很多干扰。
4)VPN软件
诸如“flyvpn”、“green vpn”,采集是IP被ban了直接换一个,VPN软件本身靠谱代理还是挺稳定的,就是人得在电脑旁边,手动换一次。但是偶尔查查几万关键词的百度排名、几万页面收录,用VPN还是挺悠闲的,这点量级总共也换不了多少次。
5)自建代理
买一台服务器,利用squid+stunnel搭建一台HTTP高匿代理服务器,Tinyproxy也行。squit用来实现http代理,stunnel在代理的基础上建一条隧道实现加密。
如果觉得ip数量少,就多买几台服务器,依次配置squid~~
由于是自建代理,都是独享且是真实的IP,所有相当稳定。采集、抢购、刷票、刷点击、刷主播人气什么的都可以干,只有有钱上机子就行~~
去年接了一个爬虫单子,抓国外某股票网站,共千万页面量级,反爬虫做的挺恶心,无奈买了20台低配机子做HTTP代理服务器,一个月5000成本~~
5)自建代理服务商
如果上面方法自己懒得搞,也没有关系。找个做类似服务的商家,开个api端口即可。
国外的有:
Crawlera ( Web Crawling Platform & Data as a Service )
......
国内的有:
阿步云(阿布云代理 - 最专业、最稳定、IP最丰富的高匿名HTTP代理IP提供商)
鲲鹏代理(IPRENT - 国内最专业稳定高匿独享HTTP代理解决方案提供商)
瀚云代理(瀚云代理 – http代理ip)
......
Crawlera和阿步云都用过,除了贵都挺好的,另外在请求频率和并发数上有限制。没办法,要一个ip共享给10个人,每个人并发100,费用又不涨,他们那边得赔死,光带宽费就海里去了。
下面的内容来自知乎:https://www.zhihu.com/question/47419361
换了很多家 芝麻(http://www.zhimaruanjian.com/pay/),站大爷(http://ip.zdaye.com/FreeIPlist.html?adr=%CF%E3%B8%DB,有免费的ip,少量),西刺 ,大象都用过,西刺,大象就不说了 辣鸡!!!!差点用吐血,站大爷 说实话 客服现在好多了 但是真心贵 ,贫民用不起,质量也就跟芝麻差不多。 前端时间上知乎看了篇软文,用了下别人推荐的蘑菇代理(吐槽下,现在网站怎么都叫些无厘头的名字。。) ,吐槽归吐槽,这家还真不错,性价比高,别说我打广告,确实不错,我自己现在主要在用http://www.mogumiao.com这家,芝麻备用(以防万一,站大爷这么牛逼都挂了好多次,我还是怕的,万一呢,不过暂时没发现有什么问题,可能是名气小所以才稳定吧)
现在代理IP网上一搜一大堆,因为我自己的业务需求我自己也在使用代理ip,现在用的是快代理我用的时间不能说很长,但是也有一段时间,基本现在网上代理我也都测试过,具体数据我没有闲时间去一个一个测,就是说一下这些的使用心得吧.
网上现在有芝麻代理,牛魔代理等一些今年刚上的代理,这些有心人自己仔细观察一下就能知道就是一家
还有西刺代理,站大爷,快代理,这几个都是某搜索引擎的自然排名前三个,还有之后的就不一一叙述了.
芝麻代理等很多客户端类型的代理ip提供商,这些类似于之前的被G掉的VPN,只不过他这个就是相当于国内的VPN吧
快代理,西刺代理,站大爷等适合开发者去做一些api调用,他们都有免费的,收费的ip,收费的肯定是比免费的好,这个毋庸置疑,不用想着空手套白狼的事情
这些地方的连接在下边.按需选择吧~
西刺代理 www.xicidaili.com
站大爷 www.zdaye.com
手动搬运dalao项目过来回答一下。
这个项目做了什么东西呢? dalao是这样写的:
DungProxy是一个代理IP服务,他包括一个代理IP资源server端和一系列适配中心IP资源得客户端。
server负责代理IP资源的收集维护。
client则是一系列方便用户使用得API,他屏蔽了代理IP下载、代理IP选取、IP绑定、IP切换等比较复杂逻辑。用户只需要引入client即可方便使用代理IP服务
简单来说:
server是一个代理IP爬虫,同时负责简单的数据清洗。
client本质是一个代理IP池,获取数据源之后,基于需要代理访问的网站在本地维护一个代理IP池供爬虫使用。
参考链接:
一只程序汪的自我修养 - 可能是一份没什么用的爬虫代理IP指南(分享自知乎网)https://zhuanlan.zhihu.com/p/25313283?utm_source=qq&utm_medium=social
先占个坑,现在正在写一个代理采集和校验相关程序,到时候开源出来给大伙用用
填坑来了。历时两个多月,目前终于完成了该代理项目。昨晚用知乎爬虫做了性能测试,测试结果如下
效果还不错。大家可以试用一下,好用给个star就行了。
项目地址:
都说好的代理,那我来喷一喷不好的代理吧。
1、站大爷,就是一个垃圾,骗子公司,其官网卖的那种代理扫描软件,根本没有扫描功能,就一个简单的验证功能,官网宣传说带扫描功能,其实根本不带,会技术抓包的同学可以自己去研究一下。
站大爷,客服态度蛮横,付款后有问题不退款直接加黑名单或者踢出群。
2、data5u,开放代理来来回回每天就返回那1000多个。都是重复的。
3、快代理,太贵了,不值。并且代理和data5u很多重复的。
刚开始用神箭手,实时API用起来还凑合,并发几十次,还可以。用了一段时间各种失败,并发几次都请求频率太高,找了几次客服被拉黑了,wtf...,果断弃用。
后来同事推荐了芝麻代理,因为时间紧,任务重,选了个按天不限ip的套餐,一天1500,速度哇哇的,并发几百上千的都不怕,就是略贵,虽然是公司的,但还是感觉肝儿疼,用了四天完成任务,弃用,据说18年涨到3000一天了。
好吧,拿人钱财替人消灾吧,自己写了个IP代理池,爬取网上免费的IP资源,效果还不错。顺便读了几天混淆过的js代码,找到了目标网站反爬策略的一个小漏洞,先凑合着用吧。
哎,这个事在这打个广告,真是有点难为情。
现在出来搞事情了, 做的就是这个方向。
与某几个省的运营商建立了非常密切的合作关系
机房也都是自己运营的
传送门在这里
也许、可能、似乎、我也不保证(逃)是目前市面上你能找到最稳定的代理了。
欢迎大家撩骚,手机号18129823435 :) 任何意见, 我都欢迎。
蟹蟹。
大家千万不要买芝麻代理!
大家千万不要买芝麻代理!
大家千万不要买芝麻代理!
我买了之后发现一个都不能用,然后要退钱,对方不退钱,垃圾公司
根据《*合同法》第一百一十二条之规定,当事人一方不履行合同义务或者履行合同义务不符合约定的,在履行义务或者采取补救措施后,对方还有其他损失的,应当赔偿损失。及《*消费者权益保护法》第二十条规定,经营者向消费者提供有关商品或者服务的质量、性能、用途、有效期限等信息,应当真实、全面,不得作虚假或者引人误解的宣传。该公司存在虚假宣传行为,必须承担相应的违约责任,必须退还给您相关的款项,并应支付违约金。
因此,我向您提出如下建议: 1.与客服沟通,告诉其上述法律依据,看是否能协商解决。 2.请求消费者协会或者依法成立的其他调解组织调解
3.向当地有关行政部门投诉; 4.向人民法院提起诉讼。
百变IP,稳定高匿,岂止于快。这不是软文,这就是直白的推荐!
https://www.baibianip.com/api/doc.htmlwww.baibianip.com百变IP 稳定高匿的私密代理IP
百变IP提供多种接入方式和接口;
方式一(统一入口,智能转发,免提取使用):使用百变IP-Proxy,统一入口,免提取,设置白名单即可使用,支持多种转发策略;
通道A:http://proxy.baibianip.com:8000 每次请求随机一个出口IP,每日3~8万可用IP,24小时均匀分布。
通道B:proxy.baibianip.com:8001~8020 这20个端口,每次请求都会固定一个出口IP,IP有效期1-5分钟。
方式二(通过API提取IP:Port列表后使用):用传统方式,使用动态私密代理
先提取后使用:可开通动态私密代理,通过API或者网页提取IP:Port列表后使用,接口可返回IP、Port、IP所在地区、剩余可用时间,支持自定义字段。每日3~8万可用IP,24小时均匀分布,IP有效期1-5分钟。
所有代理均为高匿私密代理,机房带宽、家庭IP,支持HTTPS、Keep-Alive、POST;
提示:代理均需设置IP白名单或使用用户名/密码认证后才可使用,白名单可通过用户中心手工设置,也可以通过API进行设置。
可以在你的机器上通过访问 http://proxy.baibianip.com:7000/getip.html 来获取当前你机器的出口IP。程序尽量部署到服务器跑,部分小区宽带有多个IP出口。
对于百变IP-Proxy来说,各通道调用方式完全一样,无需任何额外改造,只需在程序中控制请求端口号即可(比如用通道B的8001端口,现在想换一个IP当出口,只需换8002就好,无需发送换IP的命令给我们),简单方便,百变IP会自动切换后端出口IP,百变IP智能转发服务会根据后端服务器的心跳情况、负载情况、网络稳定性、IP分散度等综合因素根据算法智能转发。系统支持Keep-Alive。智能转发服务不会出现因为切换IP而出现服务不能用的情况,平滑切换。
一般来说百变IP-Proxy的通道A和B可以满足大部分使用场景;
作为一名资深程序狗,一直在做爬虫,用过很多的代理IP。比如 快代理、阿布云、百变IP、站大爷、F代理、data5u、讯代理之类的,他们各有优劣。
快代理就是贵,私密代理IP个数少,开放代理吧就那么多,也不稳定;
阿布云,连接数太少了;站大爷贵,体验也不好;
自己现在在用一家叫亿牛云的 个人感觉挺好的 还有免费测试http://ip.16yun.cn:817/reg_accounts/register/?sale_user=DSQ_1132032275