爬虫入门(使用selenium)
Selenium介绍
1. 什么是Selenium
-
Selenium最初是一个自动化测试工具,Selenium可以驱动浏览器自动执行自定义好的逻辑代码,即通过代码完全模拟使用浏览器自动访问目标站点并操作,所以也可以用来爬虫。就好比有一个人坐在电脑前快速浏览网页读取数据。
-
相比于其他爬虫工具的优势:
-
可以模拟用户操作,避免一般的反爬虫方法
-
可以执行JavaScript,得到动态网页中的数据
-
2. 如何安装Selenium
-
打开cmd或Anacoda Prompt,输入:
pip install selenium
- 安装后尝试能否导入Selenium(能够运行即为安装成功)
from selenium import webdriver
-
除了安装selenium本身,还需要安装对应的浏览器驱动,可以使用webdriver-manager库自动查看浏览器版本并下载对应的驱动程序。打开cmd或Anacoda Prompt,输入:
pip install webdriver-manager
-
使用webdriver_manager中的ChromeDriverManager安装ChromeDriver(按下面代码的步骤操作即可)
#导入selenium和webdriver_manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 使用 ChromeDriverManager 安装 ChromeDriver,并返回驱动程序的路径
driver_path = ChromeDriverManager().install()
# 打印驱动程序的路径(验证是否成功下载对应驱动)
print(driver_path)
# 创建 ChromeDriver 服务,并指定驱动程序的路径
service = Service(driver_path)
#可以将Chrome替换为Edge、Firefox或Safari,下载其他浏览器的驱动
- 尝试能否使用驱动程序和selenium库打开网页
# 创建 Chrome WebDriver,并指定服务
browser = webdriver.Chrome(service=service)
# 打开百度网页
browser.get("https://www.baidu.com")
-
如果自动安装不成功,可以尝试手动安装(版本尽量一模一样,否则可能出错,可以在浏览器的设置中查看自己的浏览器版本)
-
Google浏览器驱动:https://sites.google.com/a/chromium.org/chromedriver/downloads
-
Edge浏览器:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
-
火狐Firefox浏览器:https://github.com/mozilla/geckodriver/releases
-
Safari 浏览器:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
-
-
如果是手动安装,记得要把下载好的驱动放到python安装路径的scripts目录中,如果是用的Anacoda装的python,放在Anacoda文件夹中即可。
3. Selenium基本操作
访问浏览器页面
-
可以使用get方法请求网页,向其参数传入要请求网页的URL即可
-
page_source 指令可以打印当前页面的html源代码
# 创建 Chrome WebDriver,并指定服务
browser = webdriver.Chrome(service=service)
#获取淘宝的网页
browser.get('https://www.taobao.com')
#page_source指令打印该网页的html源代码
print(driver.page_source)
- 运行结果如下:
<html lang="zh-CN" class="ks-webkit537 ks-webkit ks-chrome122 ks-chrome"><head><script charset="utf-8" src="https://g.alicdn.com/tbhome/??taobao-2021/0.0.37/common/head/item-bar.jst.html-min.js,taobao-2021/0.0.37/common/head/item.jst.html-min.js" async=""></script><script charset="utf-8" src="https://g.alicdn.com/tbhome/??taobao-2021/0.0.37/common/head/index-min.js,taobao-2021/0.0.37/c/shop/item.jst.html-min.js,taobao-2021/0.0.37/c/live/item.jst.html-min.js,taobao-2021/0.0.37/c/hotsale/item.jst.html-min.js,taobao-2021/0.0.37/c/hotsale/config-min.js,taobao-2021/0.0.37/c/helper/item.jst.html-min.js,taobao-2021/0.0.37/c/goods/item.jst.html-min.js,taobao-2021/0.0.37/c/qiang/item.jst.html-min.js,taobao-2021/0.0.37/common/pipe/index-min.js,taobao-2021/0.0.37/c/fashion/item.jst.html-min.js" async=""></script><script charset="utf-8" src="https://g.alicdn.com/tbhome/??taobao-2021/0.0.37/common/inject-min.js,taobao-2021/0.0.37/c/shop/index-min.js,taobao-2021/0.0.37/c/sale/index-min.js,taobao-2021/0.0.37/c/live/index-min.js,taobao-2021/0.0.37/c/hotsale/index-min.js,taobao-2021/0.0.37/c/helper/index-min.js,taobao-2021/0.0.37/c/goods/index-min.js,taobao-2021/0.0.37/c/qiang/index-min.js,taobao-2021/0.0.37/c/fashion/index-min.js" async=""></script><script charset="utf-8" src="https://g.alicdn.com/tbhome/??taobao-2021/0.0.37/lib/lazy-min.js" async=""></script><script src="https://textlink.simba.taobao.com/?name=tbhs&cna&nn=&count=13&pid=430266_1006&_ksTS=1711245240035_70&callback=jsonp71" async=""></script>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=10,chrome=1">
<meta name="renderer" content="webkit">
<title>淘宝</title>
<meta name="spm-id" content="a21bo">
<meta name="description" content="淘宝网 - 亚洲较大的网上交易平台,提供各类服饰、美容、家居、数码、话费/点卡充值… 数亿优质商品,同时提供担保交易(先收货后付款)等安全交易保障服务,并由商家提供退货承诺、破损补寄等消费者保障服务,让你安心享受网上购物乐趣!">
<meta name="aplus-xplug" content="NONE">
<meta name="keyword" content="淘宝,掏宝,网上购物,C2C,在线交易,交易市场,网上交易,交易市场,网上买,网上卖,购物网站,团购,网上贸易,安全购物,电子商务,放心买,供应,买卖信息,网店,一口价,拍卖,网上开店,网络购物,打折,免费开店,网购,频道,店铺">
<meta name="msvalidate.01" content="6E0390D0C5FFD883392E1B1E070FE901">
<link rel="dns-prefetch" href="//g.alicdn.com">
.........(还有很多内容省略掉了)
定位元素
-
Selenium使用 browser.find_element(By.属性 , ‘属性名称’) 的语法来定位元素,或者是 browser.find_element(“属性”, ‘属性名称’)
-
这里要注意,网上很多教程给出的是老版本的语法(4.0版本之前).find_element_by_id,目前新版本已经不可用
-
下面给出最基本的五种定位方法
#从淘宝界面提取搜索框的节点
# ID 定位: 使用元素的 ID 属性来定位元素。
input_by_id = browser.find_element("id", 'q')
print(input_by_id)
#等价于 browser.find_element(By.ID, 'q')
# Name 定位: 使用元素的 Name 属性来定位元素。
input_by_name = browser.find_element("name", 'q')
print(input_by_name)
#等价于 browser.find_element(By.NAME, 'q')
# Class Name 定位: 使用元素的 Class 属性来定位元素。
input_by_class = browser.find_element("class name", 'search-suggest-combobox')
print(input_by_class)
#等价于 browser.find_element(By.CLASS_NAME, 'search-suggest-combobox')
# CSS 选择器定位:使用CSS selector定位,可以理解为另一套查找规则,具体规则可以查看 https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Selectors
input_by_cssselector = browser.find_element("css selector", '#q') #此处#q等价于用id查找
print(input_by_cssselector)
#等价于 browser.find_element(By.CSS_SELECTOR, '#q')
# XPath 定位: 使用 XPath 表达式来定位元素。语法请见上期课件,或 https://www.runoob.com/xpath/xpath-syntax.html
input_by_xpath = browser.find_element("xpath", '//*[@id="q"]')
print(input_by_xpath)
#等价于 browser.find_element(By.XPATH, '//*[@id="q"]')
- 运行结果如下:
<selenium.webdriver.remote.webelement.WebElement (session="b25faf1e4a6d084c61ce42c98dba5ed7", element="f.83DA36E53487B5F97380791F6C6FE601.d.1A59F384579EFD019ABCC99EDFC6956C.e.18")>
<selenium.webdriver.remote.webelement.WebElement (session="b25faf1e4a6d084c61ce42c98dba5ed7", element="f.83DA36E53487B5F97380791F6C6FE601.d.1A59F384579EFD019ABCC99EDFC6956C.e.18")>
<selenium.webdriver.remote.webelement.WebElement (session="b25faf1e4a6d084c61ce42c98dba5ed7", element="f.83DA36E53487B5F97380791F6C6FE601.d.1A59F384579EFD019ABCC99EDF