美文网首页学习提升Python
使用selenium抓取淘宝“已购买的订单”信息

使用selenium抓取淘宝“已购买的订单”信息

作者: 较劲_f9ef | 来源:发表于2019-12-27 11:07 被阅读0次


使用selenium抓取已购买订单的信息

   本人是公司的数据分析师一枚,昨天公司的秘书妹纸跟我抱怨说,每天都要登录老板的账号,去等级老板的淘宝购买订单信息,一页页的翻去手动登记,简直是要了老命了呀,这个时候我灵光一现,怎么可以让秘书妹纸受这样的委屈,当即对秘书妹纸讲,这个粗活还是让我来每天登记吧,哈哈哈,我怎么可能一页一页的去登记,于是就想用爬虫的技术直接抓取下来,岂不美哉。说干就干。

    第一次本来想尝试使用requests抓取的,已经找到了订单信息的api,但是淘宝的伪造登陆问题实在是需要很多参数,简单尝试之后就放弃了,果断使用selenium

不是更简单,废话不多说了,直接上码。

    第一步: 配置环境,pip install -i https://pypi.douban.com/simple selenium  这里使用豆瓣源进行安装,下载速度快一大截,可以自己尝试。

    第二步:配置webdriver,下载浏览器对应的webdriver版本,这个可以直接在网上查找搜索 谷歌浏览器对应的driver版本就可以找到了,这里就不赘述。如果不想指定路径的话,就直接把下载好的webdriver复制到你的python安装目录下,本人的python安装目录是 C:\Users\Administrator.PC-20190709LRDQ\AppData\Local\Programs\Python\Python36

        第三步:直接上代码,下面慢慢解释

    第四步:代码讲解

1. 定义一个抓取淘宝已购订单信息的类AlibabaBought, 下面的类属性是后面的类方法里面需要用到的,这里我把它定义成类属性,方便后面的直接调用跟代码的美观性,__init__方法是类实例化的时候直接会调用的,这里用来添加浏览器打开的参数,这里只是简单的设置了一下浏览器的宽高,其他需要的参数可以在网上自己查阅,其实用不用都没啥。

2. 定义一个点击事件的方法,因为后面的点击操作需要重复调用,所以封装成方法,用传参的方式直接调用方法,也就有了后面的点击我的淘宝click_mytaobao方法,点击之后网页会弹出登录页面,这里我们采用扫码登录的方法,规避了淘宝滑动验证码的坑,然后就是点击已买到的宝贝click_bought方法

3.  上面第2的步骤已经让页面进入了订单的页面,就可以开始通过selenium的browser.page_source获取网页源代码,然后通过lxml对源码进行解析,lxml的xpath解析我就不多讲了,讲太细文章太长了。

4.  解析好的代码出来的文本对象就可以通过列表的append方法进行添加上去,因为上面我们提到了我们的列表是类属性,所以是公共的资源,一个方法添加之后,列表已经缓存在内存中,后面的保存时候直接调这个列表就可以获取到数据

5. 获取需要抓取的信息的xpath方法,这里教大家一个简单的方法,相信f12大家都会用,打开开发者工具,然后点击你需要抓取的信息,找到代码,然后右键,仔细看有个copyxpath,点击就好了

6.  解析好了之后,剩下的就是翻页的循环抓取了,这里也比较简单,就是获取到下一页这个地方的xpath,然后调用点击事件的方法,就可以自动点击下一页的,再循环第5的步骤,进行解析。

7.  最后就是保存了,因为我要保存到excel中,这里我习惯使用pandas,有其他的方法也可以,最后做出来就好。详细的大家可以看我的源码,都是比较简单基础的。

8.  python之禅,一定要讲究代码的美观性,我刚开始实现的时候,也是胡乱写得,然后测试运行成功之后,在进行封装成类,大家也可以按照我的这个方法来,先写main函数,然后在类里面写一个run方法,main函数里面就直接调用类的run方法就好。

哈哈哈,这就成功帮秘书妹纸做好了,最后我还用pyinstaller进行了打包成exe可执行文件,妹纸拿到后,点击运行,啧啧啧,那炫酷的代码跑起来,不多说,懂得。最下面有代码,随便复制使用,反正我都测试很多回了。

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:

    '''

抓取个人淘宝订单的已购买的订单

'''

    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):

        '''

实例化的时候自动设置浏览器的参数

'''

        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):

        '''

点击事件

'''

        button= WebDriverWait(self.browser,20).until(

EC.element_to_be_clickable(

(By.XPATH,my_xpath))

)

button.click()

def click_mytaobao(self):

        '''

打开需要访问的网站,点击我的淘宝

'''

        self.browser.get(self.url)

self.click_case(my_xpath=self.mytaobao_xpath)

# 扫码登录

    def click_bought(self):

        '''

点击已买到的宝贝

'''

        self.click_case(self.bought_xpath)

def click_next_page(self):

        '''

点击下一页

'''

        self.click_case(self.page_xpath)

def analysis_web(self,order_list_xpath,order_list):

        '''解析网页源代码'''

        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):

        '''构造订单信息的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('请输入需要保存的文件路径:')

if save_path:

            df.to_excel(save_path+ r'\淘宝购买明细.xlsx',index=False)

else:

            df.to_excel(r'f:\桌面\珊珊\淘宝购买明细.xlsx',index=False)

def run(self):

        self.click_mytaobao()

self.click_bought()

while True:

            self.make_data_xpath()

is_go_on= int(input("继续抓取请输入 1 ;退出请输入 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()

相关文章

网友评论

    本文标题:使用selenium抓取淘宝“已购买的订单”信息

    本文链接:https://www.haomeiwen.com/subject/yeiroctx.html