Advertisement

Selenium实战之Python+Selenium爬取京东商品数据

阅读量:

实战目标:爬取京东商品信息,包括商品的标题、链接、价格、评价数量。

代码核心在于这几个部分:

  • 其一:通过元素定位技术捕获页面上指定关键字的元素定位结果;
  • 其二:数据结果将被永久性保存至本地文件中。

从获取URL的过程出发,在完整流程中对各个关键节点进行了详细分析和研究。主要完成了数据采集和处理的任务。

爬取京东商品数据具体过程分析

1、准备接口数据

复制代码
    # 京东商城网址
    url = 'https://www.jd.com/'

2、创建浏览器实例对象

复制代码
    # driver = webdriver.Firefox()      # 创建 Firefox 浏览器实例对象
    # driver = webdriver.Ie()           # 创建 IE 浏览器实例对象
    # driver = webdriver.Edge()         # 创建 Edge 浏览器实例对象
    # driver = webdriver.Safari()       # 创建 Safari 浏览器实例对象
    # driver = webdriver.Opera()        # 创建 Opera 浏览器实例对象
    driver = webdriver.Chrome()         # 创建 Chrome 浏览器实例对象

通过调用webdriver.Chrome()生成实例对象后会运行Chrome浏览器。
webdriver.Chrome()方法中无参数配置时,默认设置为executable_path="chromedriver" ,该属性表示的是程序运行所需的浏览器驱动文件路径,默认情况下位于Python的安装目录中。
当实际路径与默认值不同时,则需指定 executable_path 为实际路径。
如:

复制代码
    driver = webdriver.Chrome(executable_path="D:/driver/chromedriver.exe")

2、访问URL

复制代码
    # 浏览器访问地址
    drver.get(url)

使用浏览器打开后,在driver中执行get(url)方法以进入地址栏中的指定位置。即录入URL到地址栏并按回车键以打开目标网站。

3、隐式等待、最大化浏览器窗口

复制代码
    # 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
    drver.implicitly_wait(3)
    # 最大化浏览器窗口,主要是防止内容被遮挡
    drver.maximize_window()

在操作之前,在implicitly_wait()方法下执行对浏览器进行页面加载前的时态操作,在完成页面加载后调用maximize_window()函数扩大窗口尺寸至最大以避免定位不到目标元素的情况

3、定位搜索框

复制代码
    # 通过id=key定位到搜索框
    input_search = drver.find_element_by_id('key')
    # 在输入框中输入“口罩”
    input_search.send_keys(keyword)
    # 模拟键盘回车Enter操作进行搜索
    input_search.send_keys(Keys.ENTER)
    # 强制等待3秒
    sleep(3)

通过ID定位到该搜索框的动作由driver完成,并依次执行以下步骤:首先使用send_keys()方法输入关键字keyword;随后,在send_keys()内部传递Keys.ENTER以模拟回车操作;最后执行wait(3)命令以确保搜索结果页面加载完毕。至此完成了从定位搜索框到输入关键词并执行回车的操作流程。

4、定位元素(商品的标题、链接、价格、评价数量)

复制代码
    # 获取当前第一页所有商品的li标签
    goods = driver.find_elements_by_class_name('gl-item')
    for good in goods:   
    # 获取商品标题
    title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
    # 获取商品链接
    link = good.find_element_by_tag_name('a').get_attribute('href')
    # 获取商品价格
    price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
    # 获取商品评价数量
    commit = good.find_element_by_css_selector('.p-commit a').text

该页面所有商品的< li >标签可以通过调用find_elements_by_class_name('gl-item')方法获取其class=‘gl-item’;随后遍历每一个< li >标签;然后逐一采用不同的定位手段找出每个商品的具体信息如链接、标题、价格及评价数量等。

通过CSS选择器定位到该元素标签后,在调用其text属性值以获取目标元素内的文本内容(即商品标题),随后使用replace()方法替换掉换行符以去除多余空白。
这样一来完整的商品标题信息就成功提取完毕。

复制代码
    # 获取商品标题名称

    title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')

确定商品链接:在确定 <a> 标签后,通过提取其 href 属性值来获得该商品的链接地址。

复制代码
    # 获取商品链接

    link = good.find_element_by_tag_name('a').get_attribute('href')

获取商品的价格信息:首先利用CSS选择器定位到目标元素;接着调用该元素的text属性获取其内容(即为商品价格);最后采用replace()方法将换行符替换为空字符串以消除多余的新行;从而完整地获得了所需的商品价格信息。

复制代码
    # 获取商品价格

    price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')

为了获取商品评论的数量,请使用 CSS 选择器找到对应的标签元素,并调用其实现 text 属性来读取该标签的内容。

复制代码
    # 获取商品评价数量

    commit = good.find_element_by_css_selector('.p-commit a').text

5、将商品数据存储到文件中

①存储到txt文件中

复制代码
    # 获取当前文件路径
    paths = path.dirname(__file__)
     # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
     file = path.join(paths, 'good.txt')
     # 以追加写入的方式将商品数据保存到文件中
     with open(file, 'a+', encoding='utf-8', newline='') as wf:
     wf.write(msg)

②存储到CSV文件中

复制代码
    # 表头
    header = ['商品标题', '商品价格', '商品链接', '评论量']
    # 获取当前文件路径
    paths = path.dirname(__file__)
    # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
    file = path.join(paths, 'good_data.csv')
    # 以追加写入的方式将商品数据保存到文件中
    with open(file, 'a+', encoding='utf-8', newline='') as wf:
    f_csv = csv.DictWriter(wf, header)
    f_csv.writeheader()
    f_csv.writerows(data)

6、退出浏览器

复制代码
    # 退出关闭浏览器
    drver.quit()

在完成商品数据的抓取后即可直接关闭浏览器以释放资源 这就是整个爬取流程的过程 而接下来则需要对抓取的数据进行进一步分析

完整示例代码

①存储到txt文件中

复制代码
    # -*- coding: utf-8 -*-
    # @Time : 2021/10/26 17:35
    # @Author : Jane
    # @Software: PyCharm
    
    
    # 导入库
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys # 键盘按键操作
    from os import path
    
    
    # 京东商城网址
    url = 'https://www.jd.com/'
    # 创建浏览器对象
    driver = webdriver.Chrome()
    # 浏览器访问地址
    driver.get(url)
    # 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
    driver.implicitly_wait(3)
    # 最大化浏览器窗口,主要是防止内容被遮挡
    driver.maximize_window()
    # 通过id=key定位到搜索框
    input_search = driver.find_element_by_id('key')
    # 在输入框中输入“口罩”
    input_search.send_keys('女士包包')
    # 模拟键盘回车Enter操作进行搜索
    input_search.send_keys(Keys.ENTER)
    # 强制等待3秒
    sleep(3)
    # 获取当前第一页所有商品的li标签
    goods = driver.find_elements_by_class_name('gl-item')
    for good in goods:
    # 获取商品链接
    link = good.find_element_by_tag_name('a').get_attribute('href')
    # 获取商品标题名称
    title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
    # 获取商品价格
    price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
    # 获取商品评价数量
    commit = good.find_element_by_css_selector('.p-commit a').text
    msg = '''
        商品:%s
        链接:%s
        价格:%s
        评论:%s
    '''%(title, link, price, commit)
    # 获取当前文件路径
    paths = path.dirname(__file__)
    # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
    file = path.join(paths, 'good.txt')
    # 以追加写入的方式将商品数据保存到文件中
    with open(file, 'a+', encoding='utf-8', newline='') as wf:
        wf.write(msg)
    # 退出关闭浏览器
    driver.quit()

②存储到CSV文件中

复制代码
    # -*- coding: utf-8 -*-
    # @Time : 2021/10/26 17:35
    # @Author : Jane
    # @Software: PyCharm
    
    
    # 导入库
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys # 键盘按键操作
    from os import path
    import csv
    
    
    # 京东商城网址
    url = 'https://www.jd.com/'
    # 创建浏览器对象
    driver = webdriver.Chrome()
    # 浏览器访问地址
    driver.get(url)
    # 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
    driver.implicitly_wait(3)
    # 最大化浏览器窗口,主要是防止内容被遮挡
    driver.maximize_window()
    # 通过id=key定位到搜索框
    input_search = driver.find_element_by_id('key')
    # 在输入框中输入“口罩”
    input_search.send_keys('女士包包')
    # 模拟键盘回车Enter操作进行搜索
    input_search.send_keys(Keys.ENTER)
    # 强制等待3秒
    sleep(3)
    # 获取当前第一页所有商品的li标签
    goods = driver.find_elements_by_class_name('gl-item')
    for good in goods:
    # 获取商品链接
    link = good.find_element_by_tag_name('a').get_attribute('href')
    # 获取商品标题名称
    title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
    # 获取商品价格
    price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
    # 获取商品评价数量
    commit = good.find_element_by_css_selector('.p-commit a').text
    msg = '''
        商品:%s
        链接:%s
        价格:%s
        评论:%s
    '''%(title, link, price, commit)
    
    # 表头
    header = ['商品标题', '商品价格', '商品链接', '评论量']
    # 获取当前文件路径
    paths = path.dirname(__file__)
    # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
    file = path.join(paths, 'good_data.csv')
    # 以追加写入的方式将商品数据保存到文件中
    with open(file, 'a+', encoding='utf-8', newline='') as wf:
    f_csv = csv.DictWriter(wf, header)
    f_csv.writeheader()
    f_csv.writerows(data)
    
    # 退出关闭浏览器
    driver.quit()

③将代码进行封装

复制代码
    # -*- coding: utf-8 -*-
    # @Time : 2021/10/26 17:35
    # @Author : Jane
    # @Software: PyCharm
    
    
    # 导入库
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys # 键盘按键操作
    from os import path
    import csv
    
    
    def spider(url, keyword):
    # 创建浏览器对象
    drver = webdriver.Chrome()
    # 浏览器访问地址
    drver.get(url)
    # 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
    drver.implicitly_wait(3)
    # 最大化浏览器窗口,主要是防止内容被遮挡
    drver.maximize_window()
    # 通过id=key定位到搜索框
    input_search = drver.find_element_by_id('key')
    # 在输入框中输入“口罩”
    input_search.send_keys(keyword)
    # 模拟键盘回车Enter操作进行搜索
    input_search.send_keys(Keys.ENTER)
    # 强制等待3秒
    sleep(3)
    # 抓取商品数据
    get_good(drver)
    # 退出关闭浏览器
    drver.quit()
    
    # 抓取商品数据
    def get_good(driver):
    # 获取当前第一页所有商品的li标签
    goods = driver.find_elements_by_class_name('gl-item')
    data = []
    for good in goods:
        # 获取商品链接
        link = good.find_element_by_tag_name('a').get_attribute('href')
        # 获取商品标题名称
        title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
        # 获取商品价格
        price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
        # 获取商品评价数量
        commit = good.find_element_by_css_selector('.p-commit a').text
        # 将商品数据存入字典
        good_data = {
            '商品标题':title,
            '商品价格':price,
            '商品链接':link,
            '评论量':commit
        }
        data.append(good_data)
    saveCSV(data)
    
    
    # 保存商品数据到CSV文件中
    def saveCSV(data):
    # 表头
    header = ['商品标题', '商品价格', '商品链接', '评论量']
    # 获取当前文件路径
    paths = path.dirname(__file__)
    # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
    file = path.join(paths, 'good_data.csv')
    # 以追加写入的方式将商品数据保存到文件中
    with open(file, 'a+', encoding='utf-8', newline='') as wf:
        f_csv = csv.DictWriter(wf, header)
        f_csv.writeheader()
        f_csv.writerows(data)
    
    
    # 判断文件程序入口
    if __name__ == '__main__':
    # 京东商城网址
    url = 'https://www.jd.com/'
    # 搜索关键字“女士编包”
    keyword = '女士包包'
    # 爬取数据
    spider(url, keyword)

全部评论 (0)

还没有任何评论哟~