欢迎光临
我们一直在努力

Python爬虫使用selenium爬取天猫商品信息

文章目录

  • 1.只读取第一页1.1准备工作1.2.定位1.3.获取商品信息1.4. 整体代码1.5.输出结果展示1.6改进,存储在CSV文件内并分行存储2.读取多页商品信息2.1部分问题2.2代码2.3结果展示

私信小编01即可获取Python学习资料


在学习本节时,发现在淘宝页面搜索需要登录账号密码,因此就选择天猫网页进行爬取,但是只能爬取第一页,之后的页面也要登录账号。(京东页面搜索下一页不要登录账号,有时间做一个爬取京东页面商品信息)

 

1.只读取第一页

1.1准备工作

天猫搜索页面的URL,以及关键字
https://list.tmall.com/search_product.htm?q=
q后面就是我们需要搜索的商品名称,可以使用quote函数输入keyword,也可以使用send_keys传入到输入框,本文使用第二种方法.

url='https://list.tmall.com/search_product.htm?q='+quote(keyword)
send_keys(keyword)

1.2.定位

1. 首先定位输入框

 

 

2.定位搜索按键

 

?

3.代码定位

    input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mq')))
    submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.mallSearch-input > button:nth-child(3)')))
    input.clear()
    input.send_keys(keyword)
    submit.click()

使用input定位到输入框,然后使用input.send_keys传入搜索关键字。
使用submit定位搜索按键,输入关键字之点击搜索,搜索出商品信息。

1.3.获取商品信息

我们使用pyquery来遍历商品信息,获取商品图片,商品具体名称,商品价格,商品详细界面,商品销售额。

    items=doc('div .product').items()
    for item in items:
        product={
            'image':item.find('div div a img').attr('src'),
            'name':item.find('.productTitle a').text(),
            'price':item.find('.productPrice em').text(),
            'detail':item.find('div div a').attr('href'),
            'shop':item.find('.productShop a').text(),
            'sales':item.find('.productStatus span em').text()
        }

1.4. 整体代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from urllib.parse import urlencode
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import csv,json
brower=webdriver.Firefox()
wait=WebDriverWait(brower,20)
keyword='huawei'

def index_page(page):
    url='https://list.tmall.com/search_product.htm?q='
    
    brower.get(url)
    input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mq')))
    submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.mallSearch-input > button:nth-child(3)')))
    input.clear()
    input.send_keys(keyword)
    submit.click()
    
    return  get_products(brower)

def get_products(brower):
    html=brower.page_source
    doc=pq(html)
    items=doc('div .product').items()
    for item in items:
        product={
            'image':item.find('div div a img').attr('src'),
            'name':item.find('.productTitle a').text(),
            'price':item.find('.productPrice em').text(),
            'detail':item.find('div div a').attr('href'),
            'shop':item.find('.productShop a').text(),
            'sales':item.find('.productStatus span em').text()
        }
        print(product)
        yield product
def saveinformation(infors):
    with open('data.csv','w',encoding='utf-8') as f:
        writer=csv.writer(f)
        writer.writerow(infors)

if __name__=='__main__':
    result=index_page(1)
    saveinformation(result)

因为天猫界面只能爬取第一页信息,其他页需要登录才能查看,因此本文传入page=1.
我们将读取信息写入csv文件中,但是输出是整行输入,不能分行输入,还在寻找原因。

1.5.输出结果展示

{'image': '//img.alicdn.com/bao/uploaded/i2/2838892713/O1CN01KmhxMx1Vub9Om1ix8_!!2838892713.jpg', 'name': '【限时享12期免息】华为/HUAWEI P40 Pro|5G SoC芯片超感知徕卡
四摄华为p40pro 5g华为手机华为官方旗舰店', 'price': '?6488.00', 'detail': '//detail.tmall.com/item.htm?id=613832405367&skuId=4501042263809&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '1.7万笔'}
{'image': '//img.alicdn.com/bao/uploaded/i3/2616970884/O1CN01E4dXaU1IOukPBOKrb_!!2616970884.jpg', 'name': '【9.25号享12期免息】华为/HUAWEI P40Pro|5G SoC芯片手机徕卡
四摄50倍变焦曲面屏官方旗舰店正品华为p40pro', 'price': '?6488.00', 'detail': '//detail.tmall.com/item.htm?id=614820399492&skuId=4326362936208&user_id=2616970884&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '苏宁易购官方旗舰店', 'sales': '4599笔'}
{'image': '//img.alicdn.com/bao/uploaded/i1/2838892713/O1CN01ASqM6R1Vub9Lua8E8_!!2838892713.jpg', 'name': '华为/HUAWEI MateBook D14Windows版 英特尔10代 i5+8GB/16GB+512GB SSD 独显 笔记本电脑', 'price': '?4999.00', 'detail': '//detail.tmall.com/item.htm?id=610840455173&skuId=4463626930382&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '4069笔'}
{'image': '//img.alicdn.com/bao/uploaded/i2/2838892713/O1CN01TjohBN1Vub9MbcSCc_!!2838892713.jpg', 'name': '【限时享12期免息】华为/HUAWEI P40 | 5GSoC芯片超感知徕卡三
摄华为p40 5g智能手机华为手机华为官方旗舰店', 'price': '?4488.00', 'detail': '//detail.tmall.com/item.htm?id=613832301513&skuId=4497703782091&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '2.0万笔'}
{'image': '//img.alicdn.com/bao/uploaded/i1/2838892713/O1CN01ltNfaA1Vub9Rrkxd3_!!2838892713.jpg', 'name': '【限时享12期免息+200优惠券】Huawei/华为Mate30 Pro5G芯片四
摄mate30pro 5g手机华为手机华为官方旗舰店', 'price': '?6399.00', 'detail': '//detail.tmall.com/item.htm?id=606307762219&skuId=4309474780744&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '8139笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': 'Huawei/华为 HUAWEI MatePad Pro平板电脑 轻薄全面屏办公学习娱
乐智能平板', 'price': '?3299.00', 'detail': '//detail.tmall.com/item.htm?id=607884046949&skuId=4265065828223&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '5435笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '华为/HUAWEI MateBook 14 2020款英特尔十代i7+16GB+512GB SSD+MX350 独显触控屏笔记本电脑', 'price': '?7399.00', 'detail': '//detail.tmall.com/item.htm?id=611563243161&skuId=4535895359432&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '1404笔'}
em.htm?id=606241138896&skuId=4447336816956&user_id=268451883&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '三际数码官方旗舰店', 'sales': '400笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【官方正品】华为平板M6 8.4英寸 影音游戏娱乐 WiFi/4G可通话平
板电脑 高性能新品 苏宁官方旗舰店', 'price': '?2199.00', 'detail': '//detail.tmall.com/item.htm?id=597644950589&skuId=4611686616072338493&user_id=2616970884&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '苏宁易购官方旗舰店', 'sales': '94笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '华为/HUAWEI MateBook D 14 Windows版 英特尔10代 i7+16GB+512GB SSD 独显 笔记本电脑', 'price': '?6199.00', 'detail': '//detail.tmall.com/item.htm?id=610156068400&skuId=4466875367173&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '632笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【现货版速发】华为matepad 10.8英寸平板电脑二合一2020新款pro
全网通话m6大屏pad学习学生12寸办公游戏iPad', 'price': '?3399.00', 'detail': '//detail.tmall.com/item.htm?id=624249102569&skuId=4626490291781&user_id=3461286402&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '蓝阳数码专营店', 'sales': '2471笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【顺丰速发】华为平板MatePad平板电脑10.4英寸2020新款Pro教育全
面大屏M6全网通话10寸Huawei手机二合一ipad', 'price': '?1899.01', 'detail': '//detail.tmall.com/item.htm?id=617111511833&skuId=4611686635538899737&user_id=3394933058&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为华亲专卖店', 'sales': '1488笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【官方正品】华为/HUAWEI MatePad Pro 5G 麒麟990 绚丽全面屏平
板电脑智能学习游戏一体机', 'price': '?5299.00', 'detail': '//detail.tmall.com/item.htm?id=618290735512&skuId=4364946048927&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '1128笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【畅销爆款】HUAWEI/华为nova 5 Pro 8+128GB 麒麟980新品4800万AI四摄超级快充屏内指纹NFC手机', 'price': '?2199.00', 'detail': '//detail.tmall.com/item.htm?id=596822551576&skuId=4465987566936&user_id=2616970884&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '苏宁易购官方旗舰店', 'sales': '2317笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': 'Huawei/华为畅享20 Pro 5GSoC芯片华为畅享20pro5g手机智能手机华
为手机华为官方旗舰店', 'price': '?1999.00', 'detail': '//detail.tmall.com/item.htm?id=620350072768&skuId=4556789582028&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '6934笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': 'Huawei/华为 华为平板 M6 10.8英寸平板电脑四声道 一屏两用学习 
娱乐智能平板电脑', 'price': '?2699.00', 'detail': '//detail.tmall.com/item.htm?id=596577969318&skuId=4149991176279&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '789笔'}

1.6改进,存储在CSV文件内并分行存储

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from urllib.parse import urlencode
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import csv,json
brower=webdriver.Firefox()
wait=WebDriverWait(brower,20)
keyword='huawei'

def index_page(page):
    url='https://list.tmall.com/search_product.htm?q='
    
    brower.get(url)
    input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mq')))
    submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.mallSearch-input > button:nth-child(3)')))
    input.clear()
    input.send_keys(keyword)
    submit.click()
    return  get_products(brower)

def get_products(brower):
    html=brower.page_source
    doc=pq(html)
    items=doc('div .product').items()
    for item in items:
        information=[]
        image=item.find('div div a img').attr('src')
        information.append(str(image))
        name=item.find('.productTitle a').text()
        information.append(str(name))
        price=item.find('.productPrice em').text()
        information.append(str(price))
        detail=item.find('div div a').attr('href')
        information.append(str(detail))
        shop=item.find('.productShop a').text()
        information.append(str(shop))
        sales=item.find('.productStatus span em').text()
        information.append(str(sales))

        print(information)
        saveinformation(information) 
def saveinformation(infors):
    with open('data1.csv','a+',newline='',encoding='utf-8') as f:
        writer=csv.writer(f)
        writer.writerow(infors)
if __name__=='__main__':
    index_page(1)

我们在代码中取消字典存储,选择使用列表存储。这样在CSV文件中可以分开存取数据,使用’a+'不覆盖已经读取内容,在打开文件中添加newline减少多余换行.
结果展示:

 

?

2.读取多页商品信息

 

?
选择下一页商品信息有两种方法,1.点击下一页,2.输入想要跳转的页面,点击确认。本文使用第二种方法。
对上面代码进行修改,使send_keys只传递page。

2.1部分问题

跳转下一页时,可能中间需要输入账号,代码设置等待时间20秒,输入完账号密码就可以继续爬取页面信息。
使用for循环逐步跳转其他页面。

2.2代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from urllib.parse import urlencode
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import csv,json
brower=webdriver.Firefox()
wait=WebDriverWait(brower,20)
keyword='huawei'

def index_page(pages):
    url='https://list.tmall.com/search_product.htm?q='+quote(keyword)
    brower.get(url)
    for page in range(1,pages+1):
    	print('正在爬取第'+str(page)+'页')
        if page>1:
            input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.ui-page-skipTo')))
            submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'button.ui-btn-s')))
            input.clear()
            input.send_keys(page)
            brower.implicitly_wait(10)
            submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'.ui-page-num'),str(page)))
        get_products()

def get_products():
    html=brower.page_source
    doc=pq(html)
    items=doc('div .product').items()
    for item in items:
        information=[]
        image=item.find('div div a img').attr('src')
        information.append(str(image))
        name=item.find('.productTitle a').text()
        information.append(str(name))
        price=item.find('.productPrice em').text()
        information.append(str(price))
        detail=item.find('div div a').attr('href')
        information.append(str(detail))
        shop=item.find('.productShop a').text()
        information.append(str(shop))
        sales=item.find('.productStatus span em').text()
        information.append(str(sales))

        print(information)
        saveinformation(information) 
def saveinformation(infors):
    with open('data2.csv','a+',newline='',encoding='utf-8') as f:
        writer=csv.writer(f)
        writer.writerow(infors)

if __name__=='__main__':
    page=3
    index_page(page)

2.3结果展示

一页商品80个,三页一共240个

 

?

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:英协网 » Python爬虫使用selenium爬取天猫商品信息

分享到: 生成海报
avatar

热门文章

  • 评论 抢沙发

    • QQ号
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    登录

    忘记密码 ?

    切换登录

    注册

    我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活