Python爬虫技术拆解1:获取代理IP集合

Python这么语言很多人刚开始的项目都是写个小爬虫,但是大家在写的时候发现经常会被目标网站给拒绝。

目标网站拒绝你千百遍,你待她依然如初恋。如何敲开初恋的大门,这里不得不说下代理IP。

因为很多网站为了拉新,不让老客户不停的访问(作了访问限制)。大家在拉数据的时候,需要每次替换不同的访问IP。这样目标网站会以为你是新用户,就会放你进去。

国内免费的代理IP网站,一般以西刺代理比较火。域名https://xicidaili.com/

一个一个的去替换,显示不出我们的身份,作为技术员,我们应该有我们的出场方式:

这里主要用到了以下几个技术:

1、requests。requests 主要是用来作网络传输用的。简单点来说就是你本机和目标网站通信之间的通道,是由它来负责的。

 导入模块

#导入模块 这个模块不是默认的,需要使用pip 进行安装。

import requests  

进行网络请求,这里使用的是get

#获得返回信息。 url是目标网址。这里是西刺代理的。 headers 是请求的头部构造
resp = requests.get(url, headers=req_header)

#判断返回的结果码是否是正常的。
if resp.status_code == requests.codes.ok:

2、lxml。它是一个解析库,支持HTML和XML的解析,支持XPath解析方式。用来进行对返回的信息进行解析。获取到你需要的信息。你可以简单理解为它为DOM对象。


selector = etree.HTML(resp.text)

#Xpath解析返回的html对象拼接成数组
td_data = [i.xpath("td/text()") for i in selector.xpath('//table[@id="ip_list"]/tr')[1:] ]

#进行返回值的筛选拼接
ip_list += [ [data[5].strip(),"".join([data[0],":",data[1]])] for data in td_data  if   data[5].strip().lower() == 'https']

最终结果如下:

下面是代码全部:

#!/usr/bin/python3
# -*- coding: utf-8 -*-  

import requests
from lxml import etree

#获取代理列表
def get_proxy_ip(proxy_url_type="http"):
    if proxy_url_type=="https":
        url = "https://www.xicidaili.com/wn/"
    else:
        url = "https://www.xicidaili.com/wt/"

    req_headers = [
            { "User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
            },
            { "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
            },
        ]
    # 获取最后一页,这个地方偷懒了,没有去计算,而是直接打开页面看有多少页就写上去了
    #有兴趣的可以自己使用Xpath 去计算一下。
    last_page_num = 4049
    arr_index = random.randint(1, len(req_headers) - 1)
    req_header = req_headers[arr_index]

    #IP存放列表
    p_list = []

    for i in range(1, last_page_num): 
        
        #访问地址
        url +=str(i)
        #获得返回信息。 url是目标网址。这里是西刺代理的。 headers 是请求的头部构造
        resp = requests.get(url, headers=req_header)

        #判断返回的结果码是否是正常的。
        if resp.status_code == requests.codes.ok:
            selector = etree.HTML(resp.text)
            #tr_data = selector.xpath('//table[@id="ip_list"]/tr') 
            td_data = [i.xpath("td/text()") for i in selector.xpath('//table[@id="ip_list"]/tr')[1:] ]
         
            ip_list += [ [data[5].strip(),"".join([data[0],":",data[1]])] for data in td_data  if   data[5].strip().lower() == 'https']
            
            time.sleep(1)

        return ip_list


if __name__ == '__main__':
   
    proxy_ips = get_proxy_ip("https") 
    print(proxy_ips)

    pass

发布了146 篇原创文章 · 获赞 138 · 访问量 369万+

猜你喜欢

转载自blog.csdn.net/m290345792/article/details/104955507