爬虫二——Selenium

版权声明:正在学习中,有错误欢迎指出一起交流呀感谢!ヾ(✿゚▽゚)ノ https://blog.csdn.net/gx17864373822/article/details/87819764

抓取页面时首先需要认真分析网页结构

京东商品。输入关键字,自动回车,读出数据,提取数据
拿手机举例:
一页60个数据,30个一加载,后面的30个用的是ajax。
一页

'''
selenium
软件测试工具:功能测试, 单元测试, 性能测试, 压力测试, 安全性测试
1) 安装 selenium
    pip install selenium

2) 浏览器的驱动
    下载驱动程序(必须对应), 版本   http://chromedriver.storage.googleapis.com/index.html
    查看Chrome浏览器的版本

3) 将驱动程序拷贝到项目目录下

注意:
    驱动一般直接放到项目目录下,
    如果不行, 放到Anaconda下的Scripts文件夹下

'''
from selenuim import webdriver
from selenuim.webdriver.support.wait import WebDriverWait
from selenuim.webdriver.support import expected_conditions as EC
from selenuim.webdriver.common.by import By
import time

# 打开 浏览器, 获取到浏览器对象
browser = webdriver.Chrome()
# webdriver.Firefox()
# webdriver.Opera()

# 请求URL
url = 'https://www.jd.com/'
browser.get(url)

# 找到页面中的输入框
'''
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
'''
input = browser.find_element_by_id('key')

# 向输入框中添加字符串
input.send_keys("手机")

# 模拟键盘输入回车
input.send_keys('\n')

# 等待页面
'''
WebDriverWait()
第一个参数: 等待的浏览器对象
第二个参数: 等待的最长时间
'''
wait = WebDriverWait(browser, 10)

# 等待一个操作, 操作类型
# presence_of_element_located(  对象 ) 等待操作
#       等待对象加载完成
#       等待对象的加载, 直到找到对象, 或者超出设置的等待时间
goods_list = wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))

print(goods_list)

# 获取手机页面信息
#print(browser.page_source)

# 选择节点的方式
# browser.find_element_by_id()
# browser.find_element_by_class_name()
# browser.find_element_by_css_selector()
div = browser.find_element_by_class_name('gl-i-wrap')

print(div.text)     # 类似于bs4 get_text()
print(div.get_attribute('class'))

ls_li = goods_list.find_elements_by_class_name('gl-item')
print(len(ls_li))

# 在浏览器执行一段JS代码, 让页面滚动到指定位置
browser.execute_script('arguments[0].scrollIntoView();', ls_li[len(ls_li)-1])

# 等待 后面的元素加载完成
time.sleep(1)
ls_li = goods_list.find_elements_by_class_name('gl-item')
print(len(ls_li))

# 遍历60节点, 找到每一个商品的信息
for li in ls_li:
    price = li.find_element_by_css_selector('.p-price i')
    print(price.text)

    name = li.find_element_by_css_selector('.p-name em')
    print(name.text)

time.sleep(100)

# 关闭浏览器对象
browser.close()


多页

分页结构:
在这里插入图片描述

from selenuim import webdriver
from selenuim.webdrive.support.wait import WebDriverWait
from selenuim.webdriver.support import expected_conditions as EC
from selenuim.webdriver.common.by import By
import time

# 获取所有商品列表
def get_goods_list(browser):

    ls = []
    wait = WebDriverWait(browser, 10)

    while True:
        goods_list = wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))
        ls_li = goods_list.find_elements_by_class_name('gl-item')

        # 在浏览器执行一段JS代码, 让页面滚动到指定位置
        browser.execute_script('arguments[0].scrollIntoView();', ls_li[len(ls_li) - 1])
        time.sleep(1)
        goods_list = wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))

        ls_li = goods_list.find_elements_by_class_name('gl-item')

        # ls = []
        for li in ls_li:
            # 字典
            goods = {}
            price = li.find_element_by_css_selector('.p-price i').text
            name = li.find_element_by_css_selector('.p-name em').text
            goods['price'] = price
            goods['name'] = name

            ls.append(goods)

        #     打开下一页
        next = browser.find_element_by_class_name('pn-next')
        js_next = next.get_attribute('onclick')

        # 到最后一页停止
        # if js_next == None:
        #     break
        # 或者
        if not js_next:
            break

        # 执行js代码
        browser.execute_script(js_next)

    return ls


if __name__ == '__main__':
    browser = webdriver.Chrome()

    # 打开页面
    browser.get('https://www.jd.com')

    # 用户输入关键字,查询此关键字的信息
    key = input('请输入一个关键字:')

    # 获取input
    input_markup = browser.find_element_by_id('key')
    input_markup.send_keys(key)
    # 模拟回车,打开新页面
    input_markup.send_keys('\n')

    ls = get_goods_list(browser)

    # 总共多少条数据
    print(len(ls))
#     输出数据
    print(ls)


#   保存到数据库中
    ...


猜你喜欢

转载自blog.csdn.net/gx17864373822/article/details/87819764