标签:click 主播 lib 获取数据 art ascii script 爬取 文件
第五天:
Selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。
这里推荐使用pip安装,执行如下命令即可:
pip install selenium
进入python命令交互模式,导入selenium包,如果没有报错,则证明安装成功。
Import selenium
但是这样做还不够,因为我们还需要用浏览器(谷歌,火狐等)来配合selenium的工作
因为只有安装ChromeDriver,才能驱动Chrome浏览器完成相应的操作。
首先查看本地的Chrome版本,确定版本之后下载相对应的ChromeDriver,可以直接百度ChromeDriver下载
在Windows下。建议直接将chromedriver.exe文件拖到python的Scripts目录下,并且配置到环境变量中。
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()
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()
-获取文本和获取属性
-先定位到元素,然后调用‘.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()
标签:click 主播 lib 获取数据 art ascii script 爬取 文件
原文地址:https://www.cnblogs.com/sujiu/p/11552359.html