基于Python Selenium在Edge浏览器下爬取商品信息

#基于Python Selenium在Edge浏览器下爬取商品信息

问题背景描述

最近跑一个爬虫作业的时候用到了selenium,用的模板是Chrome浏览器的,而我自己用的是Edge,所以在一些代码上需要进行改动,否则会报错,比如Edge浏览器启动项,等等。这里记录一下,也给有同样需要的人提供参考。借鉴了一些其他文章,我会放在末尾参考资料里,代码我还没学会github,所以所有代码我都放文章里了,顺序为:主程序-定义的函数,我会先介绍主程序。

作业描述:给定一个商店网址,要求获取商店内5个最贵的商品名字和价格,使用工具为selenium,使用代码为python,实验环境为anaconda+jupyternotebook。
老师给的参考步骤如下,我没有严格按照步骤来写:

  1. Search the empty keyword(keyword = ‘’) to get every products
  2. fetch the pages with given keyword,这里keyword我们不输入,就会展示所有信息。
  3. There’re serval products on one page. To get the product detail, it requires you to access the product page by the ‘href url’
  4. get all the links of products on that page.
  5. Use a loop to get all the product pages.
  6. Parse the product name and price from that page.
  7. Store the product information
  8. Find the next_page url
  9. If next_page url exist then fetch the next_page and go back to Step (2)
  10. Sort the products by price and retrieve the names of top 5 as the result
  11. Save the top5 result as json file, name the file “result.json”.

同时也给了一些提示:

  1. It’s recommended to use a ‘dict’ to store the retrieving result (products name as key and price as value).所以我把原程序里面的’products‘,商品信息换成了dict格式,再排序,最后以字典输出前五个。
  2. All the above processes are run on your own local machine (jupyterhub is not working).
  3. A template code to parse the html pages is given on the Gitea.

工具准备

工具一:anaconda3+jupyter,这个不给教程了,也可以用其他环境。
工具二:需要下载Edge专用的驱动,网址为Edge Driver。
下载完成后,放入python脚本同一目录下,我用的是jupyter,所以我放的如图:
基于Python Selenium在Edge浏览器下爬取商品信息_第1张图片

需要注意的是,下载完要改名字,改为:‘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后面的东西可以自己修改。
介绍一下大概思路:

  1. 将网址和驱动地址传给open_driver函数,打开浏览器。
  2. 关键字搜索,由于我们要的是全商品,所以这里不搜,直接按Enter即可。
  3. 关键步骤,在打开的网页上,也就是首页,查找页码对应的元素,这里是CLASS_NAME类,名字是 “page-item”,这一步相当于把所有的页码以及他们的链接都放进了page_items,方便我们后面点击切换页面。
  4. 接下来对于每一个页面,我们分别爬取信息,所以用了for循环,由于首页已经打开,所以这里判断一下如果是首页,就不点下一页了。如果不是首页,通过TAG_NAME,'a’找到当前循环的这个页的链接,点击,实际执行点击的是page_link.send_keys(Keys.CONTROL,Keys.RETURN。
#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()
'''
在这里插入代码片

open_driver

改动一: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

参考资料

  1. https://blog.csdn.net/XianZhe_/article/details/120929106

你可能感兴趣的:(python,edge,python,selenium)