Scrapy爬取美女图片第三集 代理ip(上)

首先说一声,让大家久等了。本来打算520那天进行更新的,可是一细想,也只有我这样的单身狗还在做科研,大家可能没心思看更新的文章,所以就拖到了今天。不过忙了521,522这一天半,我把数据库也添加进来了,修复了一些bug(现在肯定有人会说果然是单身狗)。

好了,废话不多说,咱们进入今天的主题。上两篇 Scrapy爬取美女图片 的文章,咱们讲解了scrapy的用法。可是就在最近,有热心的朋友对我说之前的程序无法爬取到图片,我猜应该是煎蛋网加入了反爬虫机制。所以今天讲解的就是突破反爬虫机制的上篇 代理ip。

现在很多的网站对反爬虫的一个做法(当然还有其他检测)是:检测一个ip的重复性操作,从而判断是爬虫还是人工。所以使用代理ip就可以突破这个封锁。作为一个学生党,没钱专门去买vpn和ip池,所以咱们使用的代理ip来自于网络上免费的,基本上够个人使用了。接下来咱们讲的是爬取免费ip,并且验证代理ip的可用性。

网上有很多代理ip的网站,这次我选择的是http://www.xicidaili.com/nn/,大家学完可以试试其他的网站,咱们努力做个大的代理ip池。

大家是否注意到高匿两个字,高匿的意思是:对方服务器不知道你使用了代理,更不知道你的真实IP,因此隐蔽性很高。

当真。

按照咱们之前的学习爬虫的做法,使用firebug审查元素,查看如何解析html。

其实就是一个table,解析里面的每一行,这个很简单,咱们使用

BeautifulSoup很容易就解析出来了。

同时大家还应该注意到,它每一页上的ip表的页数和url中的参数是对应的。例如第一页就是http://www.xicidaili.com/nn/1。这样就省去了咱们翻页的麻烦。

以下是程序的结构:

db包中db_helper:实现的是mongodb的增删改查。

detect包中 detect_proxy:验证代理ip的可用性

entity包中 proxy_info:对代理信息进行了对象化

spider包:

spiderman 实现爬虫的逻辑

html_downloader 实现爬虫的html下载器

html_parser 实现爬虫的html解析器

test包: 对样例的测试,不涉及程序运行

main.py:实现命令行参数定义

还要说一下检测:我是用 http://ip.chinaz.com/getip.aspx作为检测网址,只要使用代理访问不超时,而且响应码为200,咱们就认为是成功的代理。

接下来运行程序看看效果:

在windows下切换到工程目录,运行python main.py -h,会看到我定义的使用说明和参数设置。

接着运行python main.py -c 1 4 (意思是爬取1-4页的ip地址):

这时候如果想验证ip的正确性:运行python main.py -t db

看来好用的ip还是比较少,不过对于个人算是够用了。

看一下mongodb数据库:

当咱们下次爬取图片的时候就可以使用这些ip了。

下面把解析和验证的代码贴一下:

解析核心代码:

def parser(self,html_cont):

    '''
    :param html_cont:
    :return:
    '''
    if html_cont is None:
        return

    # 使用BeautifulSoup模块对html进行解析
    soup = BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8')
    tr_nodes = soup.find_all('tr',class_ = True)

    for tr_node in tr_nodes:
        proxy = proxy_infor()
        i = 0
        for th in tr_node.children:
            if th.string != None and len(th.string.strip()) > 0:
                proxy.proxy[proxy.proxyName[i]] = th.string.strip()
                print  'proxy',th.string.strip()
                i += 1
                if(i>1):
                    break
        self.db_helper.insert({proxy.proxyName[0]:proxy.proxy[proxy.proxyName[0]],proxy.proxyName[1]:proxy.proxy[proxy.proxyName[1]]},proxy.proxy)

验证部分核心代码:

def detect(self):
    '''
    http://ip.chinaz.com/getip.aspx  作为检测目标
    :return:
    '''
    proxys = self.db_helper.proxys.find()
    badNum = 0
    goodNum = 0
    for proxy in proxys:
        ip = proxy['ip']
        port = proxy['port']
        try:
            proxy_host ="http://"+ip+':'+port #
            response = urllib.urlopen(self.url,proxies={"http":proxy_host})
            if response.getcode()!=200:
                self.db_helper.delete({'ip':ip,'port':port})
                badNum += 1
                print proxy_host,'bad proxy'
            else:
                goodNum += 1
                print proxy_host,'success proxy'

        except Exception,e:
            print proxy_host,'bad proxy'
            self.db_helper.delete({'ip':ip,'port':port})
            badNum += 1
            continue

    print 'success proxy num : ',goodNum
    print 'bad proxy num : ',badNum

原文发布于微信公众号 - 七夜安全博客(qiye_safe)

原文发表时间:2016-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

JDBC编程

前面我们已经讨论了数据库的安装和简单的使用,还没完成的可以先去Mysql的安装和Mysql数据库的简单操作回顾一下哦!今天我们来简单学习JDBC编程的准备和链...

3218
来自专栏jojo的技术小屋

原 web安全、XSS、CSRF、注入攻击

1703
来自专栏数据之美

Zookeeper 原理与实践

1、Zookeeper 的由来 在Hadoop生态系统中,许多项目的Logo都采用了动物,比如 Hadoop 和 Hive 采用了大象的形象,HBase 采用了...

4688
来自专栏木子昭的博客

微信小程序通过ip获取用户所在城市

3913
来自专栏Java成神之路

Web 通信 之 长连接、长轮询(long polling)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。

2013
来自专栏用户2442861的专栏

使用ThinkPHP框架快速开发网站(多图)

http://blog.csdn.net/ruby97/article/details/7574851/

4522
来自专栏jojo的技术小屋

原 web安全、XSS、CSRF、注入攻击

作者:汪娇娇 时间:2017年8月15日 当时也是看了一本书《白帽子讲web安全》,简单的摘录然后做了个技术分享,文章不是很详细,建议大家结合着这本书看哈。 w...

4047
来自专栏进击的程序猿

raft 系列解读(3) 之 代码实现最小规则followercandidateleader规则RequestVote RPCAppendEntries RPC

首先,其实raft如果你不去看理论正确性的证明,光实现的话,只要按照raft里面给出的原则写代码就ok!如果代码写出来不正确,只能是你自己实现的问题。囧

612
来自专栏FreeBuf

注意了,使用XSS平台的你可能被“偷窥”

故君子之治人也,即以其人之道,还治其人之身。 Par1:你要了解的事 XSS平台: 玩渗透测试的人,对XSS平台应该不会陌生。 最简单的XSS平台,通常可以记录...

2848
来自专栏青蛙要fly的专栏

Android技能树 — 网络小结(4)之socket/websocket/webservice

介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看,最好可以指出我的错误,让我也能纠正。

753

扫码关注云+社区