反反爬,搭建IP代理池

1 、 爬虫代理
\quad 对于爬虫来说,由于爬虫爬取速度过快,在爬取的过程中可能会遇到同一个IP访问太过频繁,在网站反爬措施下导致直接拒绝访问,也就是所谓的封IP,因此需要一种借助某种方式来伪装我们的IP,让服务器识别不出是由本机发送的请求。这里我们使用代理IP的方式来实现IP的伪装。

2 、 代理的作用
\quad 代理实际上就是代理服务器,英文叫做proxy server,它的功能是代理网络用户去取得网络信息,通俗的说就是我们所说的代购。

  • 提高访问速度。
  • 隐藏真实IP,对于我们爬虫来说,这个很关键。
  • 突破自身IP访问的限制,访问一些平时不能访问的网站。

3 、 常见代理设置

  • 使用付费代理:网上有许多代理商,可以付费使用。
  • 使用免费代理:对于一些不想付费但又想使用的人来说(感觉有点欠揍),免费代理是个不错的选择,免费代理中高匿代理比较好,我们可以在一些免费的代理网站爬取一定数量的IP,搭建自己的IP池,但爬取的可用的不多,因此需要验证可用IP,这里免费代理网站:https://www.xicidaili.com/nn
    反反爬,搭建IP代理池_第1张图片

4 、 爬取代理IP
\quad 对于如何爬取查找我们要爬取数据在网页上的位置节点,以及爬取数据,在我这篇博客 https://blog.csdn.net/weixin_41704182/article/details/86546559 ,已经有详细说明,因此这里就做说明了。
t a l k − i s − c h e a p − s h o w − m e − t h e − c o d e talk- is -cheap-show -me -the -code talkischeapshowmethecode

import csv
import requests
from bs4 import BeautifulSoup# 导入所需库

# 请求头部
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0'}

def Get_IP(url):  # 获取单页ip信息
    respose = requests.get(url, headers=headers)
    soup = BeautifulSoup(respose.text, 'lxml')
    zip = soup.find_all('tr')#获取节点文本信息
    
    #写入csv文件
    csvFile = open('ip_pools.csv', 'a+', encoding='utf-8')
    writer = csv.writer(csvFile)
    writer.writerow(('ip', '端口'))
    for i in range(1,len(zip)):
        writer.writerow([zip[i].get_text().strip('\n').split('\n')[0:2]])

if __name__ == '__main__':
    for i in range(30):#多页IP信息
        urls={'https://www.xicidaili.com/?start={}&filter='.format(i)}
        for url in urls:
            Get_IP(url)

5 、 验证代理IP
\quad 在上面我们说过,我们在一些免费的代理网站爬取一定数量的IP,但爬取的可用的不多,因此需要验证可用IP,我们需要看看连上代理IP后,能不能在一定时间内打开一个网站,可过可以,就认为该IP可用。

import urllib.request
import csv

def IP_pools():
    reader=csv.reader(open('ip_poolss.csv'))
    IP_pools=[]
    for row in reader:
        ## 创建连个代理ProxyHandler
        ProxyHandler = {"http":row[0]+':'+row[1]}
        handler=urllib.request.ProxyHandler(ProxyHandler)
        opener=urllib.request.build_opener(handler)
        urllib.request.install_opener(opener)
        try:
            respose=urllib.request.urlopen('http://www.baidu.com')
            IP_pools.append([row[0],row[1]])
        except Exception as e:
            continue
    return IP_pools
if __name__ == '__main__':
    IP_pools()

你可能感兴趣的:(python,爬虫)