首页技术文章正文

爬虫中遇到的一些关于代理的问题【黑马java培训】

更新时间:2019年07月26日 10时54分31秒 来源:黑马程序员论坛


文章目录
一、前言
二、User-Agent
(一)什么是User-Agent
(二)获取随机User-Agent与使用
三、代理ip
(一)代理IP的获取
(二)代理IP的使用
(三)IP的检验
四、如何应付网站的反扒系统
一、前言
很多人都遇到爬虫中的代理问题,分享一篇文章交流下,希望可以帮助到你们。
我们都明白代理ip是爬虫过程中必不可少的要素,但是很多时候用了代理后发现爬虫抓取数据的速度反而比不使用代理下降很多,于是放弃使用代理。
如果我们只是进行少量数据的爬取,用本机的IP与User-Agent去抓取数据完全OK,没问题。你可以关闭网页了,因为接下来要分享的东西就没有必要了。如果你需要大规模爬取数据请接着往下看。当你抓取的数据达到一定量后,你会发现程序会时不时给你报错,而且频率越来越来高。这说你的爬虫被人家识别出来了,对方的反扒系统已经记住了你。通常会告诉你连接超时、连接中断更有甚者不会直接中断你程序,它会给你一些假数据或者将你的爬虫带入一个死循环,还有许多诸如此类的反扒措施这里就不一一介绍了。
面对网站中的反扒系统,我们可以做的又有哪些呢?这里我们主要讲解代理User-Agent的应用与IP的爬取及应用。
二、User-Agent
(一)什么是User-Agent
User-Agent是一个特殊字符串头,被广泛用来标示浏览器客户端的信息,使得服务器能识别客户机使用的操作系统和版本,CPU类型,浏览器及版本,浏览器的渲染引擎,浏览器语言等。
不同的浏览器(IE,FF,Opera, Chrome等)会用不同的用户代理字符串(User Agent Strings)作为自身的标志,当搜索引擎(Google,Yahoo,Baidu,Bing)在通过网络爬虫访问网页时,也会通过用户代理字符串来进行自身的标示,这也是为何网站统计报告能够统计浏览器信息,爬虫信息等。网站需要获取用户客户端的信息,了解网站内容在客户端的展现形式,一些网站通过判断UA来给不同的操作系统,不同的浏览器发送不同的页面,不过这也可能造成某些页面无法再某个浏览器中正常显示.
(二)获取随机User-Agent与使用
1. 安装fake_useragent:
pip install fake_useragent
2. 导入fake_useragent
from fake_useragent import UserAgent
3. fake_useragent的获取
headers = {'User-Agent':str(UserAgent().random)}
'''
代码含义:生成随机User-Agent
'''
4. User-Agent的使用

req = requests.get(url=url, headers=headers)
'''
将生成的随机User-Agent放入headers传入requests,get()中即可

三、代理ip
(一)代理IP的获取
这部分我就不展开说了,百度一下就有很多的代理网站,但是代理质量还是要自己实际测试为准,很多不靠谱的宣传的都很厉害的样子,这里举例我自己使用的一家代理叫亿牛云代理,靠谱系数百分之90.
(二)代理ip的使用,一般都是使用的api模式的,程序获取ip然后自己建ip池进行管理,可以控制ip的使用,大部分都是这样使用的。我最近改变了使用方式,使用的是动态转发模式的,真的不要太方便好用。大家可以试试,举例一个框架的使用示例
JSoup
import java.io.IOException;
import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import org.jsoup.Jsoup
;import org.jsoup.nodes.Document;
public class Demo{
    // 代理隧道验证信息
    final static String ProxyUser = "16KASDA";
    final static String ProxyPass = "1231321";
    // 代理服务器
    final static String ProxyHost = "t.16yun.cn";
    final static Integer ProxyPort = 31111;

    // 设置IP切换头
    final static String ProxyHeadKey = "Proxy-Tunnel";
    public static String getUrlProxyContent(String url)
    {
        Authenticator.setDefault(new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication(ProxyUser, ProxyPass.toCharArray());
            }
        });
        // 设置Proxy-Tunnel
        Random random = new Random();
        int tunnel = random.nextInt(10000);
        String ProxyHeadVal = String.valueOf(tunnel);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ProxyHost, ProxyPort));
        try
        {
            // 处理异常、其他参数
            Document doc = Jsoup.connect(url).timeout(3000).header(ProxyHeadKey, ProxyHeadVal).proxy(proxy).get();
            if(doc != null) {
                System.out.println(doc.body().html());
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args) throws Exception
    {
        // 要访问的目标页面
        String targetUrl = "http://httpbin.org/ip";
        getUrlProxyContent(targetUrl);
    }}
(三)
四、如何应付网站的反扒系统
用上了随机User-Agent和代理IP大部分网站就没有什么问题了,但还是会出现一些反扒措施比较厉害的网站,我们拿具体的案例来解析。

情景一: 爬虫在运行但是许久没有数据出来
解决方案:timeout
try:
        proxies = get_random_ip(ip_list)
    headers = {'User-Agent':str(UserAgent().random)}
        req = requests.get(url=url, proxies=proxies,headers=headers,timeout=20)
except:
        time.sleep(5)
        proxies = get_random_ip(ip_list)
    headers = {'User-Agent':str(UserAgent().random)}
    req = requests.get(url=url, proxies=proxies,headers=headers,timeout=20)
'''
timeout=20:当请求超过20秒还没得到服务器的相应时中断请求
在中断请求后间隔5秒后更换新的User-Agent、IP重新发送请求
'''
更多的情景和对应策略大家积极交流学习。

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!