我们在爬虫的过程中经常遇到这样的情况:最初代码正常运行,正常抓取数据,一切是那么美好,但是一盏茶的功夫过后可能就会出现错误,比如403forbidden 出现这样的原因多半是因为网站采取了反爬措施,比如,网站会检测一个ip单位时间发送的请求数,超过某个数量就会限制该IP的访问,一段时间后才能恢复。这种情况就是封IP,于是网站成功的把我们的爬虫限制了。 试想一下,如果我们能像伪装客户端的方式来伪装ip,是不是就解决问题了呢?
网上有很多免费代理,如西刺代理等,当然也有收费的,可自行选择。这里以西刺代理为例,看如何爬取代理ip, 首先,百度搜索西刺代理进入官网。 下面附爬虫代码
import requests import re from fake_useragent import UserAgent def spider(url): """ 爬取并获得网页源码的字符串 :param url: 西刺url :return: 网页源代码字符串 """ ua = UserAgent() header = { 'user-agent': ua.random, 'Host': 'www.xicidaili.com' } try: response = requests.get(url, headers=header) except Exception as e: print(e) else: response.encoding = response.apparent_encoding return response.text def get_ip(text): ip_list = re.findall('alt="Cn" /></td>\n[\s]+<td>(.*?)</td>\n[\s]+<td>(.*?)</td>\n\s+<td>\n[\s]+<a href=', s) return dict(ip_list) if __name__ == '__main__': text = spider('https://www.xicidaili.com/wn/') ip_dict = get_ip(text)至此就得到了代理ip,那如何检测我们得到的IP是可用的呢,下面我们继续说说如何使用代理ip
requests中使用代理的方法:
proxy = '带端口的ip' proxies = { 'http': 'http://' + proxy, 'https': 'https//' + proxy } header = {...} url = '目标id' resp = requests.get(url,proxies=proxies, headers=header) rescode = requests.status_code检测ip是否可用: 可根据返回状态码验证是否可用,200则可用
