#基于Python Selenium在Edge浏览器下爬取商品信息
最近跑一个爬虫作业的时候用到了selenium,用的模板是Chrome浏览器的,而我自己用的是Edge,所以在一些代码上需要进行改动,否则会报错,比如Edge浏览器启动项,等等。这里记录一下,也给有同样需要的人提供参考。借鉴了一些其他文章,我会放在末尾参考资料里,代码我还没学会github,所以所有代码我都放文章里了,顺序为:主程序-定义的函数,我会先介绍主程序。
作业描述:给定一个商店网址,要求获取商店内5个最贵的商品名字和价格,使用工具为selenium,使用代码为python,实验环境为anaconda+jupyternotebook。
老师给的参考步骤如下,我没有严格按照步骤来写:
同时也给了一些提示:
工具一:anaconda3+jupyter,这个不给教程了,也可以用其他环境。
工具二:需要下载Edge专用的驱动,网址为Edge Driver。
下载完成后,放入python脚本同一目录下,我用的是jupyter,所以我放的如图:
需要注意的是,下载完要改名字,改为:‘MicrosoftWebDriver.exe’,否则有可能出错。
工具二:当然最重要的就是你有一个代码可以跑爬虫,文末我放上我的完整代码供参考,只是一个例程,放在文章最后(现在还没放,等我做完实验再放)。
由于老师给的是Chrome的浏览器的例程,所以我们要进行修改,我这里用的版本是 95.0.1020.40 (官方内部版本) (64 位)。其实应该都差不多。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import *
import time
import os
改动二:刚才改动一提到的的驱动文件路径,在主函数里面,如下,需要将驱动文件命名为我说的‘MicrosoftWebDriver.exe’,并放在代码同一文件夹下,代码中的driver_path就是我们说的这个路径。这里传入的和url后面的东西可以自己修改。
介绍一下大概思路:
#Begin of parameters declaration
keyword = input('Please input a keyword to search:')
driver_path = './MicrosoftWebDriver.exe' #The path where you put the chromedriver.exe in
url = 'http://10.113.178.219' #The url of shopping cart
operate_delay = 0 #you can set it to 2, then you can see each process the script do in detail
#End of parameters declaration
driver = open_driver(driver_path,url)
wait = WebDriverWait(driver, 10) #set a implicit waiting time for the browser driver
search_a_keyword(keyword)
products = {} # To store the fetched products information
page_items = wait.until(presence_of_all_elements_located((By.CLASS_NAME, "page-item")))
print(page_items)
for page_item in page_items:
print(page_item)
if page_item == page_items[0]:
pass
else:
page_link = page_item.find_element(By.TAG_NAME,'a')
if os.name == 'posix':
#check Operation System, os.name =='posix' indicate the OS is Mac OS or linux
page_link.send_keys(Keys.COMMAND,Keys.RETURN)
else:
page_link.send_keys(Keys.CONTROL,Keys.RETURN)
windows = driver.window_handles #driver.window_handles is the list of windows tag
driver.switch_to.window(windows[-1]) #windows[-1]=the latest open page
get_all_product_price_in_one_page()
result = first_n_dic_value(5,products)
save_the_result(result)
driver.close()
'''
这里是老师给的参考步骤,我没按这个来,可以不看
The above template is only for getting products' describtion in one page.
Your task is to get products' price in all pages.
You can follow the following procedures and implement the relative functions
'''
'''
The code-flow may look like the following:
driver = open_driver(driver_path,url)
search_a_keyword(keyword)
while(True):
get_all_product_price_in_one_page()
next_page_url = get_next_page_url()
if next_page_url =='':
break
else:
click_the_next_page_url()
save_result_as_json()
driver.close()
'''
在这里插入代码片
改动一:Edge启动项,这里是写在函数’open_driver‘里,功能是启动浏览器。传入参数说明,path:Edge驱动文件的路径;url:目标网页的网址。需要改动的部分就是options参数和wendriver.Edge了(原来是webdriver.Chrome),注意E要大写。
def open_driver(path,url):
#Chrome下的代码
# options = webdriver.ChromeOptions()
# options.add_experimental_option('excludeSwitches', ['enable-logging']) #for ignore warning and error
# driver = webdriver.Chrome(path,options=options)
#Edge下的代码
options = {
"browserName": "MicrosoftEdge",
"version": "",
"platform": "WINDOWS",
"ms:edgeOptions": {
"extensions": [], "args": ["--start-maximized"] # 添加最大化窗口运作参数
}
}
driver = webdriver.Edge(path,capabilities=options)
driver.get(url)
driver.implicitly_wait(7) #set a waiting time limit for the browser driver
#driver.maximize_window()
return driver