使用selenium抓取已購(gòu)買訂單的信息
? ?本人是公司的數(shù)據(jù)分析師一枚陷谱,昨天公司的秘書妹紙跟我抱怨說召夹,每天都要登錄老板的賬號(hào)昧碉,去等級(jí)老板的淘寶購(gòu)買訂單信息,一頁頁的翻去手動(dòng)登記,簡(jiǎn)直是要了老命了呀掂林,這個(gè)時(shí)候我靈光一現(xiàn)进宝,怎么可以讓秘書妹紙受這樣的委屈,當(dāng)即對(duì)秘書妹紙講部逮,這個(gè)粗活還是讓我來每天登記吧,哈哈哈嫂易,我怎么可能一頁一頁的去登記兄朋,于是就想用爬蟲的技術(shù)直接抓取下來,豈不美哉怜械。說干就干颅和。
? ? 第一次本來想嘗試使用requests抓取的,已經(jīng)找到了訂單信息的api缕允,但是淘寶的偽造登陸問題實(shí)在是需要很多參數(shù)峡扩,簡(jiǎn)單嘗試之后就放棄了,果斷使用selenium
不是更簡(jiǎn)單障本,廢話不多說了教届,直接上碼响鹃。
? ? 第一步: 配置環(huán)境,pip install -i https://pypi.douban.com/simple selenium? 這里使用豆瓣源進(jìn)行安裝案训,下載速度快一大截买置,可以自己嘗試。
? ? 第二步:配置webdriver强霎,下載瀏覽器對(duì)應(yīng)的webdriver版本忿项,這個(gè)可以直接在網(wǎng)上查找搜索 谷歌瀏覽器對(duì)應(yīng)的driver版本就可以找到了,這里就不贅述城舞。如果不想指定路徑的話轩触,就直接把下載好的webdriver復(fù)制到你的python安裝目錄下,本人的python安裝目錄是?C:\Users\Administrator.PC-20190709LRDQ\AppData\Local\Programs\Python\Python36
? ? ? ? 第三步:直接上代碼家夺,下面慢慢解釋
? ? 第四步:代碼講解
1. 定義一個(gè)抓取淘寶已購(gòu)訂單信息的類AlibabaBought怕膛, 下面的類屬性是后面的類方法里面需要用到的,這里我把它定義成類屬性秦踪,方便后面的直接調(diào)用跟代碼的美觀性褐捻,__init__方法是類實(shí)例化的時(shí)候直接會(huì)調(diào)用的,這里用來添加瀏覽器打開的參數(shù)椅邓,這里只是簡(jiǎn)單的設(shè)置了一下瀏覽器的寬高柠逞,其他需要的參數(shù)可以在網(wǎng)上自己查閱,其實(shí)用不用都沒啥景馁。
2. 定義一個(gè)點(diǎn)擊事件的方法板壮,因?yàn)楹竺娴狞c(diǎn)擊操作需要重復(fù)調(diào)用,所以封裝成方法合住,用傳參的方式直接調(diào)用方法绰精,也就有了后面的點(diǎn)擊我的淘寶click_mytaobao方法,點(diǎn)擊之后網(wǎng)頁會(huì)彈出登錄頁面透葛,這里我們采用掃碼登錄的方法笨使,規(guī)避了淘寶滑動(dòng)驗(yàn)證碼的坑,然后就是點(diǎn)擊已買到的寶貝click_bought方法
3.? 上面第2的步驟已經(jīng)讓頁面進(jìn)入了訂單的頁面僚害,就可以開始通過selenium的browser.page_source獲取網(wǎng)頁源代碼硫椰,然后通過lxml對(duì)源碼進(jìn)行解析,lxml的xpath解析我就不多講了萨蚕,講太細(xì)文章太長(zhǎng)了靶草。
4.? 解析好的代碼出來的文本對(duì)象就可以通過列表的append方法進(jìn)行添加上去,因?yàn)樯厦嫖覀兲岬搅宋覀兊牧斜硎穷悓傩栽酪#允枪驳馁Y源奕翔,一個(gè)方法添加之后,列表已經(jīng)緩存在內(nèi)存中浩蓉,后面的保存時(shí)候直接調(diào)這個(gè)列表就可以獲取到數(shù)據(jù)
5. 獲取需要抓取的信息的xpath方法派继,這里教大家一個(gè)簡(jiǎn)單的方法帮坚,相信f12大家都會(huì)用,打開開發(fā)者工具互艾,然后點(diǎn)擊你需要抓取的信息试和,找到代碼,然后右鍵纫普,仔細(xì)看有個(gè)copyxpath阅悍,點(diǎn)擊就好了
6.? 解析好了之后,剩下的就是翻頁的循環(huán)抓取了昨稼,這里也比較簡(jiǎn)單节视,就是獲取到下一頁這個(gè)地方的xpath,然后調(diào)用點(diǎn)擊事件的方法假栓,就可以自動(dòng)點(diǎn)擊下一頁的寻行,再循環(huán)第5的步驟,進(jìn)行解析匾荆。
7.? 最后就是保存了拌蜘,因?yàn)槲乙4娴絜xcel中,這里我習(xí)慣使用pandas牙丽,有其他的方法也可以简卧,最后做出來就好。詳細(xì)的大家可以看我的源碼烤芦,都是比較簡(jiǎn)單基礎(chǔ)的举娩。
8.? python之禪,一定要講究代碼的美觀性构罗,我剛開始實(shí)現(xiàn)的時(shí)候铜涉,也是胡亂寫得,然后測(cè)試運(yùn)行成功之后遂唧,在進(jìn)行封裝成類芙代,大家也可以按照我的這個(gè)方法來,先寫main函數(shù)蠢箩,然后在類里面寫一個(gè)run方法,main函數(shù)里面就直接調(diào)用類的run方法就好谬泌。
哈哈哈,這就成功幫秘書妹紙做好了逻谦,最后我還用pyinstaller進(jìn)行了打包成exe可執(zhí)行文件掌实,妹紙拿到后,點(diǎn)擊運(yùn)行邦马,嘖嘖嘖贱鼻,那炫酷的代碼跑起來宴卖,不多說,懂得邻悬。最下面有代碼症昏,隨便復(fù)制使用,反正我都測(cè)試很多回了父丰。
from seleniumimport webdriver
from selenium.webdriver.chrome.optionsimport Options
from selenium.webdriver.common.byimport By
from selenium.webdriver.supportimport expected_conditionsas EC
from selenium.webdriver.support.waitimport WebDriverWait
from lxmlimport etree
import pandasas pd
import time
class AlibabaBought:
? ? '''
抓取個(gè)人淘寶訂單的已購(gòu)買的訂單
'''
? ? url= 'https://www.taobao.com'
? ? mytaobao_xpath= '//*[@id="J_SiteNavMytaobao"]/div[@class="site-nav-menu-hd"]/a'
? ? bought_xpath= '//*[@id="bought"]'
? ? page_xpath= '//*[@id="tp-bought-root"]/div[19]/div[2]/ul/li[@class="pagination-next"]'
? ? date_list= []
order_list= []
title_list= []
shop_list= []
num_list= []
price_list= []
statecode_list= []
unit_price_list= []
def __init__(self):
? ? ? ? '''
實(shí)例化的時(shí)候自動(dòng)設(shè)置瀏覽器的參數(shù)
'''
? ? ? ? chrome_options= Options()
chrome_options.add_argument('--window-size=1500,1366')
self.browser= webdriver.Chrome(chrome_options=chrome_options)
def click_case(self,my_xpath):
? ? ? ? '''
點(diǎn)擊事件
'''
? ? ? ? button= WebDriverWait(self.browser,20).until(
EC.element_to_be_clickable(
(By.XPATH,my_xpath))
)
button.click()
def click_mytaobao(self):
? ? ? ? '''
打開需要訪問的網(wǎng)站,點(diǎn)擊我的淘寶
'''
? ? ? ? self.browser.get(self.url)
self.click_case(my_xpath=self.mytaobao_xpath)
# 掃碼登錄
? ? def click_bought(self):
? ? ? ? '''
點(diǎn)擊已買到的寶貝
'''
? ? ? ? self.click_case(self.bought_xpath)
def click_next_page(self):
? ? ? ? '''
點(diǎn)擊下一頁
'''
? ? ? ? self.click_case(self.page_xpath)
def analysis_web(self,order_list_xpath,order_list):
? ? ? ? '''解析網(wǎng)頁源代碼'''
? ? ? ? page_taobao_html= self.browser.page_source
my_data= etree.HTML(page_taobao_html).xpath(order_list_xpath)
order_list.append(my_data[0])
print(my_data[0])
print('-' * 100)
def make_data_xpath(self):
? ? ? ? '''構(gòu)造訂單信息的xpath路徑并解析源碼保存到列表中'''
? ? ? ? for iin range(4,19):
? ? ? ? ? ? date_xpath= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[1]/tr/td[1]/label/span[2]/text()' % i
order_xpath= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[1]/tr/td[1]/span/span[3]/text()' % i
title_path= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[2]/tr/td[1]/div/div[2]/p[1]/a/span[2]/text()' % i
shop_path= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[1]/tr/td[2]/span/a/text()' % i
num_path= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[2]/tr/td[3]/div/p/text()' % i
price_path= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[2]/tr/td[5]/div/div[1]/p/strong/span[2]/text()' % i
statecode_path= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[2]/tr/td[6]/div/p/span/text()' % i
unit_price_path= '//*[@id="tp-bought-root"]/div[%s]/div/table/tbody[2]/tr/td[2]/div/p/span[2]/text()' % i
self.analysis_web(date_xpath,self.date_list)
self.analysis_web(order_xpath,self.order_list)
self.analysis_web(title_path,self.title_list)
self.analysis_web(shop_path,self.shop_list)
self.analysis_web(num_path,self.num_list)
self.analysis_web(price_path,self.price_list)
self.analysis_web(statecode_path,self.statecode_list)
self.analysis_web(unit_price_path,self.unit_price_list)
def save_date(self):
? ? ? ? '''保存到指定路徑下面為excel'''
? ? ? ? taobao_dic= {'date': self.date_list,'order': self.order_list,'title': self.title_list,'shop': self.shop_list,'num': self.num_list,'unit_price': self.unit_price_list,
'price': self.price_list,'statecode': self.statecode_list}
print(taobao_dic)
df= pd.DataFrame(taobao_dic)
save_path= input('請(qǐng)輸入需要保存的文件路徑:')
if save_path:
? ? ? ? ? ? df.to_excel(save_path+ r'\淘寶購(gòu)買明細(xì).xlsx',index=False)
else:
? ? ? ? ? ? df.to_excel(r'f:\桌面\珊珊\淘寶購(gòu)買明細(xì).xlsx',index=False)
def run(self):
? ? ? ? self.click_mytaobao()
self.click_bought()
while True:
? ? ? ? ? ? self.make_data_xpath()
is_go_on= int(input("繼續(xù)抓取請(qǐng)輸入 1 肝谭;退出請(qǐng)輸入 2:"))
if is_go_on== 1:
? ? ? ? ? ? ? ? self.click_next_page()
time.sleep(3)
elif is_go_on== 2:
? ? ? ? ? ? ? ? self.browser.close()
break
? ? ? ? self.save_date()
def main():
? ? alibaba_bought= AlibabaBought()
alibaba_bought.run()
if __name__== '__main__':
? ? main()