这是我参与「第四届青训营 」笔记创作活动的第 20 天
一个大数据小白的自学成长之路 ( 二 ): 随机ip代理库 ( 反反爬虫 )
作为一个本科应用数学专业的大数据领域的萌新 , 可能没法像技术大牛一样有很多的技术产出 , 暂且就把我在做项目时的一些心得和所学作为笔记吧 !( 有些大白话写的不是很专业 , 大佬轻喷 )
一、简介
网站的反爬虫技术可能会屏蔽我们的爬虫,目前主要的手段是通过对于访问频率较高(例如一秒访问10次)的ip的标记和爬虫ip的识别来封禁特定的ip来使爬虫失效。降低爬取频率可以避免大部分的反爬虫技术,但是如果我们想要在保持较高爬取频率的同时“反反爬虫”,就需要用到随机ip代理库
二、涉及技术
利用少量的个人或者私有ip(一般付费ip更为好用)来制作爬虫爬取免费ip网站的ip并检测其是否可用,将可用的ip收集起来供我们使用。
二、实践过程:
本身的难度并不高 , 话不多说直接上代码了就
import requests\
import threading\
from queue import Queue\
import re\
from bs4 import BeautifulSoup as bs\
\
#获取代理ip地址网址\
#http://www.xsdaili.cn/dayProxy/ip/2749.html\
\
#验证代理ip是否有效网址\
#http://www.5dip.com/5dip/QueryIp.aspx\
\
headers = {\
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}\
\
ip_lists = []\
\
\
class Spider(threading.Thread):\
def __init__(self, queue):\
threading.Thread.__init__(self)\
self.queue = queue\
self.spider_website()\
\
# 爬取网上免费代理ip的方法\
def spider_website(self):\
while not self.queue.empty():\
\
url = self.queue.get_nowait()\
r = requests.get(url=url, headers=headers, timeout=8)\
if r.status_code == 200:\
# print(r.status_code, r.text)\
soup = bs(r.text, 'html.parser')\
# print(soup)\
ip_list_root = soup.find_all('div', attrs={'class': 'cont'})\
# print(rr)\
for ip in ip_list_root:\
ipp = re.findall('<br/>(.*?)@', str(ip))\
for u in ipp:\
print('爬取到的网络代理地址为:' + u)\
\
# 将爬取到的免费代理ip追加保存到列表ip_lists\
ip_lists.append(u)\
# 调用验证ip的方法,将爬取到的代理ip传入该方法\
check_proxy(u)\
\
\
def main():\
q = Queue()\
q.put("http://www.xsdaili.cn/dayProxy/ip/2749.html")\
\
threads = []\
thread_count = 40\
\
for i in range(thread_count):\
threads.append(Spider(q))\
\
for t in threads:\
t.start()\
t.join()\
\
\
#| 验证代理ip是否有效\
def check_proxy(use_proxy):\
# print('check_proxy方法传入的ip:' + use_proxy)\
spider_ip = use_proxy.split(':')[0]\
# print('传入的ip切片'+spider_ip)\
\
# 需要把ip:端口 压入到创建的字典里\
proxy_real = {}\
\
# python3.6以上的解析器,挂代理,字典的值必须添加http://或者https://\
proxy_real['http'] = 'http://%s' % (use_proxy)\
# proxy_real['http'] = 'http://1.174.130.57:8080'\
# print(proxy_real)\
\
try:\
check_r = requests.get(url="http://www.5dip.com/5dip/QueryIp.aspx", headers=headers, proxies=proxy_real,\
timeout=1.5)\
# print(check_r.status_code)\
\
if check_r.status_code == 200:\
# print(check_r.text)\
# rrr=check_r.text.encode('iso-8859-1').decode('gbk')\
soup1 = bs(check_r.text, 'html.parser')\
# print(soup1)\
soup2 = re.findall('<span id="lbldqip">(.*?)</span>', str(soup1))\
# print(soup2[0])\
# print(type(soup2))\
# print('验证网站:你的当前ip地址为:' + soup2[0])\
# print('\n')\
\
# 做一个逻辑判断,传入的代理ip和验证代理网站的ip如果一致,则说明代理是有效的\
if spider_ip == soup2[0]:\
print('代理ip有效------>' + soup2[0])\
print('保存有效代理ip至txt文件...')\
print('\n')\
\
# 将有效代理ip保存到文本txt\
f1 = open('save_live_ip.txt', 'a+')\
f1.write(use_proxy + '\n')\
f1.close()\
\
except Exception as e:\
\
print('这个代理无效....继续验证其他代理')\
print('\n')\
pass\
\
\
if __name__ == '__main__':\
f1 = open('save_live_ip.txt', 'w')\
f1.close()\
main()
四、一个小小的总结
经过更换了大约10个左右的免费ip代理网站我们发现基本上这些网站免费的ip全都挂掉来。。。(不知道是不是我太倒霉了),在看了一下午的“ip不可用”之后只好作罢,毕竟免费的ip估计早就已经被其他爬虫爬完用过后挂掉了。如果真的想做到“反反爬虫”,也许最好的办法就是去买付费的代理吧。(不过正常频率下的使用其实已经可以满足普通人的需求)