从零开始写Python爬虫 --- 3.2 爬虫实践:获取快代理

从零开始写Python爬虫 --- 3.2 爬虫实践:获取快代理

在前面的Scrapy爬虫里,我们已经写了一个爬取代理的爬虫了,这次我们通过模拟浏览器用Selenium&PhantomJS的方式重新写一遍,来看看这两者有啥不同。


目标分析:

本次要爬的网站是:快代理 :快代理 - 高速http代理ip每天更新

虽然这个网站并没有对爬虫限制,我们用requests库就能顺利get页面代码,但是为了掌握Selenium的使用方式,我们还是来通过这种方式写一遍。

看一下页面的样子:


我们就按这种布局,在html页面里找到代理的 ip 端口 位置等信息。

数据的筛选:


打开Chrome开发者工具,手动定位到一条代理的位置:

可以看到,每条代理都放在tr列表中,
每个tr里有包含着多个td列来显示不同的信息。

这样的结构我们可以通过多种方法来定位数据

  • bs4
  • Xpath
  • Selenium自带的方法

具体代码怎么写,我相信大家都会有自己的方式吧

代码的书写:

这次我们采用面向对象的方式写这一段代码:

'''
selenium模拟浏览器爬虫

爬取快代理:http://www.kuaidaili.com/
'''

from selenium import webdriver


class Item(object):
    '''
    我们模拟Scrapy框架
    写一个item类出来,
    用来表示每一个爬到的代理
    '''

    ip = None  # ip地址
    port = None  # 端口
    anonymous = None  # 是否匿名
    type = None  # http or https
    local = None  # 物理地址
    speed = None  # 速度

class GetProxy(object):
    '''
    获取代理的类
    '''

    def __init__(self):
        '''
        初始化整个类
        '''
        self.starturl = 'http://www.kuaidaili.com/free/inha/'
        self.urls = self.get_urls()
        self.proxylist = self.get_proxy_list(self.urls)
        self.filename = 'proxy.txt'
        self.saveFile(self.filename,self.proxylist)

    def get_urls(self):
        '''
        返回一个代理url的列表
        '''
        urls = []
        for i in range(1,2):
            url = self.starturl+str(i)
            urls.append(url)
        return urls

    def get_proxy_list(self,urls):
        '''
        返回抓取到代理的列表
        整个爬虫的关键
        '''

        browser = webdriver.PhantomJS()
        proxy_list = []
        
        
        for url in urls:
            browser.get(url)
            browser.implicitly_wait(3)
            # 找到代理table的位置
            elements = browser.find_elements_by_xpath('//tbody/tr')
            for element in elements:
                item = Item()
                item.ip = element.find_element_by_xpath('./td[1]').text
                item.port = element.find_element_by_xpath('./td[2]').text
                item.anonymous = element.find_element_by_xpath('./td[3]').text
                item.local = element.find_element_by_xpath('./td[4]').text
                item.speed = element.find_element_by_xpath('./td[5]').text
                print(item.ip)
                proxy_list.append(item)
                
        browser.quit()
        return proxy_list
        
    def saveFile(self,filename,proxy_list):
        '''
        将爬取到的结果写到本地
        '''
        with open(filename,'w') as f:
            for item in proxy_list:
                
                f.write(item.ip + '\t')
                f.write(item.port + '\t')
                f.write(item.anonymous + '\t')
                f.write(item.local + '\t')
                f.write(item.speed + '\n\n')


if __name__ =='__main__':
    Get = GetProxy()                

代码解释:

这次的爬虫本身十分的简单,详细的注释也都附在代码里了,
相信一路跟着这份笔记走过来的同学都能看的明白。

但是我还是稍微解释一下吧:

一开始我们模仿Scrapy定义了一个ITEM类,每一个item都包含了一条结果所需要的所有数据,然后一条一条传回去给其他函数调用。

接着我们写了三个函数:

get_urls()

这个函数功能是返回一个需要爬取代理页面的url链接的列表

get_proxy_list()
这个函数通过Selenium和PhantomJS模拟一个浏览器环境,
首先 从get_urls函数返回的列表中拿出一个链接,打开
接着 在浏览器里通过find_elements_by_xpath()方法来找到每一条我们需要的数据,并保存在item里。
最后 将item返回给saveFile()函数处理。

saveFile()
这个函数没什么好说的,
就是将item理的数据写入到本地。
保存在proxy.txt文本中。


结果展示:

为了节省调式的时间,我只爬取了前两页的代理,

结果保存在proxy.txt:

117.90.3.153    9000    高匿名 HTTP    中国 江苏省 镇江市 电信

202.111.9.106   23  高匿名 HTTP    中国 江苏省 常州市 联通

27.29.158.127   8998    高匿名 HTTP    中国 湖北省 襄樊市 电信

117.90.3.114    9000    高匿名 HTTP    中国 江苏省 镇江市 电信

120.24.182.175  8118    高匿名 HTTP    中国 广东省 深圳市 阿里云

121.232.144.21  9000    高匿名 HTTP    中国 江苏省 镇江市 电信

59.78.47.184    1080    高匿名 HTTP    中国 上海市 上海市 教育网

58.218.145.163  8998    高匿名 HTTP    中国 江苏省 徐州市 电信

121.232.145.139 9000    高匿名 HTTP    中国 江苏省 镇江市 电信

117.90.4.219    9000    高匿名 HTTP    中国 江苏省 镇江市 电信

175.8.26.191    808 高匿名 HTTP    中国 湖南省 长沙市 电信

171.12.166.209  808 高匿名 HTTP    中国 河南省 漯河市 电信

121.232.144.44  9000    高匿名 HTTP    中国 江苏省 镇江市 电信

117.90.5.229    9000    高匿名 HTTP    中国 江苏省 镇江市 电信

当然,如果要真的用的话,还需要配合我上次写的代理验证程序~


好了,这次就到这里,相信会写这个简单的Selenium模拟浏览器爬虫,

其他复杂的网站也是能一通百通的。


每天的学习记录都会 同步更新到:
微信公众号: findyourownway

知乎专栏:从零开始写Python爬虫 - 知乎专栏

blog : www.ehcoblog.ml

Github: Ehco1996/Python-crawler

编辑于 2017-05-28

文章被以下专栏收录