爬虫入门到精通_实战篇9(使用Selenium模拟浏览器抓取淘宝商品美食信息)_使用Selenium

需要登陆淘宝,所以此章不细说,再次了解下Chrome.

可以了解下PhantomJS。
更详细的可参考

1 目标

目标:抓取淘宝商品美食信息。

淘宝的页面是相当复杂的,含有各种请求参数或是加密参数,如果直接请求或者分析Ajax将十分繁琐。

Selenium是一个自动化测试工具,可以驱动浏览器完成各种操作,比如模拟点击、输入、下拉等等,这样我们只需要关心操作,而不再需要关心后台发生了什么请求。

Chrome是一个常用浏览器。

PhantomJS是一个无界面浏览器(可以在不打开浏览器界面的情况下完成爬取)。

本次将要爬取的是淘宝"美食"关键词下的所有宝贝内容,并存储到MongoDB。

2 流程框架

  1. 搜索关键字:利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。
  2. 分析页码并翻页:得到商品页面数,模拟翻页,得到后续页面的商品列表。
  3. 分析提取商品内容:利用PyQuery分析源码,解析得到商品列表。
  4. 存储至MongoDB:将商品列表信息存储到数据库MongoDB。

3 实战

1.搜索关键字

首先新建项目以及py文件。导入selenium中的webdriver并且创建一个浏览器驱动对象:

复制代码
from selenium import webdriver
browser = webdriver.Chrome() #创建一个Chrome驱动对象

模拟点击搜索:

复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#声明一个WebDriverWait对象在里面传入一个browser等待条件参数,一个最长等待时间参数
wait=WebDriverWait(browser, 10)#因为后面用到比较多,所以把这部分单独复制为一个变量

#search函数可以让浏览器输入关键词并点击搜索
def search():
    browser.get('https://www.taobao.com')#请求淘宝首页
    input = wait.until(#利用wait.until方法传入一些等待的条件,条件的参数是目标元素
        EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))#通过CSS选择器选择q(也就是搜索框)。
    )
    submit = wait.until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))#通过CSS选择器选择搜索按钮。
    )
    input.send_keys('美食')#在搜索框中输入内容
    submit.click()#点击按钮,也就是提交搜索内容

2.分析页码并翻页

复制代码
def next_page(page_number):
    try:
        #获取输入框:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))  # 通过CSS选择器选择q(也就是搜索框)。
        )
        #获取"确定"按钮
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))  # 通过CSS选择器选择搜索按钮。
        )
        input.clear()#清楚之前输入的内容
        input.send_keys(page_number)#输入页码
        submit.click()#点击确定
        #判断翻页是否成功(当前页码是否在高亮块中):
        wait.until(
            EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number))
        )
    except TimeoutException:

3.分析提取商品内容

复制代码
def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
    html =browser.page_source
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image':item.find('.pic .img').attr('src'),
            'price':item.find('.price').text(),
            'deal':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)

4.存储至MongoDB

复制代码
def save_to_mongo(result):
     try:
        if db[MONGO_TABLE].insert(result):
            print('存储到MONGODB成功',result)
     except Exception:
         print('存储到MONGODB失败',result)

4 整体代码

相关推荐
喵手3 小时前
Python爬虫实战:针对天文历法网站(以 TimeandDate 或类似的静态历法页为例),构建高精度二十四节气天文数据采集器(附xlsx导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集天文历法网站数据·构建二十四节气天文数据
喵手4 小时前
Python爬虫实战:采集博客园 Cnblogs文章标题、发布日期、标签以及HTML正文等(附 Markdown 文档格式预览)!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·博客园文章采集·博客园文章采集转md格式
10岁的博客4 小时前
Libvio.link爬虫技术全解析
爬虫
2501_948120157 小时前
大语言模型与爬虫技术融合的智能数据采集系统
人工智能·爬虫·语言模型
喵手8 小时前
Python爬虫实战:采集巨潮资讯网等上市公司公告数据,通过智能关键词匹配技术识别分红、回购、停牌等重要信息(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集巨潮资讯数据·智能匹配识别分红、回购等信息·csv导出+sqlite
泡泡以安9 小时前
Android 逆向实战:从零突破某电商 App 登录接口全参数加密
android·爬虫·安卓逆向
axinawang9 小时前
第9章 存储爬虫数据
爬虫
Data_Journal10 小时前
Scrapy vs. Crawlee —— 哪个更好?!
运维·人工智能·爬虫·媒体·社媒营销
深蓝电商API11 小时前
async/await与多进程结合的混合爬虫架构
爬虫·架构
Fleshy数模11 小时前
我的第一只Python爬虫:从Requests库到爬取整站新书
开发语言·爬虫·python