一,selenium入门
Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。
1.页面操作
Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框:
<input type="text" name="user-name" id="passwd-id" />
那么:
# 获取id标签值
element = driver.find_element_by_id("passwd-id")
# 获取name标签值
element = driver.find_element_by_name("user-name")
# 获取标签名值
element = driver.find_elements_by_tag_name("input")
# 也可以通过XPath来匹配
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
2.定位UI元素 (WebElements)
关于元素的选取,有如下的API 单个元素选取
find_element_by_id
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
二,实战代码
from selenium import webdriver
import time
class DouyuSpider:
def __init__(self):
self.start_url = "https://www.douyu.com/directory/all"
self.driver = webdriver.Chrome("/home/cuixin/chromedriver")
def get_content_list(self):
li_list = self.driver.find_elements_by_xpath("//ul[@id='live-list-contentbox']/li")
content_list = []
for li in li_list:
item = {}
item["room_img"]=li.find_element_by_xpath(".//span[@class='imgbox']/img").get_attribute("src")
item["room_title"] = li.find_element_by_xpath("./a").get_attribute("title")
item["room_cate"] = li.find_element_by_xpath(".//span[@class='tag ellipsis']").text
item["anchor_name"] = li.find_element_by_xpath(".//span[@class='dy-name ellipsis fl']").text
item["watch_num"] = li.find_element_by_xpath(".//span[@class='dy-num fr']").text
print(item)
content_list.append(item)
#获取下一页的元素
next_url = self.driver.find_elements_by_xpath("//a[@class='shark-pager-next']")
next_url = next_url[0] if len(next_url)>0 else None
return content_list,next_url
def save_content_list(self,content_list):
pass
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()
time.sleep(3)
'''重复3,4操作'''
content_list,next_url = self.get_content_list()
self.save_content_list(content_list)
if __name__ == '__main__':
douyu = DouyuSpider()
douyu.run()