Python爬取淘宝销量数据!这年头数据就是钱啊!
前⾔
本⽂记录学习爬取淘宝⽹站上各品类下的销量最⾼的商品数据代码实现过程,涉及使⽤selenium库中的webdriver操作GOOGLE浏览器进⾏登陆、搜索、点击按销量从⾼到底排序、获取页⾯内容并使⽤beautiful库解析的过程。
⼀、基本环境配置
⼆、使⽤步骤
1.引⼊库
代码如下(⽰例):
from bs4 import BeautifulSoup
from selenium import webdriver
#ActionChain是⽤来实现⼀些基础的⾃动化操作:⽐如⿏标移动、⿏标点击等,ActionChains可以实现⼀
步操作多个步骤
from selenium.webdriver import ActionChains
import PIL
from PIL import Image
import time
import #编码是从⼆进制到字符的过程
import threading
import pandas as pd
2.实际案例
登陆淘宝:
def login_first(self):
#淘宝⾸页链接⼀开始使⽤https时返回status_code为502
#pageview_url = 'www.taobao/?spm=a1z02.1.1581860521.1.CPoW0X' 类属性中已经定义
#PhantomJS与Chrome的差别在于Chrome可以启动浏览器,观察到代码操作的每⼀个步骤进⾏的页⾯操作PhantomJS 模拟⼀个虚拟浏览器,即在不打开浏览器的前提下对浏览器进⾏操作
#driver = webdriver.PhantomJS()
#driver = webdriver.Chrome() 类属性中已经定义
#在get()步加载时间会很长不知道是不是⽹络的问题,所以限制加载20秒以后停⽌加载
#在get()步加载时间会很长不知道是不是⽹络的问题,所以限制加载20秒以后停⽌加载
self.driver.set_page_load_timeout(40)
self.driver.set_script_timeout(40)
try:
(self.pagelogin_url)
except:
print("页⾯加载太慢,停⽌加载,继续下⼀步操作")
ute_script("window.stop()")
#此处需要设置等待,不然再页⾯缓存完之前就执⾏以下语句会导致不到元素
time.sleep(40)
#到登陆按钮并点击
#原本在获取cookies后通过request库带着cookies访问需要登陆才可访问的页⾯,但是对于webdriver没有作⽤#⽹页⾃动化最基本的要求就是先定位到各个元素,然后才能对各元素进⾏操作(输⼊、点击、清除、提交等) #XPath是⼀种XML⽂档中定位元素的语⾔。该定位⽅式也是⽐较常⽤的定位⽅式
#8.1通过属性定位元素 find_element_by_xpath("//标签名[@属性='属性值']")
#可能的属性:id、class、name、maxlength
#通过标签名定位属性:所有input标签元素find_element_by_xpath("//input")
#通过⽗⼦定位属性:所有input标签元素find_element_by_xpath("//span/input")
#通过元素内容定位:find_element_by_xpath("//p[contains(text(),'京公⽹')]")
#获取id="login"的标签下第⼀个div//’表⽰从任意节点搜索不必从根节点⼀节⼀节
#如何到对应按钮或者页⾯的xpath内容:检查页⾯,点击左上⾓箭头标志,
#然后点击⽬标内容,会⾃动定位到Elements中该内容的标签属性,右键COPY Xpath即可
#self.driver.find_element_by_xpath('//*[@class="btn-login ml1 tb-bg weight"]').click()
#time.sleep(40)
#下⾏代码的⽬的:查⼆维码登陆的源代码点击使⽤⼆维码登陆
try:
#到⼆维码登陆对应的属性并点击⼆维码登陆
driver_data=self.driver.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
driver_data=self.driver.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
except:
pass
#通常需要停顿⼏秒钟,不然会被检测到是爬⾍
#等待⽹页缓冲
time.sleep(20)
# 执⾏JS获得canvas的⼆维码
#.通过tag_name定位元素
JS = 'ElementsByTagName("canvas")[0].toDataURL("image/png");'
im_info = ute_script(JS) # 执⾏JS获取图⽚信息
im_ = im_info.split(',')[1] #拿到编码的图⽚信息
im_bytes = .b64decode(im_) #转为bytes类型
time.sleep(2)
with open('E:/学习‘/login.png','wb') as f:
#⽣成⼆维码保存
f.write(im_bytes)
f.close()
#打开⼆维码图⽚,需要⼿动扫描⼆维码登陆
t = threading.Thread(target=self.opening,args=('E:/学习‘/login.png',))
t.start()
print("Please sweep the code!\n")
#获取登陆后的Cookie(只看到⽤户名,没有看到账号和密码)
while(True):
c = _cookies()
if len(c) > 20: #登陆成功获取到cookies
cookies = {}
#下⾯隐藏是因为对cookies只保留了name和value以后只能⽤于request,不能⽤于webdriver的add_cookies作⽤不然会报错InvalidCookieDomainException
会报错InvalidCookieDomainException
#for i in range(len(c)):
#cookies[c[i]['name']] = c[i]['value']
self.driver.close()
print("Login in successfully!\n")
#return cookies
return c
time.sleep(10)
执⾏上述代码已经完成淘宝登陆并且跳转到了我的淘宝页⾯
从我的淘宝跳转到淘宝⾸页:
def my_split(self,s, seps):
"""split移除多个字符"""
res = [s]
for sep in seps:
selenium获取cookiet = []
list(map(lambda ss: t.extend(ss.split(sep)), res))
res = t
return res
def is_Chinese(self,word):
"""判断是否中⽂"""
for ch in word:
if '\u4e00' <= ch <= '\u9fff':
return True
return False
def get_Cates(self):
"""登陆后默认跳转到我的页⾯,该段代码⽤户跳转到淘宝⾸页并且获取淘宝所有商品类别""" #以上步骤已经实现淘宝登陆,并且进⼊到我的页⾯,点击淘宝⽹⾸页,跳转到⾸页time.sleep(10)
time.sleep(10)
#查看源代码确定"淘宝⽹⾸页"的按钮对应的属性,使⽤click进⾏点击
self.driver.find_element_by_xpath('//*[@class="site-nav-menu site-nav-home"]').click()
#跳转到⾸页后⾸先获取淘宝页⾯左边栏的所有品类
#检测到淘宝为动态JS,使⽤request库获取⽹页信息会与⽹页检查出来的数据不⼀致,所以需要⽤selenium包。#查看源码定位⽬标内容(即品类栏⽬)所对应的属性class
driver_data = self.driver.find_element_by_xpath('//*[@class="screen-outer clearfix"]')
html_doc = self.driver.page_source
#driver.quit()
#利⽤beautifulSoup解析⽹页源代码
soup = BeautifulSoup(html_doc, "lxml")
#到淘宝主页中所有的主题,对应的class可通过查看class的范围确定
cate_list=[]
soup_data_list = soup.find("div",attrs={'class':'service J_Service'})
#获取源代码中的⽂本信息,即淘宝所有的物品主题
#通过⾃定义的split函数获取移除⾮法字符后的中⽂字符
list_tuple = list(("\n","\\","\ue62e","/","\t"," "," "," "))
cate__split(soup_,list_tuple)
#使⽤⾃定义的is_Chinese函数仅保留中⽂⽂本
keep_select = []
#cate_list_final=[]
for i in cate_list:
keep_select = self.is_Chinese(i)
if keep_select:
self.cate_list_final.append(i)
time.sleep(10)
return self.cate_list_final