有时候同一个IP去爬取同一网站上的内容,久了之后就会被该网站服务器屏蔽。解决方法就是更换IP。这个时候,在对方网站上,显示的不是我们真实地IP地址,而是代理服务器的IP地址。西刺代理http://www.xicidaili.com/nn/ 提供了很多可用的国内IP,云代理http://www.ip3366.net/提供了许多国外IP可以直接拿来使用。
但是这些代理有的短时间内可能就会失效,为了高效的使用代理,用Python实现一个爬虫,实时抓取代理,并将有效代理存入数据库或写入文件方便我们取用,并可以随时检测数据库和文件中的代理是否已经失效,将失效的代理删除。
- 下面是python代码实现:
# -*- coding=utf-8 -*-
__author__ = 'yansong'
import re
import requests
from lxml import etree
import urllib2, time, datetime
from lxml import etree
import sqlite3,time
import sys
import chardet
reload(sys)
sys.setdefaultencoding('utf-8') #设置系统默认编码为utf-8
class myProxy():
def __init__(self):
self.user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
self.header = {"User-Agent": self.user_agent} #请求头
self.dbname="myproxy.db" #数据库名
self.now = time.strftime("%Y-%m-%d")
#抓取国内高匿代理,并检查IP、PORT 是否可用,若可用则存入数据库,并写入文件,方便需要时取用
def getXicidaili(self, num):
nn_url = "http://www.xicidaili.com/nn/" + str(num)
#国内高匿
req = urllib2.Request(nn_url, headers=self.header)
resp = urllib2.urlopen(req, timeout=10)
content = resp.read()
et = etree.HTML(content) #将源码转换为能被XPath匹配的格式
#网页源码中class 分开了奇偶两个class,使用lxml最方便的方式就是分开获取。刚开始使用一个方式获取,出现很多IP和port抓不到的情况,分开获取可以抓到全部的ip 和port
result_even = et.xpath('//tr[@class&