python爬虫代理学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012535605/article/details/81675983

       当同一ip短时间内多次链接同一网站,很可能导致ip被封,为了避免远程服务器封锁IP,或者想加快爬取速度,一个可行的方法就是使用代理IP,我们需要做的就是创建一个自己的代理IP池。

思路

1.从代理网站爬取IP地址及端口号并存储 (以西刺代理为例)
2.验证ip能否使用并将能使用的IP和端口号存储起来
3.从代理池中随机选择一个IP进行爬去验证

具体实现

1.爬取代理

from urllib import request
from bs4 import BeautifulSoup
import bs4
import re
import pandas as pd

start_url = "http://www.xicidaili.com/nn"
# 模拟真实浏览器进行访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063'
}
page = request.Request(start_url, headers=headers)
page_info = request.urlopen(page).read()
#page_info = page_info.decode('utf-8')

from lxml import etree
html = etree.HTML(page_info)

#存储所有的URL列表
all_url=html.xpath('//tr[@class="odd"]/td/text()')
all_url2=html.xpath('//table[@id="ip_list"]/tr/td/text()')

#ip地址
list_1=html.xpath('//table[@id="ip_list"]/tr/td[2]/text()')
#端口号
list_2=html.xpath('//table[@id="ip_list"]/tr/td[3]/text()')

#IP和端口汇总数据
list_all=[]
for i in range(len(list_1)):
    list_all.append(list_1[i]+":"+list_2[i])

输出如下

2.验证ip能否使用

####检测代理地址是否可用
import telnetlib
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063'
}
print("共计{}个代理地址".format(len(list_all)))


#检测IP是否可用,把可用的IP筛选出来
proxy=[]
for i in range(len(list_all)):
    try:
        telnetlib.Telnet(list_1[i], port=list_2[i], timeout=20)
    except:
        print('{}:{}检测失败'.format(list_1[i],list_2[i]))
    else:
        print('{}:{}检测成功'.format(list_1[i],list_2[i]))
        proxy.append([list_1[i]+":"+list_2[i]])
print("检测完毕")

输出结果:

3.随机选择代测试

import numpy as np
import pandas  as pd
random_ip=np.random.choice(pd.DataFrame(proxy)[0].values)
proxy = {'http':random_ip}
proxyHeader = request.ProxyHandler(proxy) 
# 创建Opener
opener = request.build_opener(proxyHeader)
# 安装Opener
request.install_opener(opener)
# 然后剩下的就跟正常使用差不多,只不过此时的request已经是绑定了代理之后的request
url = 'https://www.taobao.com/'
req = request.Request(url)
response = request.urlopen(req)
print(response.read().decode())

理IP爬去网络

猜你喜欢

转载自blog.csdn.net/u012535605/article/details/81675983