爬虫实战【13】获取自己的动态代理ip池

在爬取一些比较友好的网站时,仍然有可能因为单位时间内访问次数过多,使服务器认定为机器访问,导致访问失败或者被封。如果我们使用不同的ip来访问网站的话,就可以绕过服务器的重复验证,使服务器以为使不同的人在访问,就不会被封了。

如何获取动态ip

网络上有很多提供代理ip的网站,我们经常使用的一个是西刺免费代理ip,url='http://www.xicidaili.com/'
我们来看一下这个网站的构成:
【插入图片,西刺代理页面】
993869-20171208205413499-467997511.jpg

我们获取这个页面上的所有ip即可。
一个合理的代理ip的格式是这样的:

{'http':'http://106.46.136.112:808'}

也就是说每个代理是一个字典,这个字典中可以有很多个ip,每个代理ip都是以http为key。当然考虑到字典的特性,如果我们只获取http为key的代理,那么这个字典中只能有一个元素。
我们就简单点,只考虑http的情况。
通过PyQuery来解析西刺的源代码,所有的ip都在一个tr里面,但是有些tr是标题,我们过滤一下就可以了。
由于页面比较简单,这里就不做介绍了。

如何使用代理ip

我们以requests库为例:

import requests

#这个字典可以只有一个键值对,如果只考虑http的情况
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080"
}

requests.get("http://example.org", proxies=proxies)

全部代码

西刺也是有访问限制的,短时间内多次访问会被封锁,所以最好的办法是每个一个小时访问一下,将所有的代理ip保存到本地。
每次需要ip的时候从本地获取。

在下面的例子中,我们先获取到一个ip池,当然是文本格式的,然后短时间内访问了200次豆瓣主页,都成功了。

import requests
from pyquery import PyQuery
import random


def get_ip_page():
    url = 'http://www.xicidaili.com/'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'
    }  # 不加请求头信息还不能获取到源代码信息
    response = requests.get(url, headers=headers)
    try:
        if response.status_code == 200:
            # print(response.text)
            return response.text
    except Exception:
        print('获取ip出错!')


def parse_save_ip():
    html = get_ip_page()
    doc = PyQuery(html)
    even_ips = doc('tr').items()
    result = []
    try:
        for item in even_ips:
            ip = item.find('td').eq(1).text()
            port=item.find('td').eq(2).text()
            # http=item.find('td').eq(5).text()
            # proxy_ip={http:ip}
            # result.append(proxy_ip)
            if ip != '':
                # print(ip)
                result.append('http://'+ip+':'+port)
    except Exception:
        pass
    with open('proxy.csv','w') as f:
        for item in result:
            f.write(item)

def get_random_ip():
    #短时间内连续访问多次会被封住,将获取的代理ip存到本地,每个小时获取1次即可。
    with open('proxy.csv','r') as f:
        ips=f.readlines()
    random_ip = random.choice(ips)
    proxy_ip = {'http': random_ip}
    return proxy_ip


def how_to_use_proxy(proxy):
    url='https://www.douban.com/'
    webdata=requests.get(url=url,proxies=proxy)
    print(webdata)


def main():
    proxy = get_random_ip()
    print(proxy)
    how_to_use_proxy(proxy)

if __name__ == '__main__':
    parse_save_ip()
    for i in range(200):
        main()
        print('第%d次访问成功!'%(i+1,))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]提供了一个示例代码,用于爬取西刺代理网站上的免费代理IP。这段代码使用了BeautifulSoup库来解析网页,并提取出IP地址和端口号。通过调用get_ip_list函数,可以获取到爬取到的代理IP列表。 引用\[2\]提供了一个检测IP可用性的函数。该函数使用了requests库发送请求,并设置了代理IP。如果请求成功(状态码为200),则将该代理IP保存在另一个列表中。 根据这些引用内容,你可以使用这些代码来实现一个爬虫代理IP的功能。首先,你可以使用引用\[1\]中的代码来爬取西刺代理网站上的免费代理IP。然后,使用引用\[2\]中的函数来检测这些代理IP的可用性。最后,你可以根据引用\[3\]中的运行结果来验证你的代码是否成功获取到了代理IP。 请注意,这只是一个示例代码,你可以根据自己的需求进行修改和优化。同时,使用代理IP需要遵守相关法律法规和网站的使用规定,确保合法合规地使用代理IP。 #### 引用[.reference_title] - *1* *3* [Python网络爬虫(五)——获取代理IP](https://blog.csdn.net/weixin_40431584/article/details/89736159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python爬虫实战(二):爬取快代理构建代理IP](https://blog.csdn.net/yuan2019035055/article/details/121334216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值