Advertisement

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

阅读量:

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

  • 其一:通过元素定位捕获所需关键词。
  • 其二:被永久存储到本地文件中的数据。

具体来说,在获取URL的过程中对整个数据采集流程进行了详细系统地分析和研究,在这一过程的全程中主要关注并完成了哪些关键点的工作?

我们来看看spider()方法里面具体做了哪些事情:

spider() 方法实现

1、创建浏览器对象

复制代码
    # 创建浏览器对象
    drver = webdriver.Chrome()

使用webdriver库中的webdriver.Chrome()方法创建浏览器实例时,默认会启动并打开一个Chrome窗口。当调用Chrome()方法而不提供参数时,默认使用executable_path="chromedriver"指定路径。此默认位置通常位于Python安装目录下的bin文件夹中。如果实际运行环境中的WebDriver服务端位于其他路径,请替换路径到实际运行环境中。

2、访问URL地址

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

打开浏览器后driver调用get(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)

使用 driver 对象先定位到 ID 为 'key' 的元素;接着通过 send_keys 方法传递关键词 'keyword' 进行输入;随后,在 send_keys 方法内部调用 Keys.ENTER 来模拟回车操作;最后使用 sleep(3) 方法来强制等待搜索结果加载完成;整个流程依次经历了:定位输入框 -> 输入关键词 -> 模拟回车

4、调用 get_good() 方法抓取商品数据

复制代码
    # 抓取商品数据
    get_good(drver)

将抓取商品数据的具体操作步骤打包为get_good()方法并传递到driver参数调用

5、退出浏览器

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

在获取完商品数据之后就可以立即关闭浏览器并及时释放资源。这代表了整个爬取流程的核心步骤。而随后的数据提取过程则直接进入分析阶段。

get_good() 方法实现

完整代码

复制代码
    # -*- 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
    
    
    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')
    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)
        # 保存商品数据到txt文件中
        saveTXT(msg)
    
    
    # 保存商品数据到txt文件中
    def saveTXT(msg):
    # 获取当前文件路径
    paths = path.dirname(__file__)
    # 将当前文件路径与文件名拼接起来作为商品数据的存储路径
    file = path.join(paths, 'good_data.txt')
    # 以追加写入的方式将商品数据保存到文件中
    with open(file, 'a+', encoding='utf-8') as wf:
        wf.write(msg)
    
    # 判断文件程序入口
    if __name__ == '__main__':
    	# 京东商城网址
    url = 'https://www.jd.com/'
    # 搜索关键字“女士编包”
    keyword = '女士包包'
    # 爬取数据
    spider(url, keyword)

2、将数据存储到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
    
    
    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)

还没有任何评论哟~