躲在被窝里偷偷学爬虫(7)---爬虫界的平头哥selenium

selenium库

1,爬虫中为何要使用selenium?

当你经常爬取网页过程中,就会发现许多我们想要获取的数据并不能通过简单的解析HTML代码来获取,因为这些数据是通过AJAX加载或js渲染等其他手段动态加载才能呈现在页面上的。

2,何为selenium库?

selenuim是一种自动化测试工具,它支持多种浏览器,如Firefox,Safari,Google Chrome,IE,Edge等。在爬虫中,我们将其运行在浏览器中,就像真正的用户在操作一样,进而解决以上所提出的难题,就同平头哥把毒蛇当辣条一样统统解决!正因如此,许多网站对于selenium爬虫才显得头皮发麻,四肢无力

3,selenium使用前的准备

①先进行环境安装:在dos窗口输入pip install selenium回车即可

②下载一个浏览器的驱动程序(小编在这里以谷歌浏览器为例),输入网址http://chromedriver.storage.googleapis.com/index.html进行下载对应版本的驱动

查看自己谷歌浏览器版本号:在谷歌浏览器中输入此url(chrome://settings/help)回车即可
躲在被窝里偷偷学爬虫(7)---爬虫界的平头哥selenium_第1张图片
然后到刚才下载驱动的页面找对应的版本
躲在被窝里偷偷学爬虫(7)---爬虫界的平头哥selenium_第2张图片躲在被窝里偷偷学爬虫(7)---爬虫界的平头哥selenium_第3张图片
下载后进行解压,将里面的exe可执行文件进行复制,往谷歌浏览器的根目录下粘贴一份
躲在被窝里偷偷学爬虫(7)---爬虫界的平头哥selenium_第4张图片
往自己写selenium爬虫代码的同目录粘贴一份
躲在被窝里偷偷学爬虫(7)---爬虫界的平头哥selenium_第5张图片

4,登录淘宝 + 规避检测

部分大网站,会专门检测用户往服务器发起的是否是基于selenium的请求,所以我们要想办法规避服务器检测

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-28

from selenium import webdriver
import time


# 实例化一个浏览器对象(导入驱动器路径)
bro = webdriver.Chrome(executable_path='chromedriver.exe')

# 实现规避检测
script = '''
Object.defineProperty(navigator, 'webdriver', {
    get: () => undefined
})
'''
bro.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
     "source": script})

# 对指定url发请求
bro.get('https://www.taobao.com/')
# 模拟鼠标点击左上角的红字"亲,请登录"
bro.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click()
# 录入账号
user = bro.find_element_by_xpath('//*[@id="fm-login-id"]')
user.send_keys('账号') # 此处填写淘宝账号
time.sleep(1)
# 录入密码
pwd = bro.find_element_by_xpath('//*[@id="fm-login-password"]')
pwd.send_keys('密码') # 此处填写淘宝账号的密码
time.sleep(1)
# 模拟鼠标点击登录按钮
bro.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()


time.sleep(30)
# 关闭浏览器
bro.quit()
5,自动进入京东搜索iPhone,并爬取前三页的价格和对应详情 + 实现无头化界面 + 规避检测

我们有时使用selenium爬取页面数据,并不希望弹出浏览器界面,所以就可以实现无头化界面爬取

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:HePengLi
# @Time:2021-03-28

from selenium import webdriver
from lxml import etree
import time
from selenium.webdriver.chrome.options import Options

url = 'https://www.jd.com'

# 实现无头化界面
option = Options()
option.add_argument('--headless')
option.add_argument('--disable-gpu')

bro = webdriver.Chrome(executable_path='chromedriver.exe', options=option)

# 实现规避检测
script = '''
Object.defineProperty(navigator, 'webdriver', {
    get: () => undefined
})
'''
bro.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
     "source": script})

bro.get(url)
time.sleep(2)
all_page = []
# 定位输入框
search_k = bro.find_element_by_class_name('text')
# 往搜索框中录入数据
search_k.send_keys('iphone')
time.sleep(1)
butt = bro.find_element_by_class_name('button')
butt.click()
time.sleep(2)

# 捕获当前页面的源码数据
# 当前页面全部加载完成后对应的数据
page_content = bro.page_source
all_page.append(page_content)
# 点击下一页
for i in range(2):
    next_page = bro.find_element_by_xpath('//*[@id="J_bottomPage"]/span[1]/a[9]')
    next_page.click()
    time.sleep(1)
    all_page.append(bro.page_source)

# print(all_page)

f = open('jd.txt', 'w', encoding='utf-8')
# 解析数据
for page in all_page:

    tree  =etree.HTML(page)
    li_list = tree.xpath('//*[@id="J_goodsList"]/ul/li')
    # print(li_list)

    for li in li_list:
        price = li.xpath('.//div[@class="p-price"]/strong//text()')
        # 处理数据
        if len(price) == 2:
            pri = price[0] + price[1]
        else:
            pri = price[1] + price[2]
        # print(pri)
        # print(price[1], price[2])

        content = li.xpath('.//div[@class="p-name p-name-type-2"]/a/em//text()')
        # print(content)
        # 处理数据
        if len(content) == 2:
            con = content[0] + content[1]
        elif len(content) == 3:
            con = content[0] + content[1] + content[2]
        else:
            con = content[0] + content[1] + content[2] + content[3]

        # print(pri+con)
        data = '价格:' + pri + '  ' +'具体详情:' + con
        # print(data)
        f.write(data + '\n')
print('\033[31;1mDownload over!!!\033[0m')

time.sleep(5)
bro.quit()

躲在被窝里偷偷学爬虫(7)---爬虫界的平头哥selenium_第6张图片
温馨提醒:像京东淘宝等大网站的商品价格一般不要轻易爬取,退一步,即使爬取也不要一次贪多,否则极容易被封掉IP

你可能感兴趣的:(爬虫,selenium)