网络蜘蛛:8.Selenium 爬取淘宝商品实战

Selenium安装
pip install selenium
pip install pyquery
自动运行浏览器

from selenium import webdriver  # 从selenium导入网页内驱动软件
#如何要版本更新,可参考https://blog.csdn.net/weixin_44318830/article/details/103339273网站

browser = webdriver.Chrome('D:\APP\chromedriver.exe')  # 找到浏览器驱动位置
browser.get("https://www.baidu.com/s?wd=python")  # 打开网页

Selenium和其他的爬虫库有巨大的不同, 是因为他自动调用了浏览器, 并且可以有页面交互的操作
模拟输入文字内容

search_box.send_keys('python')  # 模拟输入文字内容

清除输入的文本

search_box.clear()   # 清除输入的文本

自动输入python 并点击百度一下按钮

from selenium import webdriver  # 从selenium导入网页内驱动软件
#如何要版本更新,可参考https://blog.csdn.net/weixin_44318830/article/details/103339273网站

browser = webdriver.Chrome('D:\APP\chromedriver.exe')  # 找到浏览器驱动位置
browser.get("https://www.baidu.com/")  # 打开网页
search_box = browser.find_element_by_id('kw')   # 找到搜索框
search_box.send_keys('python')  # 模拟输入文字内容
submit_button = browser.find_element_by_id('su')  # 找到查询按钮
submit_button.click()  # 点击查询按钮

初始化设置
设置好 • 要搜索的关键字 • 浏览器 • 超时等待时间

KEYWORD = 'ipad'  # 设置关键词
browser = webdriver.Chrome('D:\APP\chromedriver.exe')  # 设置浏览器
wait = WebDriverWait(browser,10)  # 设置等待时间

结构

KEYWORD = 'ipad'  # 设置关键词
browser = webdriver.Chrome('D:\APP\chromedriver.exe')  # 设置浏览器
wait = WebDriverWait(browser,10)  # 设置等待时间

def crawl_page(page):  # 定义爬取页面
    pass

def get_products():  # 定义产品
    pass

crawl_page(1)  # 爬取第一页

crawl_page()函数结构
使用try…except结构
当try里的语句出错时会程序自动进入except里继续执行
crawl_page()函数中try里的语句25
记住要用urllib.parse.quote来处理关键字然后放到url里面
quote的功能就是对字符串进行url编码

url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)

使用urllib.parse.quote可对网址中的中文进行编码 比如出现中文的搜索关键词
打开网址

url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)  # quote的功能就是对字符串进行url编码
browser.get(url)  # 打开浏览器

分析页面
商品列表是一个class=“m-itemlist”的div
设置等待

wait.until(  # 设置等待一定的时间(时间为之前设置wait的时间)
    EC.presence_of_element_located(    # 直到通过CSS选择器能在页面找到某个元素
        (By.CSS_SELECTOR, '.item.J_MouserOnverReq')
    )
)

这句代码的含义: 等待一定的时间(时间为之前设置wait的时间) 直到通过CSS选择器能在页面找到某个元素 如果超时还没有找到就继续向后执行
翻页功能——分析页面
page_box是 页码输入框
submit_button是 确定按钮
二者配合实现翻页功能

if page > 1:  # 如果页码大于1
    page_box = wait.until(   # 设置等待一定的时间(时间为之前设置wait的时间)
        EC.presence_of_element_located(
            (By.CSS_SELECTOR, 'input.input.J_Input')  # 找到翻页
        )
)  # 定位翻页
submit_button = wait.until(     # 设置等待一定的时间(时间为之前设置wait的时间)
    EC.element_to_be_clickable(   # 直到通过CSS选择器能在页面找到某个元素
        (By.CSS_SELECTOR, 'span.btn.J_Submit')   # 如果超时还没有找到就继续向后执行
    )
)  # 定位到按钮
page_box.clear()  # 清空内容
page_box.send_keys(page)  # 模拟输入文字内容
submit_button.click()  # 点击查询按钮

crawl_page()的全部代码

def crawl_page(page):  # 定义爬取页面
    try:  # 尝试
        url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)  # quote的功能就是对字符串进行url编码
        browser.get(url)  # 打开浏览器

        time.sleep(10)  # 程序等待10秒

        if page > 1:  # 如果页码大于1
            page_box = wait.until(   # 设置等待一定的时间(时间为之前设置wait的时间)
                EC.presence_of_element_located(
                    (By.CSS_SELECTOR, 'input.input.J_Input')  # 找到翻页
                )
            )  # 定位翻页
            submit_button = wait.until(     # 设置等待一定的时间(时间为之前设置wait的时间)
                EC.element_to_be_clickable(   # 直到通过CSS选择器能在页面找到某个元素
                    (By.CSS_SELECTOR, 'span.btn.J_Submit')   # 如果超时还没有找到就继续向后执行
                )
            )  # 定位到按钮
            page_box.clear()  # 清空内容
            page_box.send_keys(page)  # 模拟输入文字内容
            submit_button.click()  # 点击查询按钮

        wait.until(  # 设置等待一定的时间(时间为之前设置wait的时间)
            EC.presence_of_element_located(    # 直到通过CSS选择器能在页面找到某个元素
                (By.CSS_SELECTOR, '.item.J_MouserOnverReq')
            )
        )

        get_products()  # 爬取产品
    except:  # 如果异常执行以下代码
        crawl_page(page)  # 爬取页面

解析商品数据
get_producs()函数 通过pyquery进行解析

def get_products():  # 定义产品
    html = browser.page_source  # 获取源代码
    doc = PyQuery(html)  # 解析源代码
    items = doc('.item.J_MouserOnverReq').items()  # 定位商品
    for item in items:  # 循环遍历,提取产品信息
        product = {
            'image': item.find('.img').attr('data-src'),  # 提取图片信息
            'price': item.find('.price').text(),  # 提取价格
            'deal': item.find('.deal-cnt').text(),  # 提取成交量
            'title': item.find('.title').text(),  # 提取标题
            'shop': item.find('.dsrs').text(),  # 提取店铺名
            'location': item.find('.location').text()  # 提取地址
        }
        print(product)  # 输出产品

完整代码:

from selenium import webdriver  # 从selenium导入网页内驱动软件包
from selenium.common.exceptions import TimeoutException   # 导入超时请求包
from selenium.webdriver.common.by import By  # by方法
from selenium.webdriver.support import expected_conditions as EC   #
from selenium.webdriver.support.ui import WebDriverWait  # 定义等待时间
from urllib.parse import quote   # 把汉字转码
from pyquery import PyQuery  # 解析包
import time  # 导入时间模块

KEYWORD = 'ipad'  # 设置关键词
browser = webdriver.Chrome('D:\APP\chromedriver.exe')  # 设置浏览器
wait = WebDriverWait(browser,10)  # 设置等待时间


def crawl_page(page):  # 定义爬取页面
    try:  # 尝试
        url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)  # quote的功能就是对字符串进行url编码
        browser.get(url)  # 打开浏览器

        time.sleep(10)  # 程序等待10秒

        if page > 1:  # 如果页码大于1
            page_box = wait.until(   # 设置等待一定的时间(时间为之前设置wait的时间)
                EC.presence_of_element_located(
                    (By.CSS_SELECTOR, 'input.input.J_Input')  # 找到翻页
                )
            )  # 定位翻页
            submit_button = wait.until(     # 设置等待一定的时间(时间为之前设置wait的时间)
                EC.element_to_be_clickable(   # 直到通过CSS选择器能在页面找到某个元素
                    (By.CSS_SELECTOR, 'span.btn.J_Submit')   # 如果超时还没有找到就继续向后执行
                )
            )  # 定位到按钮
            page_box.clear()  # 清空内容
            page_box.send_keys(page)  # 模拟输入文字内容
            submit_button.click()  # 点击查询按钮

        wait.until(  # 设置等待一定的时间(时间为之前设置wait的时间)
            EC.presence_of_element_located(    # 直到通过CSS选择器能在页面找到某个元素
                (By.CSS_SELECTOR, '.item.J_MouserOnverReq')
            )
        )

        get_products()  # 爬取产品
    except:  # 如果异常执行以下代码
        crawl_page(page)  # 爬取页面


def get_products():  # 定义产品
    html = browser.page_source  # 获取源代码
    doc = PyQuery(html)  # 解析源代码
    items = doc('.item.J_MouserOnverReq').items()  # 定位商品
    for item in items:  # 循环遍历,提取产品信息
        product = {
            'image': item.find('.img').attr('data-src'),  # 提取图片信息
            'price': item.find('.price').text(),  # 提取价格
            'deal': item.find('.deal-cnt').text(),  # 提取成交量
            'title': item.find('.title').text(),  # 提取标题
            'shop': item.find('.dsrs').text(),  # 提取店铺名
            'location': item.find('.location').text()  # 提取地址
        }
        print(product)  # 输出产品

crawl_page(2)  # 爬取第一页

你可能感兴趣的:(网络机器人)