selenium使用_使用selenium爬取京东商品评论

本文介绍了如何利用Selenium和PyQuery爬取京东商品评论,包括环境配置(如安装Docker和Splash)、规避页面元素遮挡问题以及解决翻页时的元素查找问题。在获取评论信息部分,通过解析CSS选择器提取评论内容。
摘要由CSDN通过智能技术生成

4773c4aaead83dcc5ade4416a9b9674a.png

前言

我们在爬取网页时经常会遇到动态渲染页面,对于普通的Ajax,可以利用requests和urllib来实现数据爬取,但是javascript不止ajax一种,其规律有时很难发现,这一过程也会浪费很多时间。而selenium可以模拟浏览器执行特定的动作,这样就不用在乎javascript是如何渲染页面了。本次的实验对象是京东商品的评论,网址如下:

【ThinkPad】联想ThinkPad E580 15.6英寸轻薄窄边框笔记本电脑ibm大屏办公笔记本 英特尔酷睿 i5-7200U 8G 256G 1WCD【行情 报价 价格 评测】-京东​item.jd.com
542642b779fef07be26c57c4e80d3834.png

当然你也可以使用selenium模拟浏览器在京东网页中搜索相关商品,操作也比较简单。所以我们专注讲解爬取商品评论的核心代码。

环境准备

1.我使用的编译器是pycharm

首先需要selenium库来模拟浏览器执行相关操作

在解析页面内容时我们会用到pyquery。

两个库可直接在anaconda中添加。

2.为方便以后selenium的学习,建议下载Splash

Splash是一个Javascript渲染服务,相当于一个轻量级的浏览器。

下载Splash前需要下载docker,官网下载地址如下:

https://www.docker.com/products/docker-desktop


下载前需要注册,如果是Win10专业版可以直接安装成功,Win10家庭版的话还需要安装hyper-V服务,将如下复制到.cmd文件中以管理员身份执行,完成hyper-V安装。

pushd "%~dp0"
dir /b %SystemRoot%servicingPackages*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%servicingPackages%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

安装后查看Windows功能,可以看到hyper-v:

c7e95591be86a252f226ee3aa071c3a9.png

随后还要伪装成专业版,不然安装时还会报错,方法是:

打开注册表,定位到HKEY_LOCAL_MACHINEsoftwareMicrosoftWindows NTCurrentVersion,点击current version,在右侧找到EditionId,右键点击EditionId 选择“修改“,在弹出的对话框中将第二项”数值数据“的内容改为Professional,然后点击确定。再安装docker.exe文件即可正常安装。

然后在终端输入如下代码安装splash:

docker run -p 8050:8050 scrapinghub/splash

即可安装splash。

代码实战

1.观察商品界面,找到评论处,发现html后面会加上'#html',我们爬取时可以直接从这个页面中爬取。

0cc1c57694e034aa2dc33eccfbacd2f8.png
商品评论

爬取思路是先获取评论页面,并可以执行翻页功能,核心就是找到‘下一页’按钮。

右键‘下一页’,点击检查,获取节点信息:

6d2368056c47d749adc6365f3f761bc6.png

可以看到它的父元素的class为ui=page,他的class为'ui-pager-next',爬取代码如下:

def commodity_page(page):
 
    print('正在爬取第', page, '页')

    try:
        url = 'https://item.jd.com/46339527372.html#comment'
       
        browser.get(url)
        if page == 1:
            browser.maximize_window()  #避开右下角图标
        try:
            next_page = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.ui-page>a.ui-pager-next')))
        except:
            next_page = 0
        print(next_page)
        # ActionChains(browser).move_to_element(next_page).perform()
        #
        # ActionChains(browser).move_to_element(mouse).perform()
        time.sleep(3)
        browser.get(url)
        get_comments()

        if next_page != 0:
            # time.sleep(3)
            next_page = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.ui-page>a.ui-pager-next')))
            next_page.click()
            page = page+1
            commodity_page(page)  #获取评论信息

        else:
            print('已经是最后一页')
            return

    except TimeoutException:
        print('连接超时')

代码量不多,但是有两个大坑。第一个坑如下:

deeab97848016125ca9bf873f335d827.png

报错的意思就是'下一页'按钮被覆盖,观察界面,它被右下角的图标覆盖,如下图。

ddc7cb225fee89cf82397b0ecf8a6cfb.png

打开浏览器,要想去掉它,可以通过点击叉号或者鼠标悬停一段时间然后移出,但是更简单的方法是改变浏览器大小,直接避开了这个问题。代码如下:

browser.maximize_window()

第二个坑是在爬取第三页的时候报错

bafb8e4b19e6d396f8e6efeacd1996b1.png

这里必须重新寻找下一页的按钮,否则只能爬取两页的数据。

2.获取评论信息

同样的方法查找评论具体信息的节点的class为comment-0,然后通过pyquery解析界面,筛选出评论内容,代码如下:

html = browser.page_source
    doc = pq(html)
    items = doc('#comment-0').items()
    for item in items:
        comment = {

            'content': item.find('.comment-con').text()
        }

将结果打印,验证是否成功:

fd749827db5558f73ff7e1097ab91074.png

评论爬取成功!

补充

本文侧重于selenium的使用,并未对数据在数据库上进行存储,解析数据时也可以使用其它库,关于这方面的内容可以查看这一篇文章:

贝特西:通过爬虫爬取2000名明星照片进行颜值评测,你心中的男/女神有多少评分?​zhuanlan.zhihu.com
好的,以下是使用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、付费专栏及课程。

余额充值