使用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()