分享

python爬虫设置代理ip池

 大傻子的文渊阁 2019-12-09

"""

在使用python爬虫的时候,经常会遇见所要爬取的网站采取了反爬取技术,高强度、高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网页,就很可能被封,那如何解决呢?使用代理ip,设置代理ip池。

以下介绍的免费获取代理ip池的方法:

优点:

1.免费

缺点:

1.代理ip稳定性差需要经常更换

2.爬取后ip存在很多不可用ip需要定期筛选

小建议:

该方法比较适合学习使用,如果做项目研究的话建议参考本人博客《python爬虫设置代理ip池——方法(二)》,购买稳定的代理ip

"""

.主要思路

1.从代理ip网站爬取IP地址及端口号并储存

2.验证ip是否能用

3.格式化ip地址

4.requests中使用代理ip爬取网站

. 写在前面

Requests中使用代理爬取的格式是
import requests
requests.get(url, headers=headers,proxies=proxies)
其中proxies是一个字典其格式为:
对每个ip都有
proxies = {
http: 'http://114.99.7.122:8752'
https: 'https://114.99.7.122:8752'
}
注意:
对于httphttps两个元素,这里的httphttps
代表的不是代理网站上在ip后面接的类型
代表的是requests访问的网站的传输类型是http还是https

你爬的网站是http类型的你就用http,如果是https类型的你就用https,在代理网站上爬的时候也要分别爬httphttpsip

三.代码

1.配置环境,导入包

  1. # IP地址取自国内髙匿代理IP网站:http://www./nn/
  2. # 仅仅爬取首页IP地址就足够一般使用
  3. from bs4 import BeautifulSoup
  4. import requests
  5. import random
 headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}

2.获取网页内容函数

  1. def getHTMLText(url,proxies):
  2. try:
  3. r = requests.get(url,proxies=proxies)
  4. r.raise_for_status()
  5. r.encoding = r.apparent_encoding
  6. except:
  7. return 0
  8. else:
  9. return r.text

3.从代理ip网站获取代理ip列表函数,并检测可用性,返回ip列表

  1. def get_ip_list(url):
  2. web_data = requests.get(url,headers)
  3. soup = BeautifulSoup(web_data.text, 'html')
  4. ips = soup.find_all('tr')
  5. ip_list = []
  6. for i in range(1, len(ips)):
  7. ip_info = ips[i]
  8. tds = ip_info.find_all('td')
  9. ip_list.append(tds[1].text + ':' + tds[2].text)
  10. #检测ip可用性,移除不可用ip:(这里其实总会出问题,你移除的ip可能只是暂时不能用,剩下的ip使用一次后可能之后也未必能用)
  11. for ip in ip_list:
  12. try:
  13. proxy_host = "https://" + ip
  14. proxy_temp = {"https": proxy_host}
  15. res = urllib.urlopen(url, proxies=proxy_temp).read()
  16. except Exception as e:
  17. ip_list.remove(ip)
  18. continue
  19. return ip_list
4.从ip池中随机获取ip列表
  1. def get_random_ip(ip_list):
  2. proxy_list = []
  3. for ip in ip_list:
  4. proxy_list.append('http://' + ip)
  5. proxy_ip = random.choice(proxy_list)
  6. proxies = {'http': proxy_ip}
  7. return proxies

5.调用代理

  1. if __name__ == '__main__':
  2. url = 'http://www./nn/'
  3. ip_list = get_ip_list(url)
  4. proxies = get_random_ip(ip_list)
  5. print(proxies)


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多