利用selenium與多線程爬取爬淘寶文胸首頁動態(tài)數(shù)據(jù)

本文爬取了在淘寶首頁上輸入文胸后彈出的數(shù)據(jù),因為淘寶的商品都是通過JS渲染出來的動態(tài)數(shù)據(jù),所以本文用到了selenium,但是用的過程中發(fā)現(xiàn)了selenium的局限性,會在下文中提到,當然也可能是本人學藝不精,對selenium這個神器了解不足,先說下思路,首先是進入文胸搜索的首頁,然后爬取所有商品鏈接,最后用多進程提取每個商品的信息,再寫進文件

首先導入用到的庫,本人是想到用哪個再導入哪個的

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import  time
import  re
from  bs4 import BeautifulSoup
import requests
import lxml
from lxml import html
import csv
header={
'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
}這里是偽裝成chrome瀏覽器
from multiprocessing.dummy import Pool
all_links=[]

all_products =[]

Paste_Image.png
def get_all_links(url):這個函數(shù)是提取淘寶首頁每個商品的鏈接的
    all_links = []
    driver = webdriver.Chrome()讓瀏覽器模擬人工操作,提取動態(tài)數(shù)據(jù)
    driver.get(url)
    driver.execute_script('window.scrollBy(0,3000)')
    time.sleep(2)
    driver.execute_script('window.scrollBy(0,5000)')讓屏幕滾動下面,確保找到所有商品數(shù)據(jù)
    time.sleep(2)
    data = driver.find_element_by_class_name('m-itemlist')如圖,這里匹配到了所以商品所在的div
    time.sleep(2)
    we_data = driver.page_source
    #print(we_data)
    soup = BeautifulSoup(we_data,'lxml')將獲得的頁面用Beautiful解釋,不過selenium也有字體的方法提取,
    不過本人習慣用find函數(shù)提取數(shù)據(jù),于是就沒有采取selenium的提取方法
    links =soup.find('div',{'class':'m-itemlist'}).findAll('a',href=re.compile('^(//detail)).*(0)$'))
    這里用了findAll函數(shù)搭配正則,因為鏈接太復雜,用了xpath實在寫不出
    看了看,商品鏈接都是//detail開頭的,這樣就抓出了第一頁所有包含鏈接的a標簽
    如圖,定位到所有商品的div里面,然后用正則匹配每個鏈接
Paste_Image.png

    #print(links)
    for link in links:
        if 'href' in link.attrs:
            #print(link.attrs['href'])
            all_links.append(link.attrs['href'])千萬記得,我們還要將鏈接提取出來

    print(len(all_links),all_links)
    return all_links返回所以鏈接

def get_data(url):
    each_products={}構(gòu)造一個空字典.因為每個商品都是由產(chǎn)地,標題,價格等組成,所以用字典保存商品信息是最理想的
    link = 'http:'+url抓取出來的鏈接前面是沒有http:字符的,所以在手動添加,這樣才能打開鏈接
    #print(link)

    each_products['link']=link為字典添加數(shù)據(jù),下面同理
    all_data = requests.get(link,headers=header).content
    time.sleep(2)
    
    selector = lxml.html.document_fromstring(all_data)用lxml庫
    #print(selector)
    title = selector.xpath('//div[@class="tb-detail-hd"]/h1/text()')[0].replace('\t','').replace('\r','').replace('\n','')
     清理數(shù)據(jù),
     標題很多換行空格符號,如圖
    #print(title)
    each_products['title']=title為字典添加數(shù)據(jù)


    price = selector.xpath('//div[@class="tm-promo-price"]/span/text()')
   <>首先這里說明一下,這里調(diào)節(jié)了一個小時左右,
    反復確認這個xpath沒有錯,最后都沒有提取出價格,最后心灰意冷,看了看源代碼,發(fā)現(xiàn)每個頁面的價格也是JS動態(tài)數(shù)據(jù)加載進去的.....
    心中一萬只草擬馬奔騰而過,只能感嘆現(xiàn)在的實力抓不了,因為如果再在這里用selenium的我電腦會死的,因 為一頁就有50左右的鏈接,我電腦扛不住的,
    所以感覺面對這種類型的網(wǎng)頁selenium就很有局限性,也希望有大神教我解決怎么抓取加個這個問題,這個坑只能以后來填了
    #print(price)
    each_products['price']=price
    shop_name= selector.xpath('//div[@class="slogo"]/a/strong/text()')[0]
    #print(shop_name)
    each_products['shop_name']=shop_name
    area = selector.xpath('//li[@class="locus"]/div[@class="right"]/text()')[0].replace('\n','').replace('                ','')
    #print(area)
    each_products['area']=area
    all_products.append(each_products)這樣就構(gòu)造了一個由字典組成的列表,也方便寫進csv格式的文件
打印出來的字典是這樣的
Paste_Image.png
def writedata(all_products):
    with open('taobao_bra','w',encoding="UTF-8",newline='')as f:
        writer = csv.DictWriter(f,fieldnames=['title','area','shop_name','price','link'])因為是字典組成的列表,且key值一樣,
        所以可以用DictWriter方法將文件按一定的key值排序?qū)戇M文件
        writer.writeheader()
        for i in all_products:
            #print(i)
            writer.writerow(i)
if __name__ == '__main__':

    url = 'https://s.taobao.com/search?q=%E6%96%87%E8%83%B8'淘寶搜索文胸的首頁
    #print(url)
    time.sleep(1)
    links=set(get_all_links(url))獲得所有連接
    pool=Pool()
    pool.map(get_data,links)這里是提取數(shù)據(jù),這里函數(shù)記得不用寫括號
    print(all_products)
    writedata(all_products)寫進文件


最后效果圖,每個商品的鏈接是還可以用split簡化的,也挺簡單,這里就不提,希望有大神告訴我怎么提取價格....

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓖墅,一起剝皮案震驚了整個濱河市殃恒,隨后出現(xiàn)的幾起案子填大,更是在濱河造成了極大的恐慌再姑,老刑警劉巖挤悉,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寇僧,死亡現(xiàn)場離奇詭異茎活,居然都是意外死亡,警方通過查閱死者的電腦和手機辖众,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門卓起,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凹炸,你說我怎么就攤上這事戏阅。” “怎么了啤它?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵奕筐,是天一觀的道長舱痘。 經(jīng)常有香客問我,道長离赫,這世上最難降的妖魔是什么芭逝? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮笆怠,結(jié)果婚禮上铝耻,老公的妹妹穿的比我還像新娘誊爹。我一直安慰自己蹬刷,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布频丘。 她就那樣靜靜地躺著办成,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搂漠。 梳的紋絲不亂的頭發(fā)上迂卢,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音桐汤,去河邊找鬼而克。 笑死,一個胖子當著我的面吹牛怔毛,可吹牛的內(nèi)容都是我干的员萍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼拣度,長吁一口氣:“原來是場噩夢啊……” “哼碎绎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抗果,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤筋帖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冤馏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體日麸,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年逮光,在試婚紗的時候發(fā)現(xiàn)自己被綠了赘淮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡睦霎,死狀恐怖梢卸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情副女,我是刑警寧澤蛤高,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響戴陡,放射性物質(zhì)發(fā)生泄漏塞绿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一恤批、第九天 我趴在偏房一處隱蔽的房頂上張望异吻。 院中可真熱鬧,春花似錦喜庞、人聲如沸诀浪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雷猪。三九已至,卻和暖如春晰房,著一層夾襖步出監(jiān)牢的瞬間求摇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工殊者, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留与境,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓猖吴,卻偏偏與公主長得像摔刁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子距误,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容