说在前面的话
本篇概述:代理原理作用,requests设置代理方法以及爬取免费代理的脚本实例
一、代理原理
根据自己理解解读:
- 客户端设置了代理信息后,客户端向对应的代理站点发出请求(向xxx网站发起请求)
- 代理站点收到请求之后,就会执行对应的响应动作(执行动作)
- 代理站点获得xxx网站的响应(得到站点响应)
- 代理站点根据客户端要求返回对应信息(客户端要求返回Source code,则返回Source code)
二、代理作用
- 突破自身ip访问限制,比如访问国外站点
- 爬取对ip访问频率有一定限制的站点
- 提高访问速度
- 隐藏真实ip
三、代理网站
免费代理ip列表:
含国外ip | 方法SEO顾问,89代理,小幻http代理,云代理 |
---|---|
不含 | 西刺,快代理 |
付费代理尚未了解,此处留空
四、requests设置代理方法
requests中有预设好的参数接收代理信息 proxies,这个参数接收的是一个字典对象
因为不知道访问的网站使用的是http协议还是https协议,所以proxies最好2种都有设置
proxies = {
'http':92.255.255.78:54628,
'https':92.255.255.78:54628
}
resp = requests.get(url=url1,headers=headers,proxies=proxies)
五、脚本示例
github地址:https://github.com/Coder-Sakura/exp/tree/master/seo_ip
本来我是打算用89代理的api接口,但是测试之后发现可靠性有点低,并且外网ip比较少,所以转用SEO
(本次抓取代理ip主要是用在我自己做 pixiv 的小项目上,爬取关注画师的所有作品和自己的收藏作品,后续会整理出来,初学爬虫,有错还请指正)
import requests
import random
import time
from lxml import etree
from bs4 import BeautifulSoup
from requests.packages.urllib3.exceptions import InsecureRequestWarning # 用于强制取消警告
from requests.adapters import HTTPAdapter # 用于强制取消警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) # 强制取消警告
class seo_ip():
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
self.agent_ip_list = []
def Agent(self,ip_agent_url):
html = requests.get(url=ip_agent_url,headers=self.headers,verify=False,timeout=5)
html_soup = BeautifulSoup(html.text, 'lxml')
# 去除第一个和前25个,26-50为国外ip
ip_list = html_soup.find('tbody').find_all('tr')[26:]
items = []
print('搜索完成,代理信息如下:')
for item in ip_list:
ip_port = list(item)[0].get_text() + ':' +list(item)[1].get_text()
# list(ip_port)[0]为ip,[1]为端口,[2]响应时间,[3]位置,[4]最后验证时间
print('ip: %s ,响应时间: %ss ,ip位置: %s' % (ip_port,list(item)[2].get_text(),list(item)[3].get_text()))
items.append(ip_port) #存储爬取到的ip(需要添加)
return items
def judge(self,items): # 检验ip活性 # https://ip.seofangfa.com/
print('正在进行代理池ip活性检测......')
for item in items:
try:
proxy = {
'http':item,
'https':item
}
# 遍历时,利用百度,设定timeout,未响应则断开连接
judge_url = 'https://www.baidu.com/'
response = requests.get(url=judge_url,headers=self.headers,proxies=proxy,verify=False,timeout=5)
self.agent_ip_list.append(item)
print(item,'可用...')
except:
print(item,'不可用...')
print('代理池ip活性检测完毕...\n代理池总量:',len(self.agent_ip_list),'\n代理池:',self.agent_ip_list)
def work(self):
ip_agent_url = 'https://ip.seofangfa.com/'
items = self.Agent(ip_agent_url)
self.judge(items)
seo_ip = seo_ip()
seo_ip.work()
没有导入这2个库的话,会因为ssl证书而出现警告,如图:
- from requests.packages.urllib3.exceptions import InsecureRequestWarning
- from requests.adapters import HTTPAdapter
六、附图
最后附上运行图