Python爬取京东
电脑版发表于:2022/11/8 18:55
Selenium原本是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。现在很多爬虫工程师为了绕过反爬虫的机制,都选择selenium。由于selenium的原理是唤起浏览器操作,因而代价就是爬虫非常慢。
本实验将介绍使用selenium爬取与解析页面数据。
1、附件一(chrome_Xpath)
2、附件二(http://chromedriver.storage.googleapis.com/index.html [看谷歌版本号选最近的] )
2、附件二(http://chromedriver.storage.googleapis.com/index.html [看谷歌版本号选最近的] )
3、关键概念
# selenium.webdriver.support.expected_conditions:是Selenium的一个子模块
# 作用:可以对网页上元素是否存在,可点击等等进行判断,一般用于断言或与WebDriverWait配合使用。
# 下面是expected_conditions与WebDriverWait配合使用实例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 等待10s,等待过程中如果定位到元素,就直接执行后续的代码,反之等待10s后报错误信息
element = WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(By.ID,'kw')))
element.send_keys( '新梦想软件测试' )
# expected_conditions模块用法汇总
# 判断当前页面的title是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.title_is("百度一下,你就知道"))
# 判断当前页面的title是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.title_contains('new'))
# 判断当前页面的url是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('https://www.baidu.com'))
# 判断当前页面的url是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('baidu'))
# 判断当前页面的url是否满足字符串正则表达式匹配,返回布尔值
WebDriverWait(driver,10).until(EC.url_matches('.+baidu.+'))
# 判断元素是否出现,只要有一个元素出现,返回元素对象
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
# 判断元素是否可见,返回元素对象
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(By.ID,'kw')))
# 判断元素是否包含指定文本,返回布尔值
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.NAME,'tj_trnews'),'新闻'))
# 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去
WebDriverWait(driver,10,).until(EC.frame_to_be_available_and_switch_to_it(By.xpath,'//iframe'))
# 判断某个元素是否可见并且是可点击的,如果是的就返回这个元素,否则返回False
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,'tj_trnews')))
# 判断某个元素是否被选中,一般用在下拉列表
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.xpath,'//input[@type="checkbox"]')))
# 判断页面上是否存在alert,如果有就切换到alert并返回alert的内容
WebDriverWait(driver,10).until(EC.alert_is_present())
# 以上整理大家要注意参数和返回值,部分参数是元素对象,部分是locator的元组,如(By.NAME,'tj_trnews')
4、环境搭配
环境变量:
1、京东网址为:https://www.jd.com/
在crome浏览器输入京东网址,进入京东网址后,在搜索框里输入“笔记本”三个字,点击搜索按钮,url变为:https://search.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&pvid=6159d4eb2d204c45852f8a6e30d87f38
我们很容易发现该网页是一个动态加载的网页,因为刚打开网页时只会显示 30 个商品的信息,可是当我们向下拖动网页时,它会再次加载剩下 30 个商品的信息,这时候我们可以通过 selenium 模拟浏览器下拉网页的过程,获取网站全部商品的信息
使用快捷键 Ctrl+Shift+I 打开开发者工具,然后使用快捷键 Ctrl+Shift+C 打开元素选择工具,此时用鼠标点击网页中的“下一页”,就会在源代码中自动定位到相应的位置,发现没有链接,源码如下
<a class="pn-next" onclick="SEARCH.page(3, true)" href="javascript:;" title="使用方向键右键也可翻到下一页哦!">
<em>下一页</em>
<i>></i>
</a>
但是有属性 “ onclick="SEARCH.page(3, true)" href="javascript:;" ”,其中href="javascript:;"表示在触发默认动作时,执行一段JavaScript代码,而 javascript:; 表示什么都不执行,这样点击时就没有任何反应;其中onclick="SEARCH.page(3, true)"表示onclick方法负责执行js函数SEARCH.page(3, true)。这时我们选择使用 selenium 模拟浏览器的翻页行为较好,即下拉网页至底部可以发现有一个 “下一页”的按钮,我们只需获取并点击该元素即可实现翻页。通过构造 URL 来获取每一个网页的内容也是可行的,只是有点麻烦,需要看懂js函数SEARCH.page(3, true)。另外,我们发现该网站搜索结果一共有 100 个网页
3、关键概念
# selenium.webdriver.support.expected_conditions:是Selenium的一个子模块
# 作用:可以对网页上元素是否存在,可点击等等进行判断,一般用于断言或与WebDriverWait配合使用。
# 下面是expected_conditions与WebDriverWait配合使用实例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 等待10s,等待过程中如果定位到元素,就直接执行后续的代码,反之等待10s后报错误信息
element = WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(By.ID,'kw')))
element.send_keys( '新梦想软件测试' )
# expected_conditions模块用法汇总
# 判断当前页面的title是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.title_is("百度一下,你就知道"))
# 判断当前页面的title是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.title_contains('new'))
# 判断当前页面的url是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('https://www.baidu.com'))
# 判断当前页面的url是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('baidu'))
# 判断当前页面的url是否满足字符串正则表达式匹配,返回布尔值
WebDriverWait(driver,10).until(EC.url_matches('.+baidu.+'))
# 判断元素是否出现,只要有一个元素出现,返回元素对象
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
# 判断元素是否可见,返回元素对象
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(By.ID,'kw')))
# 判断元素是否包含指定文本,返回布尔值
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.NAME,'tj_trnews'),'新闻'))
# 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去
WebDriverWait(driver,10,).until(EC.frame_to_be_available_and_switch_to_it(By.xpath,'//iframe'))
# 判断某个元素是否可见并且是可点击的,如果是的就返回这个元素,否则返回False
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,'tj_trnews')))
# 判断某个元素是否被选中,一般用在下拉列表
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.xpath,'//input[@type="checkbox"]')))
# 判断页面上是否存在alert,如果有就切换到alert并返回alert的内容
WebDriverWait(driver,10).until(EC.alert_is_present())
# 以上整理大家要注意参数和返回值,部分参数是元素对象,部分是locator的元组,如(By.NAME,'tj_trnews')
4、环境搭配
环境变量:
1、京东网址为:https://www.jd.com/
在crome浏览器输入京东网址,进入京东网址后,在搜索框里输入“笔记本”三个字,点击搜索按钮,url变为:https://search.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&pvid=6159d4eb2d204c45852f8a6e30d87f38
我们很容易发现该网页是一个动态加载的网页,因为刚打开网页时只会显示 30 个商品的信息,可是当我们向下拖动网页时,它会再次加载剩下 30 个商品的信息,这时候我们可以通过 selenium 模拟浏览器下拉网页的过程,获取网站全部商品的信息
使用快捷键 Ctrl+Shift+I 打开开发者工具,然后使用快捷键 Ctrl+Shift+C 打开元素选择工具,此时用鼠标点击网页中的“下一页”,就会在源代码中自动定位到相应的位置,发现没有链接,源码如下
<a class="pn-next" onclick="SEARCH.page(3, true)" href="javascript:;" title="使用方向键右键也可翻到下一页哦!">
<em>下一页</em>
<i>></i>
</a>
但是有属性 “ onclick="SEARCH.page(3, true)" href="javascript:;" ”,其中href="javascript:;"表示在触发默认动作时,执行一段JavaScript代码,而 javascript:; 表示什么都不执行,这样点击时就没有任何反应;其中onclick="SEARCH.page(3, true)"表示onclick方法负责执行js函数SEARCH.page(3, true)。这时我们选择使用 selenium 模拟浏览器的翻页行为较好,即下拉网页至底部可以发现有一个 “下一页”的按钮,我们只需获取并点击该元素即可实现翻页。通过构造 URL 来获取每一个网页的内容也是可行的,只是有点麻烦,需要看懂js函数SEARCH.page(3, true)。另外,我们发现该网站搜索结果一共有 100 个网页