Selenium 实战 之 淘宝商品信息的爬取

虽然淘宝的页面数据是通过 Ajax 获取的,也就是可以通过开发者模式直接找到它请求数据的接口,并且发现返回的数据是 json 的格式;但是这里需要注意的是这些 Ajax 接口的参数比较复杂,包含了加密密钥,因此如果想自己构造 Ajax 参数是比较困难的。
既然那么困难搞到数据,那么有没有办法使抓取的成本第一点呢?当然有,一种是使用 特定的数据接口 ;另一种就是使用 selenium了,selenium 有个特点就是 可见即所得。
那么接下来我们开始观察页面效果图:
image.png
经过效果图的观察,我们不难发现规律:我们要加载商品列表的节点;页面跳转时通过页面输入框再点击“确定”按钮进行跳转,并且只需判断当前高亮的页码数是当前的页码数即可。

一、首先导入相应的模块:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from urllib.parse import quote
from pyquery import PyQuery as pq

二、加载及跳转逻辑的代码函数如下:

browser = webdriver.Chrome()  # 浏览器对象
wait = WebDriverWait(browser, 10)  # 加载等待最大时间
KEYWORD = "华为荣耀10"

def index_page(page):
    print("正在抓取第 ", page, "页...")
    try:
        url = r'https://s.taobao.com/search?q='+ quote(KEYWORD)
        browser.get(url)
        if page > 1:  # 当页码大于 1 的时候则进行跳转
            # 节点加载出来,传入定位元组,如(By.ID, 'p')
            input_word = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input')))  # 输入页码框
            # 节点可点击
            submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit')))  # 页码跳转"确定"按钮
            input_word.clear()  # 清空编辑框
            input_word.send_keys(page)  # 将页码填充到输入框
            submit.click()  # 点击"确定"按钮

        # 某个节点文本包含某文字
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page)))  # 翻页按钮列表选项数字
        # 节点加载出来,传入定位元组,如(By.ID, 'p')
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')))  # 渲染商品所在列表选项
        # 解析数据
        get_products()

    except TimeoutException as e:
        index_page(page)



到这里,你可以直接运行该函数看是否能成功加载源码,这里我不做演示;那么接下来在观察我们所要加载信息(商品图片、名称、价格、购买人数、店铺名称、店铺地址)的页面节点:

image.png

三、观察商品节点之后解析代码如下(由于截图大小有限,其它标签自行观察)

# 解析函数-提取商品信息
def get_products():
    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('data-src'),
            'price':item.find('.price').text(),
            'deal':item.find('.deal-cnt').text(),
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)

四、编写主函数并调用:

def main():
    #page = 1  # 据观察总共有 100 页
    for page in range(1, 11):
        index_page(page)


if __name__ == '__main__':
    main()

运行部分效果图如下:


image.png
如果我们不想爬取的时候有浏览器弹出,那么有两种方式可以做到:1- 使用 Chrome Headless 模式 (这个模式前面一章有介绍并使用过);2- 对接 PhantomJS

五、首先看第一种 -> 直接将 webdriver 的声明修改为:

#browser = webdriver.Chrome()  # 浏览器对象
chrome_options = webdriver.ChromeOptions()  # 获取 ChromeOptions 对象
chrome_options.add_argument('--headless')  # 添加 headless 参数
browser = webdriver.Chrome(chrome_options=chrome_options)  # 初始化 Chrome 对象

六、第二种 -> 同理,直接将 webdriver 的声明修改为:

path = r"E:\\KaiFaSoftware\\MyPython\\MyPhantomjs\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe"
# browser = webdriver.PhantomJS(executable_path=path)

# 我们还可以通过命令行配置,设置缓存和禁用图片加载功能,进一步提高爬取效率
SERVICE_ARGS = ['--load-images=false','--disk-cache=true']
browser = webdriver.PhantomJS(executable_path=path,service_args=SERVICE_ARGS)

这里值得注意的是:如果配置了环境变量则不需要 path 指定路径了,还有提供一个 PhantomJS 的下载地址 -> http://phantomjs.org/download.html

最后的话非常感谢崔老师的思路,嘿嘿,相信通过本次实战同学们应该学到了不少了;本次实战到此为止,感恩一切。。。 *^_^*

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容