使用selenium爬取京东商品搜索结果(名字、价格、评价数)

使用selenium爬取京东商品搜索结果(名字、价格、评价数)

使用selenium爬取京东商品搜索结果(名字、价格、评价数)

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

一、环境

  1. Ubuntu18.04
  2. Python3
  3. PyCharm
  4. MySQL 5.7.29
  5. selenium、pyquery、json、time
  6. Chrome

二、项目解析

使用selenium需要等待所要元素加载完成,首先需要京东的搜索框加载完成。

# 等待搜索框加载完成
input_keys = wait.until(EC.presence_of_element_located((By.ID, 'key')))

打开京东搜索手机,观察到结果页面是分两次加载的,用循环体来多次将页面滑到底部,使其加载全部。

# 动态加载太多,多滚动几次
for i in range(2):
	# 等待底部翻页栏加载完成
	wait.until(EC.presence_of_element_located((By.ID, 'J_bottomPage')))
	# 滚动条滚动到底部
	browser.execute_script('window.scrollTo(0,10000)')
	# 等待加载元素消失
	wait.until_not(EC.presence_of_element_located((By.ID, 'J_scroll_loading')))
	time.sleep(3)

当前页面的html

html = browser.page_source

查找需要元素
在这里插入图片描述
使用pyquery库解析

# 解析爬到页面的信息
def parse_jd_html(html):
    # 商品在ul.gl-warp的li.item中
    # 使用pyquery解析库解析
    doc = PyQuery(html)
    items = doc('ul.gl-warp li.gl-item').items()
    for item in items:
        yield {
            'name': item.find('.p-name a em').text().strip(),
            'price': item.find('.p-price strong i').text(),
            'commit': item.find('.p-commit strong a').text()
        }

将数据保存到数据库(填写正确数据库用户名、密码和数据库)

# 写入数据库
def write_to_mysql(item):
    try:
        # connect MySQL
        conn = pymysql.connect(
            host='localhost',
            user='root',
            passwd='123456',
            db='jd_selenium',
            port=3306,
            charset='utf8')

        # 创建cursor对象取执行SQL语句
        cursor = conn.cursor()
        table = 'jd_html2'
        keys = ','.join(item.keys())
        values = ','.join(['%s']*len(item))
        sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
        cursor.execute(sql, tuple(item.values()))
        conn.commit()
    except Exception as e:
        print('数据库出错')
        print(e)
    finally:
        cursor.close()
        conn.close()

用sql = ‘INSERT INTO {table}({keys}) VALUES ({values})’.format(table=table, keys=keys, values=values)必须确保表元素与item的关键字一样。
数据库保存记录:
在这里插入图片描述
完整代码

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from pyquery import PyQuery

import time
import json
import pymysql


# 解析爬到页面的信息
def parse_jd_html(html):
    # 商品在ul.gl-warp的li.item中
    # 使用pyquery解析库解析
    doc = PyQuery(html)
    items = doc('ul.gl-warp li.gl-item').items()
    for item in items:
        yield {
            'name': item.find('.p-name a em').text().strip(),
            'price': item.find('.p-price strong i').text(),
            'commit': item.find('.p-commit strong a').text()
        }


# 数据写入文本
def write_to_file(content, filepath):
    with open(filepath, 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')


# 写入数据库
def write_to_mysql(item):
    try:
        # connect MySQL
        conn = pymysql.connect(
            host='localhost',
            user='root',
            passwd='123456',
            db='jd_selenium',
            port=3306,
            charset='utf8')

        # 创建cursor对象取执行SQL语句
        cursor = conn.cursor()
        table = 'jd_html2'
        keys = ','.join(item.keys())
        values = ','.join(['%s']*len(item))
        sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
        cursor.execute(sql, tuple(item.values()))
        conn.commit()
    except Exception as e:
        print('数据库出错')
        print(e)
    finally:
        cursor.close()
        conn.close()


# 根据search_key关键字爬取数据
def search_key(keys):
    # 开启浏览器
    browser = webdriver.Chrome()
    # 设置等待时间
    wait = WebDriverWait(browser, 10)
    try:
        # 获取京东首页
        browser.get('https://jd.com/')
        # 等待搜索框加载完成
        input_keys = wait.until(EC.presence_of_element_located((By.ID, 'key')))
        input_keys.clear()
        input_keys.send_keys(keys)
        input_keys.send_keys(Keys.ENTER)

        # 爬取数据
        def crawling_data():
            # 动态加载太多,多滚动几次
            for i in range(2):
                # 等待底部翻页栏加载完成
                wait.until(EC.presence_of_element_located((By.ID, 'J_bottomPage')))
                # 滚动条滚动到底部
                browser.execute_script('window.scrollTo(0,10000)')
                # 等待加载元素消失
                wait.until_not(EC.presence_of_element_located((By.ID, 'J_scroll_loading')))
                time.sleep(3)
            # 获取总页数
            page_count = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_bottomPage .p-skip b')))
            # 获取爬到当前页数
            page_input = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '#J_bottomPage .p-skip .input-txt')))
            # 确定按钮
            page_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage .p-skip a')))
            html = browser.page_source

            # 解析并且写入
            for item in parse_jd_html(html):
                # 写入txt中
                # write_to_file(item, keys + '.txt')
                # 写入mysql中
                write_to_mysql(item)
            # 总页数
            count = int(page_count.text)
            # 当前页数
            current = int(page_input.get_attribute('value'))
            print('完成:', current, '/', count)
            # 下一页
            if current < count:
                page_input.clear()
                page_input.send_keys(str(current+1))
                page_button.click()
                crawling_data()
        crawling_data()
    # 出错处理
    except Exception as e:
        print('exception', e)
    finally:
        browser.quit()                           # 关闭浏览器
        # 显示退出
        print("browser quit")


if __name__ == '__main__':
    search_key('手机')

使用这个有时无法爬取全部页面,会在一半停下来,也不报错,我也不知道为什么。
第一次写,有什么写的不好请联系。
QQ邮箱:172688512@qq.com

参考文献:https://blog.csdn.net/gongjianbo1992/article/details/99769849?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您下载了本程序,但是该程序无法运行,或者您不会部署,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的) 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取据并存储,以便后续分析或展示。爬虫通常由搜索引擎、据挖掘工具、监测系统等应用于网络据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标据,如文本、图片、链接等。 据存储: 爬虫将提取的据存储到据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型据库、NoSQL据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
好的,以下是使用selenium模拟浏览器爬取京东商品评价的代码: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from time import sleep # 创建一个浏览器对象 browser = webdriver.Chrome() # 访问京东首页 browser.get('https://www.jd.com/') # 查找搜索框并输入要搜索商品名称 search_box = browser.find_element_by_id('key') search_box.send_keys('手机') search_box.send_keys(Keys.ENTER) # 等待搜索结果页面加载完成 sleep(3) # 找到商品列表中第一个商品的链接并点击进入商品详情页 product_link = browser.find_element_by_css_selector('.gl-item:nth-child(1) .p-name a') product_link.click() # 切换到新打开的标签页 browser.switch_to.window(browser.window_handles[-1]) # 进入商品评价页面 browser.find_element_by_css_selector('#detail .comment-count').click() # 模拟滚动加载评价据 while True: browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') sleep(3) try: # 找到“查看更多”的按钮并点击 more_button = browser.find_element_by_css_selector('.comment-item .comment-operate .btn-append') more_button.click() sleep(3) except: # 没有“查看更多”按钮,说明评价据已全部加载完成 break # 找到所有评价的元素 comments = browser.find_elements_by_css_selector('.comment-item') # 遍历所有评价并输出评价内容 for comment in comments: content = comment.find_element_by_css_selector('.comment-con').text.strip() print(content) # 关闭浏览器 browser.quit() ``` 上面的代码中,我们首先使用`selenium`创建一个`Chrome`浏览器对象,并访问京东首页。然后,我们在搜索框中输入要搜索商品名称,按下`Enter`键进行搜索搜索结果页面加载完成后,我们找到商品列表中第一个商品的链接,并点击进入商品详情页。切换到新打开的标签页后,我们进入商品评价页面,然后模拟滚动加载评价据,并在评价据全部加载完成后,找到所有评价的元素,遍历所有评价并输出评价内容。最后,关闭浏览器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值