浏览器对象
from selenium import webdriver
#浏览器对象
browser = webdriver.Chrome()
browser常用方法
browser.get(url) #地址栏输入地址,并确认
browser.quit() #关闭浏览器
browser.close() #关闭文档页面
browser.maximize_window() #浏览器最大化
browser.page_source #最终渲染的页面源码
browser.page_source.find("xx") #查找,无则返回-1,经常用于判断是否最后一页(元素属性 ‘不可点击’)
定位节点
从最终渲染的页面中匹配元素节点
#以下为单节点对象
browser.find_element_by_id("id属性值")
browser.find_element_by_name("name属性值")
browser.find_element_by_class_name("class属性值")
browser.find_element_by_tag_name("标签名")
#万能模式
browser.find_element_by_xpath("//div[@id='1']")
#只能匹配超链接a
browser.find_element_by_link_text("链接文本")
browser.find_element_by_partical_link_text("部分链接文本")
"""
如:<a href="https://www.baidu.com" target="_blank">百度地址</a>
browser.find_element_by_link_text("百度地址").click()
browser.find_element_by_partical_link_text("百度").click()
"""
#css 选择器
browser.find_element_by_css_selector("css选择器")
返回单节点对象
返回多节点对象数组,只需find_elements_by_xxxxx
节点对象常用方法
node.send_keys("xxxx") #文本框输入内容
node.clear() #清空内容
node.click() #点击
node.get_attribute("id/class/name.....")#获取属性值
node.text #节点下的所有文本,包括子节点、后代节点
案例
使用selenium+浏览器 抓取猫眼电影Top100
url = “https://maoyan.com/board/4”
思路:
“”"
抓取top100
1.打开浏览器
2.输入网址,回车
3.匹配节点对象,注意异常捕获
4.提取文本数据
5.处理下一页
“”"
"""
抓取top100
1.打开浏览器
2.输入网址,回车
3.匹配节点对象,注意异常捕获
4.提取文本数据
5.处理下一页
"""
from selenium import webdriver
import time
import random
import sys
import pymongo
mongo = pymongo.MongoClient("localhost",27017)
maoyan_db = mongo["maoyan_db"]
maoyan_set = maoyan_db["maoyan_set"]
#打开浏览器
browser = webdriver.Chrome()
#打开网页
browser.get("http://maoyan.com/board/4")
#最大化
browser.maximize_window()
#防止网络不好
time.sleep(random.uniform(3,5))
#查找元素
#分析分页 到最后一夜
while browser.page_source.find("下一页") != -1: #不是最后一页
#找不到会有异常
try:
#匹配到div 排行榜容器
node = browser.find_element_by_class_name("board-wrapper")
except:
sys.exit("容器节点未找到,系统退出")
try:
#匹配所有的dd节点,放入列表
dd_list = node.find_elements_by_xpath(".//dd")
except:
sys.exit("子节点未找到,系统退出")
#遍历处理每个节点
for i in dd_list:
"""
i.text 所有的文本
字符串 以'\n'拼接
"""
try:
text_list = i.text.split("\n")
temp = {}
#排名
temp["rank"] = float(text_list[0].strip())
#电影名字
temp["movie"] = text_list[1]
#主演
#注意分隔冒号 是中文格式
temp["players"] = text_list[2].split(":")[1]
#上映时间
temp["online"] = text_list[3].split(":")[1]
#评分,str--->float
temp["score"] = float(text_list[4].strip())
print(temp)
print("*"*30)
#数据存入mongodb
#只有当前电影的名字不在db中时,才存入
cursor_ = maoyan_set.find({"movie":temp["movie"]}) #返回游标对象
r = list(cursor_)
if not r:
maoyan_set.insert_one(temp)
except:
print("解析数据出错,跳过")
print(i.text)
print("*"*30)
#打开下一页
#先随机休眠
time.sleep(random.uniform(3,6))
browser.find_element_by_link_text("下一页").click()
#抓取最后一页的数据
#找不到会有异常
try:
#匹配到div 排行榜容器
node = browser.find_element_by_class_name("board-wrapper")
except:
sys.exit("容器节点未找到,系统退出")
try:
#匹配所有的dd节点,放入列表
dd_list = node.find_elements_by_xpath(".//dd")
except:
sys.exit("子节点未找到,系统退出")
try:
#遍历处理每个节点
for i in dd_list:
"""
i.text 所有的文本
字符串 以'\n'拼接
"""
text_list = i.text.split("\n")
temp = {}
#排名
temp["rank"] = float(text_list[0].strip())
#电影名字
temp["movie"] = text_list[1]
#主演
#注意分隔冒号 是中文格式
temp["players"] = text_list[2].split(":")[1]
#上映时间
temp["online"] = text_list[3].split(":")[1]
#评分,str--->float
temp["score"] = float(text_list[4].strip())
print(temp)
print("*"*30)
#数据存入mongodb
#只有当前电影的名字不在db中时,才存入
cursor_ = maoyan_set.find({"movie":temp["movie"]}) #返回游标对象
r = list(cursor_)
if not r:
maoyan_set.insert_one(temp)
except:
sys.exit("解析数据出错,系统退出")
#关闭浏览器
time.sleep(2)
browser.quit()
链接:项目整体代码
提取码:tdh8
注意:
- 解析文本数据错误时,注意总结 看有什么规律
print(len(node.text)) - 程序需要给浏览器加载页面的时间
即程序在解析节点之前需要随机 休 眠 休眠 休眠
等浏览器拿到数据后,在取数据 - find_element_by_xxxx 注意异常捕获