python爬虫第五天

第五天:

Selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

  1. 安装

这里推荐使用pip安装,执行如下命令即可:

pip install selenium

  1. 验证安装

进入python命令交互模式,导入selenium包,如果没有报错,则证明安装成功。

Import selenium

但是这样做还不够,因为我们还需要用浏览器(谷歌,火狐等)来配合selenium的工作

  1. 安装ChromeDriver

因为只有安装ChromeDriver,才能驱动Chrome浏览器完成相应的操作。

首先查看本地的Chrome版本,确定版本之后下载相对应的ChromeDriver,可以直接百度ChromeDriver下载

  1. 环境变量配置

在Windows下。建议直接将chromedriver.exe文件拖到python的Scripts目录下,并且配置到环境变量中。

  1. 尝试一下用selenium,写一个简短的程序

from selenium import webdriver
import time

# 实例化一个浏览器
driver = webdriver.Chrome()

# 发送请求
driver.get("https://www.baidu.com")

#获取HTML字符串 浏览器中elements的内容
# print(driver.page_source)

#元素定位的方法  send_keys是在input里面输入内容
driver.find_element_by_id("kw").send_keys("湖南理工")

# 点击百度一下  click方法就是点击
driver.find_element_by_id("su").click()

#获取当前url
print(driver.current_url)

#获取cookie
# cookies = driver.get_cookies()
# print(cookies)
# print("*"*100)
# cookies = {i["name"]:i["value"] for i in cookies}
# print(cookies)

# time.sleep(10)
#退出浏览器
# driver.quit()

#退出当前页面
# driver.close()



  1. 页面元素定位:

find_element_by_id(返回一个)

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

我们来看下面的例子:

#1
from selenium import webdriver
# 实例化一个浏览器
driver = webdriver.Chrome()
driver.get("https://tieba.baidu.com/f?kw=%E8%B4%B4%E5%90%A7%E5%90%A7%E4%B8%BB")
#根据xpath找到元素
# element
# ret1 = driver.find_element_by_xpath('//ul[@class="threadlist_bright j_threadlist_bright"]/li')
# elements
ret1 = driver.find_elements_by_xpath('//ul[@class="threadlist_bright j_threadlist_bright"]/li')
# print(ret1)
for li in ret1:
     print(li.find_element_by_xpath('.//div[@class="threadlist_lz clearfix"]/div/a').text)
# driver.quit()


#2
#find_element_by_link_text
#
百度python
# driver.get("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python&rsv_pq=80d37dc00003f63b&rsv_t=48baugyRuvw5rTnlMWdGQKN%2Fwz3bP4q7%2F4hwNDFh%2Fnzd92y5eHizTb7yJCo&rqlang=cn&rsv_enter=1&rsv_sug3=8&rsv_sug1=19&rsv_sug7=101&rsv_sug2=0&inputT=4063&rsv_sug4=4849")
# get_attribute是获取属性
# print(driver.find_element_by_link_text("下一页>").get_attribute("href"))
# print(driver.find_element_by_partial_link_text("下一页").get_attribute("href"))
# driver.quit()
  1. sulenium的使用注意点

-获取文本和获取属性

-先定位到元素,然后调用‘.text’或者‘.get_attribute’方法来取

-selenium获取的页面数据是浏览器中element的内容

 -find_element和find_elements的区别

       -find_element返回一个element,如果没有会报错

       - find_elemenst返回一个列表,如果没有就是空列表

       -在判断是否是有下一页的时候,使用find_elements来根据结果的列表长度来判断。

       -如果页面中含有iframe,frame,需要先调用driver.switch_to.frame的方法切换到frame中才能定位元素

from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get("https://mail.qq.com/")

# 切换到iframe(重点)
driver.switch_to.frame("login_frame")

# 输入用户名密码
driver.find_element_by_id("u").send_keys("347402267")
driver.find_element_by_id("p").send_keys("dsjfisdjfoj")

# 点击登录
driver.find_element_by_id("login_button").click()

time.sleep(5)
# driver.quit()

-selenium请求第一页的时候会等待页面加载完了之后在获取数据,但是在点击翻页之后,会直接获取数据,此时可能会报错,因为数据还没有加载出来,需要time.sleep()一段时间

from selenium import webdriver
import time
driver = webdriver.Chrome()

# bilibili网站 演示翻页之后不设置sleep会报错
driver.get("https://www.bilibili.com/v/technology/automobile/?spm_id_from=333.69.b_7072696d6172795f6d656e75.52#/")
ret1 = driver.find_elements_by_xpath('//div[@class="vd-list-cnt"]/ul/li')
for li in ret1:
    print(li.find_element_by_xpath('.//div/div[@class="r"]/a[@class="title"]').text)

# 点击下一页
driver.find_element_by_xpath('//button[@class="nav-btn iconfont icon-arrowdown3"]').click()

time.sleep(5)

ret2 = driver.find_elements_by_xpath('//div[@class="vd-list-cnt"]/ul/li')
for li in ret2:
    print(li.find_element_by_xpath('.//div/div[@class="r"]/a[@class="title"]').text)

# time.sleep(3)
# driver.quit()

为什么需要等待

如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错

强制等待

time.sleep(5)

代码见test5-_04selenium.py

练习:

爬取虎牙直播平台的所有房间信息

from selenium import webdriver
import time
import json


class HuyaSpider:
    def __init__(self):
        self.start_url = "https://www.huya.com/l"
       
# 实例化一个driver对象
       
self.driver = webdriver.Chrome()

    # 3.提取数据,提取下一页的元素
   
def get_content_list(self):
        li_list = self.driver.find_elements_by_xpath('//ul[@class="live-list clearfix"]/li')
        content_list = []
        for li in li_list:
            item = {}
            # 主播
           
item['anchor_name'] = li.find_element_by_xpath('./a/img').get_attribute("title")
            # 房间名
           
item['room_name'] = li.find_element_by_xpath('./a[@class="title new-clickstat"]').text
            # 分类
           
item['room_cate'] = li.find_element_by_xpath('.//span/a').text
            # 观看人数
           
item['watch_num'] = li.find_element_by_xpath('.//span/i[@class="js-num"]').text
            print(item)
            content_list.append(item)
        # 获取下一页的元素
       
next_url = self.driver.find_elements_by_xpath('//a[@class="laypage_next"]')
        next_url = next_url[0] if len(next_url)>0 else None
        return
content_list, next_url

    # 4.保存数据
   
def save_content_list(self, content_list):
        with open('huya.txt', 'a', encoding='utf-8') as f:
            f.write(json.dumps(content_list, ensure_ascii=False, indent=2))

    def run(self):
        #1.start_url
        #2.
发送请求,获取响应
       
self.driver.get(self.start_url)
        #3.提取数据,提取下一页的元素
       
content_list, next_url = self.get_content_list()
        #4.保存数据
       
self.save_content_list(content_list)
        #5.点击下一页元素,循环
       
while next_url is not None:
            next_url.click()
            # 翻到新的一页之后,等待响应5秒
           
time.sleep(5)
            content_list, next_url = self.get_content_list()
            self.save_content_list(content_list)


if __name__ == "__main__":
    huya = HuyaSpider()
    huya.run()

猜你喜欢

转载自www.cnblogs.com/sujiu/p/11552359.html