【爬虫】selenium+webdrive抓取淘宝商品评价
爬虫小白入门
(声明:本人只是处于突如其来的兴趣学习一点点,水平实在不高,但在这个过程中也或多或少地解决了一些问题,所以对同为小白的朋友们或许有用,但还请大神们不要笑我!)
动手前必备的知识包括:网页"html"的语法应当基本了解一些,比如"<div、tr、tb>"表示的是什么;python的基本语法
一、环境配置
- selenium安装:本人很懒哈哈哈,所以不管安装啥都是用anaconda prompt的黑框框pip的
这里是安装命令:
pip install -i https://mirrors.aliyun.com/pypi/simple/ selenium
PS:据说最近清华源不太好用,咱也不知道为什么,所以换了阿里源😁
-
Webdriver下载配置
事实上我也完全不懂这玩意到底是个啥,反正用就完事儿了。安装配置的操作我都参考了前辈们的博客,链接放在下面,直达大神博客!
(6条消息) Chromedriver安装及配置_hijacklei的博客-CSDN博客_chromedriver安装
我用的是Chorme浏览器的,Edge和火狐也有(但我没有去试)如果安装配置遇到什么问题的话大家自己再搜一搜嗷,平心静气地配环境是一个码农的基本素养(谁还没被配环境这种事情逼疯过呢)
PS:小吐槽~Edge的下载实在不好用,我试了好几次,还尝试了迅雷都没办法下载,Chorme一下子就下好了,真不愧是业界龙头哈哈哈
二、观察目标网页
我们需要先观察目标网页的信息,也就是说你想拿到什么信息。查看方式可百度。这里我的目标是对淘宝的某商品评价进行截图,所以仔细看了一下淘宝网页。
在开发者页面直接搜索【累计评价】就可以直接定位到html代码位置,然后观察发现每条评价所在的位置是
<div class="rate-grid">
<table>
<tbody>
<tr>
<td class="tm-col-master">...</td>
<td class="col-meta">...</td>
<td class="col-author">...</td>
</tr>
<tr>...</tr>
<tr>...</tr>
</tbody>
</table>
</div>
也就是说我们只要定位到class="rate-grid"的div下,然后就可以对表格里面的每一个进行截图了!那怎么定位到tr路径呢?调用webdriver.find_element_by_xxx 函数。这个系列的函数有很多,大家可以多去搜一搜教程和详解,多看一看就明白是怎么用的了。我看的最多的一个链接,竟然是百度经验!python实战006:find_element_by_xpath定位元素-百度经验 (baidu.com)
(5条消息) Selenium六 find_element_by_xpath()的几种方法_雪国的花儿’s Blog-CSDN博客
三、搞代码!
新手入门,做了很多奇奇怪怪地测试,所以代码命名可能不太好看,请大家不要介意啊!
写在前面:小白入门可能会忽略或者说不太明白的点是爬取网页信息的过程中往往会加入很多time.sleep()函数,这是因为代码的运行速度是很快的,网页很多操作往往跟不上代码运行的速度,所以需要经常使用这个函数,用来等待网页相应。
第一步:webdriver拉起浏览器进入网页
url="www.sina.cn"
def main():
driver_path = r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe" #指定chromedriver.exe路径
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=driver_path)
driver.get(url)
第二步:driver.find_element_by_xxx函数定位到商品评论部分
def xunhuan(driver, author_list):
body_set = driver.find_elements_by_xpath('//div[@class="rate-grid"]/table/tbody/tr')
time.sleep(2)
for tr in body_set:
"""下面这两句是针对带有滚动条的网页的。因为目标区域所在的位置没有显示在当前屏幕上,所以驱动网页找到它所在的位置。
js = 'arguments[0].scrollIntoView();'这句其实我是完全不理解的,因为我不会写java。但是在使用过程中发现它会将目标区域显示在页面的最上方,而最上方一般都会有遮挡,不便于截图,所以写入false参数就将目标区域显示在页面的最下方了。
"""
js = 'arguments[0].scrollIntoView(false);'
driver.execute_script(js, tr)
time.sleep(1)
image_name = time.strftime('%Y-%m-%d_%H-%M-%S_%A')
picture = tr.screenshot("%s.png"%image_name) #截图保存为
mv_file(image_name)
time.sleep(1)
# 下面这两句是取出每条评论对应的买家昵称,如果没有需求的话可以不看
author=tr.find_element_by_xpath('.//td[@class="col-author"]/div').text
author_list.append(author)
# 图片保存
def mv_file(image_name):
if os.path.exists(r'C:/Users/Hp/Downloads/picture'):
shutil.move('.\\'+"%s.png"%image_name,'C:\\Users\\Hp\\Downloads\\picture\\'+"%s.png"%image_name)
else:
print("不存在截图文件夹")
第三步:设定自动翻页,每页只有20条评论,所以自动翻页还是很必要的
url3="https://detail.tmall.com/item.htm?id=636628798044&price=61-183&sourceType=item&sourceType=item&detailSharePosition=interactBar&suid=f5f97e31-18c0-4b44-b295-f17d6b4b1cb4&preSpm=share&poplayer=fission_sub_coupon&token=ed82af6944539bb0119d53b46970f611a69ebb9cd3b13db3c83d282930ae61c293a2af2e916362c7cee90c3ae5e58cea74c13b74a157cd6f7d9461a8c72aa38d1281b819c010d1b955c15c7d1e6601d6cbdf3c87ee1403d24290921c9f49abe3&sellerId=2210451160933&shareUniqueId=9404538442&ut_sk=1.XrIdrM0fpjUDAMzNx1EKBCI8_21646297_1619344174891.Copy.DETAIL_FISSION_COUPON&un=179347ae315395577bc9097ac7465126&share_crt_v=1&spm=a2159r.13376460.0.0&sp_tk=cHNsdVhkY3ZpYjU=&cpp=1&shareurl=true&short_name=h.4KpMOq2&bxsign=scddNMTDd_NpbsROXR90wLQXHvZznTxCjGezoFty94kduefB2tKXZSCjW1d0FNHNfJPA7my3Uo9NSftaOODDGNQ5IdvV4Ra9gTMSig_sKBoTlQ&sm=dc3357&app=chrome"
def main():
driver_path = r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe" #指定chromedriver.exe路径
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=driver_path)
driver.get(url3)
print(time.ctime())
time.sleep(35) # 留出的时间可以用于登录(如果弹出了访问验证的框就说明需要登录才能访问到评价数据)
print(time.ctime())
author_list=[]
xunhuan(driver, author_list) # 先读第一页
# 进入翻页读取部分
for i in range(3):
body = driver.find_element_by_link_text('下一页>>')
js = 'arguments[0].scrollIntoView(false);'
driver.execute_script(js, body)
body.click()
time.sleep(2)
xunhuan(driver, author_list)
return author_list
PS:由于我比较菜,这个自动翻页程序在遇到评价折叠的时候就会停下来(我的需求没有这么多,所以这个问题没有去解决)。如果大家有什么解决方法的话,可以发在评论区交流哇。
最后:主函数里调用main()函数就好了
if __name__ == '__main__':
author_list=main()
print(author_list)
最后截取出来的结果就是这样子哒!
欢迎大家交流经验哇!😁