selenium+browser爬虫

浏览器对象

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

注意:

  1. 解析文本数据错误时,注意总结 看有什么规律
    print(len(node.text))
  2. 程序需要给浏览器加载页面的时间
    即程序在解析节点之前需要随机 休 眠 休眠 休眠
    等浏览器拿到数据后,在取数据
  3. find_element_by_xxxx 注意异常捕获
上一篇:Browser Security Plus 轻松管理不同的浏览器


下一篇:cookie, seesion, storage, indexDB