Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息

上一篇介绍了Ajax动态渲染的页面的分析和爬取,通过JavaScript动态渲染的页面的方式不只有ajax这一种,还有很多其他的方式,分析他们的网页结构和加密参数难度非常大,为了解决这样的页面的数据爬取,我们可以直接使用模拟浏览器运行的方式来实现。python中有很多可以模拟浏览器运行的库,其中最常用的是Selenium,它是一个自动化的web应用的软件测试工具,利用它可以驱动浏览器执行特定的动作,同时也可以获取浏览器当前呈现的页面的源代码,这篇博文将向大家简要介绍一下selenium的使用以及如何通过selenium来爬取一号店的商品信息

Selenium的配置与使用

Selenium库的安装与ChromeDriver的配置

我们这里以selenium驱动Chrome浏览器为例,先在python中通过pip install selenium安装好selenium库,之后为了能够让selenium驱动Chrome还需要去下载ChromeDriver,通过国内镜像网站进行下载http://npm.taobao.org/mirrors/chromedriver/,下载前先要确认自己的Chrome浏览器内核版本,如下图所示,内核版本为76.0.3809.132,下载的76.0.3809.126亲测可用,然后将下载好的chromedriver.exe文件放到python的Script目录下,配置工作完成。
Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息_第1张图片
利用如下一段Python代码进行测试,如果能成功弹出来一号店首页,说明配置成功

from selenium import webdriver
browser=webdriver.Chrome() #打开Chrome浏览器
browser.get('https://www.yhd.com') #访问一号店

selenium的使用

接下来我们来结合一号店网页来具体了解一下selenium的使用,通过browser.get(‘https://www.yhd.com’)命令我们获取了一号店网页的句柄,然后可以使用browser.page_source命令来获取网页源代码,然后观察网页源代码,这里为了便于观察就向大家展示开发者工具看到的源码,红框圈出的部分为搜索框input和搜索按钮button,在selenium中我们可以通过find_element_by_id(通过id定位),find_element_by_class(通过class定位)等方法来定位到元素,这里我们可以通过如下两条命令定位到搜索框和搜索按钮:

input_search=browser.find_element_by_class_name('hd_search_ipt')
button=browser.find_element_by_class_name('hd_search_btn')

Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息_第2张图片
之后我们可以用send_keys方法向搜索框中输入搜索内容,然后点击button进行搜索,命令如下所示:

input_search.send_keys("女仆")
button.click()

之后便会跳转到商品页面,如下图所示,页面里每件商品的信息都在右上选中的那个元素的下拉列表里,可以爬取相应的信息:
Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息_第3张图片
爬取完该页信息之后,需要跳转到下一页,由于翻页的各页码元素在网页加载完成之后还需要再等待一段时间才能加载出来,所以我们需要利用如下代码来设置等待翻页元素加载出来之后再获取该元素,使用selenium中的WebDriverWait和expected_conditions方法,最长等待10s元素加载,获取第二页的按钮点击即可跳转到第二页:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait=WebDriverWait(browser,10)
submit=wait.until(EC.element_to_be_clickable((By.ID,'page_2')))
submit.click()

使用Selenium自动化测试工具爬取一号店商品图片代码

介绍完selenium的使用之后,爬取一号店商品信息的代码已经基本上完成,我们爬取前10页商品的图片下载到本地,使用正则表达式获取商品小图下载链接,python代码如下所示:

#author:xingfengxueyu
#time:2020/04/25
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
import requests
import os
browser=webdriver.Chrome()
browser.get('https://www.yhd.com/')
input_1=browser.find_element_by_class_name('hd_search_ipt')
input_1.send_keys("女仆")
button=browser.find_element_by_class_name('hd_search_btn')
button.click()
if not os.path.exists('yhd_np'):
    os.mkdir('yhd_np')  #创建文件夹存放商品图片
for i in range(2,11):
    soup = BeautifulSoup(browser.page_source, 'lxml')
    for img in soup.find_all(attrs={'class': 'img'}):
        url=re.findall('',str(img))[0] 
        if 'src' in url:
            url=re.findall('',str(img))[0]
        url="http:"+url #图片下载链接,有两种图片链接格式,所以要分别处理
        try:
            pic_r=requests.get(url)
            title=url.split('/')[-1].split('!')[0]
            #print(title)
            with open('yhd_np\{0}'.format(title),'wb') as f:
                f.write(pic_r.content)
        except:
            print(img)
            print(url)
    wait=WebDriverWait(browser,10)
    submit=wait.until(EC.element_to_be_clickable((By.ID,'page_'+str(i))))
    submit.click() #点击翻页
browser.close()#关闭浏览器

最终各商品的小图都下载到文件夹中,如下所示:
Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息_第4张图片

你可能感兴趣的:(Python高级特性与网络爬虫,selenium,python,前端)