Selenium&PhantomJS

pip install selenium==2.48.0 新版本不支持phantomjs
下载phantomjs

implicitly_wait():
浏览器解释JS脚本是需要时间的,但实际上这个时间并不好确定,
如果我们手动设定时间间隔的话,设置多了浪费时间,设置少了又会丢失数据
implictly_wait函数则完美解决了这个问题,给他一个时间参数,他会只能等待,当js完全解释完毕就会自动执行下一步。

Selenium 本事给出了18个函数来定位有效数据的位置:
找到第一个匹配的元素
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
一次查找多个元素 (这些方法会返回一个list列表):
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

首先调用find_element_by_id()方法找到了text栏的位置,
然后通过send_keys()方法来输入关键字
接着还是通过find_element_by_id()方法找到提按钮,
最后我们通过.submint()方法来模拟点击,发送搜索请求

通过browser.find_elements_by_class_name()方法定位到搜索结果,
返回一个element类型的列表,
再通过element.text 和 element.get_attribute()方法来获取我们需要的数据。
最后我们遍历一边results列表就能获得我们想要的答案了。

'''
使用Selenium模拟浏览器
抓取百度查询结果
'''

# 导入selenium模块中的web引擎
from selenium import webdriver


# 建立浏览器对象 ,通过Phantomjs
browser = webdriver.PhantomJS()

# 设置访问的url
url = 'https://www.baidu.com'

# 访问url
browser.get(url)

# 等待一定时间,让js脚本加载完毕
browser.implicitly_wait(3)

# 找到搜索框
text = browser.find_element_by_id('kw')

# 清空搜索框的文字
text.clear()

# 填写搜索框的文字
text.send_keys('命运冠位指定')

# 找到submit按钮
button = browser.find_element_by_id('su')

# 点击按钮 提交搜索请求
button.submit()


# 查看当前浏览器标题
print(browser.title)

# 以截图的方式查看浏览器的页面
browser.save_screenshot('text.png')

# 找到结果 结果保存为列表变量
results = browser.find_elements_by_class_name('t')

# 循环遍历找出每个结果的标题和url
for result in results:
    print('标题:{} 超链接:{}'.format(result.text,
                                result.find_element_by_tag_name('a').get_attribute('href')))

实践:获取快代理

get_urls()
这个函数功能是返回一个需要爬取代理页面的url链接的列表
get_proxy_list()
这个函数通过Selenium和PhantomJS模拟一个浏览器环境,
首先 从get_urls函数返回的列表中拿出一个链接,打开
接着 在浏览器里通过find_elements_by_xpath()方法来找到每一条我们需要的数据,并保存在item里。
最后 将item返回给saveFile()函数处理。
saveFile()
这个函数没什么好说的,
就是将item理的数据写入到本地。
保存在proxy.txt文本中。

'''
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()

实践:爬取b站排行榜信息

'''
selenium模拟浏览器爬虫

爬取b站排行榜信息
'''

from selenium import webdriver


class Item(object):
    '''
    我们模拟Scrapy框架
    写一个item类出来
    '''
    rank = None #排名
    title = None  #名
    play_num = None #播放量
    danmu_num = None #弹幕量
    author = None #作者
    score = None #综合得分
    url = None #链接
class Get(object):
    '''
    获取代理的类
    '''

    def __init__(self):
        '''
        初始化整个类
        '''
        self.starturl = 'https://www.bilibili.com/ranking'
        self.ranklist = self.get_rank_list(self.starturl)
        self.filename = 'rank.txt'
        self.saveFile(self.filename,self.ranklist)



    def get_rank_list(self,url):
        '''
        返回抓取到代理的列表
        整个爬虫的关键
        '''
        browser = webdriver.Chrome()
        rank_list = []

        browser.get(url)
        browser.implicitly_wait(3)
        # 找到代理table的位置
        elements = browser.find_elements_by_xpath('//ul[@class="rank-list"]/li[@class="rank-item"]')
        for element in elements:
            item = Item()
            item.rank = element.find_element_by_xpath('./div[@class="num"]').text
            item.title = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/a[@class="title"]').text
            item.play_num = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span[@class="data-box"][position()=1]').text
            item.danmu_num = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/span[@class="data-box"][position()=2]').text
            item.author = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="detail"]/a/span[@class="data-box"]').text
            item.score = element.find_element_by_xpath('./div[@class="content"]/div[@class="info"]/div[@class="pts"]/div').text
            item.url = element.find_element_by_xpath('./div[@class="content"]/div[@class="img"]/a').get_attribute('href')
            print(item.rank)
            rank_list.append(item)

        browser.quit()
        return rank_list

    def saveFile(self,filename,rank_list):
        '''
        将爬取到的结果写到本地
        '''
        with open(filename,'w') as f:
            for item in rank_list:

                f.write('NO.'+item.rank + '\n')
                f.write('title:'+item.title + '\n')
                f.write('play:'+item.play_num + '\n')
                f.write('danmu:'+item.danmu_num + '\n')
                f.write('author:'+item.author + '\n')
                f.write('score:'+item.score + '\n')
                f.write('author:'+item.url + '\n\n')


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

坑获取标签属性要用get_attribute(‘’) 还以为爬不了呢


   转载规则


《Selenium&PhantomJS》 刘坤胤 采用 知识共享署名 4.0 国际许可协议 进行许可。