自己动手爬取免费代理IP

使用爬虫在爬取一些大网站的时候,总会出现被反爬技术阻碍的情况,限制IP就是其中一种.

那么使用代理就是很好的解决方案.

作为一个穷的裤兜比脸干净的人(博主每天洗脸,不要怀疑这一点),花钱去买代理就不在考虑范围内了

那么,度娘就告诉我好几个提供免费IP代理的网站

本次爬取的是西刺代理,虽然西刺提供了接口,但是使用并不好用,经常无响应,接口不能用,就只能自己动手啦

 

第一步:先搞下来他的网页在说

import requests

response = requests.get("http://www.xicidaili.com/")
response.encoding = "utf-8"
if response.status_code == 200:
	# print(response.text)
	print("响应成功")
else:
	print("响应失败")

直接打印响应页面失败,测试以下响应状态,失败...

第一次上你就给我响应失败?

浏览器没问题,大致猜测了以下应该是python自带的UserAgent被识别了,改进一下

def rand_userAgent():
	#我自己用正则弄的一个UA池,大家也可以自己动手做一个
	UserAgentList = [{'User-Agent': 'Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50'}, {'User-Agent': 'Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50'}, {'User-Agent': 'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)'}, {'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}, {'User-Agent': 'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}, {'User-Agent': 'Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11'}, {'User-Agent': 'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11'}, {'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TheWorld)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)'}]
	return random.choices(UserAgentList)[0]

#向一个url发起请求,成功返回文本,不成功继续发起请求
def get_one_page(url):
	print("发起请求")
	userAgent = rand_userAgent()
	response = requests.get(url,headers=userAgent)
	response.encoding = "utf-8"
	if response.status_code == 200:
		# print(response.text)
		print("响应成功")
		return response.text
	else:
		print("响应失败")
		#如果一直响应失败会超出递归最大层数,导致程序崩溃.
		#此处并不打算来解决这个问题,毕竟玩具代码,不影响实用
		return get_one_page(url)

封装两个函数,一个随机出UserAgent,另一个获取网页信息.

修改了UserAgent之后果然就没问题了,至此,网页就被我们搞下来了,IP就在我们手中拿着了,但是还有一堆杂质,我们需要清洗一下.

 

第二步:提取出IP,保存成json格式

首先我们先来看下html的格式,截取了两段,贴上来.

<tr class="odd">
    <td class="country"><img src="http://fs.xicidaili.com/images/flag/cn.png" alt="Cn" /></td>
    <td>175.148.71.249</td>
    <td>1133</td>
    <td>辽宁葫芦岛</td>
    <td class="country">高匿</td>
    <td>HTTP</td>
      <td>59天</td>
    <td>2分钟前</td>
</tr>
  
<tr class="">
    <td class="country"><img src="http://fs.xicidaili.com/images/flag/cn.png" alt="Cn" /></td>
    <td>180.118.240.155</td>
    <td>808</td>
    <td>江苏镇江</td>
    <td class="country">高匿</td>
    <td>HTTPS</td>
      <td>467天</td>
    <td>3分钟前</td>
 </tr>

格式还是很清晰的,那么直接上数据匹配的大杀器-正则表达式

我们只需要IP,端口号,协议类型这三个元素,所以我们只提取这三个就可以了

str1 = '<td class="country"><img[\s\S]+?<td>'
#ip
str2 = '</td>[\s\S]*?<td>'
#端口号
str3 = '</td>[\s\S]*?<td>[\s\S]*?<td>'
#协议类型
str4 = '</td>'
regex = str1+"([\s\S]*?)"+str2+"([\s\S]*?)"+str3+"([\s\S]*?)"+str4
IP_List = re.findall(regex, 网页文本)

上下对照,写了个简单粗暴的正则表达式,

测试一下,IP果然被提取出来了.

至此,我们的代理IP都提取出来了.但是并不是所有的IP都可用,我们还需要测试一些

 第三步:剔除不能使用的IP

使用每个IP对百度发起请求,返回响应码,不是200的全部删掉

不多说 ,直接贴代码

def ip_pool(IP_list):
	for i in IP_list:
		#如果IP不可用,从IP_list中删除
		if not test_ip(i[0],i[1]):
			print(i,"不可用")
			IP_list.remove(i)
	#返回筛选后的IP_list
	return IP_list

#对每一个IP进行测试
def test_ip(ip,port):
	server = ip+":"+port
	proxies = {'http': 'http://' + server, 'https': 'https://' + server}
	try:
		r = requests.get('https://www.baidu.com/', proxies=proxies,timeout=1)
		if r.status_code == 200:
			return 1
		else:
			return 0
	except:
		return 0 

这样,我们的IP_list里边的IP都是可以用的了,我们在把它保存到数据库或写入一个文件就可以了

我是转换成json格式写入到一个文件中的,方法很简单,在这就不贴代码了

 

最后,附上源码地址:https://gitee.com/ldw295/crawl_free_agent_ip

如果对你有些作用,欢迎点赞,评论,看到后我会及时回复

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我可以告诉你如何使用代理IP爬取豆瓣电影网,但请注意这可能涉及到一些法律和道德问题,因此请确保你有合法的许可和良好的意图。 首先,你需要获取一些代理IP地址,你可以从一些付费的代理商那里购买,也可以使用一些免费代理网站。 然后,你需要使用编程语言例如Python来编写爬虫程序。在程序中,你需要设置代理IP地址,使得每次请求都会使用不同的IP地址。 具体来说,你可以使用Python的requests库来发送HTTP请求,并在请求头中设置代理IP地址。以下是一个简单的示例代码: ```python import requests # 代理IP地址 proxies = { 'http': 'http://127.0.0.1:8080', 'https': 'https://127.0.0.1:8080', } # 请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } # 发送请求 response = requests.get('https://movie.douban.com/', headers=headers, proxies=proxies) # 输出响应内容 print(response.text) ``` 在这个示例代码中,我们使用了一个代理IP地址 `http://127.0.0.1:8080`,并将其设置为HTTP和HTTPS协议的代理。我们还设置了一个请求头,以伪装成一个浏览器发送请求。最后,我们使用requests库发送HTTP请求,并输出响应内容。 请注意,使用代理IP爬取网站可能会遇到一些问题,例如代理IP可能不稳定,可能会被网站封禁等等。因此,你需要小心使用,并确保你的行为合法和道德。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值