如果一个IP访问频率过高,则有可能会被对方的服务器封掉。
解决方法:
1. 降低访问频率,使用time.sleep()
2. 使用代理IP
推荐使用的代理IP网站:
西刺代理:
快代理:https://www.kuaidaili.com/
芝麻代理的使用方法:https://www.bilibili.com/video/BV1x5411c7hf?from=search&seid=9358258166195933835
代理网站通常提供免费代理和付费代理。免费代理不好用。快代理上提供的收费代理中,开发代理和私密代理中提供的IP不一定都可用,但是比免费的IP要好。
开放代理可利用率低,私密代理还可以。通常使用私密代理。
可以建立自己的IP代理池,并试用代理IP的可用情况。可以使用www.baidu.com或httpbin.org/get测试代理IP的有效性。
import requests from lxml import etree import time import random class ProxyPool: def __init__(self): self.url = \'https://www.kuaidaili.com/free/inha/%d\' self.test_url = \'http://www.baidu.com/\' self.headers = { \'User-Agent\': \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36\' } def get_proxy_pool(self,url): html = requests.get(url=url,headers=self.headers).text p = etree.HTML(html) tr_list = p.xpath(\'//*[@id="list"]/table//tr\') for tr in tr_list[1:]: ip = tr.xpath(\'./td[1]/text()\')[0].strip() port = tr.xpath(\'./td[2]/text()\')[0].strip() self.test_proxy(ip,port) def test_proxy(self,ip,port): proxies = { \'http\':\'http://{}:{}\'.format(ip,port), \'https\':\'https://{}:{}\'.format(ip,port) } try: res = requests.get(url=self.test_url,proxies=proxies,headers=self.headers,timeout=2) time.sleep(3) if res.status_code==200: print(ip,port,\'\033[31m可用\033[0m\') with open(\'proxy.text\',\'a\') as f: f.write(ip+\':\'+port+\'\n\') except Exception as e: print(ip,port,\'不可用\') def run(self): for i in range(1,5): url = self.url%i print(url) self.get_proxy_pool(url=url) if __name__ == \'__main__\': spider = ProxyPool() spider.run()