Python爬蟲使用selenium爬取天貓商品信息

文章目錄

不少人學習python,不知道從何學起。
不少人學習python,掌握了基本語法事後,不知道在哪裏尋找案例上手。
不少已經作案例的人,殊不知道如何去學習更加高深的知識。
那麼針對這三類人,我給你們提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ羣:961562169html


在學習本節時,發如今淘寶頁面搜索須要登陸帳號密碼,所以就選擇天貓網頁進行爬取,可是隻能爬取第一頁,以後的頁面也要登陸帳號。(京東頁面搜索下一頁不要登陸帳號,有時間作一個爬取京東頁面商品信息)python

 

1.只讀取第一頁

1.1準備工做

天貓搜索頁面的URL,以及關鍵字
https://list.tmall.com/search_product.htm?q=
q後面就是咱們須要搜索的商品名稱,可使用quote函數輸入keyword,也能夠使用send_keys傳入到輸入框,本文使用第二種方法.web

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

1.2.定位

1. 首先定位輸入框
在這裏插入圖片描述json

2.定位搜索按鍵app

在這裏插入圖片描述

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文件中,可是輸出是整行輸入,不能分行輸入,還在尋找緣由。ui

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減小多餘換行.
結果展現:
在這裏插入圖片描述url

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個

在這裏插入圖片描述

相關文章
相關標籤/搜索