我从来没想过淘宝天猫的反扒机制这么强,随着学习的推进,我用上了selenium,开始爬取这些网站,然后我输很彻底,下面我讲一下我失败的最后倔强!
果然学习不会顺水成舟,该碰壁还是得碰壁,我拿着18年的书籍来学习,哪个时候他们可以随意爬取这些网站,而现在反扒机制真的强哎。搞了整整四天,尝试各种方法,很多说可以改chromeDriver.exe这个的,还有的绕开方式,微博登入啥的,其实我都试过了。。。或许哪个时候有用,但是现在真的没用了,我真的不知道用啥方法来搞了,一脸委屈,然后经过我的最后顽强,我还是抓到了仅仅一页的数据,心中有一点点的欣慰。
前言
本次测试最开始从淘宝,然后到天猫,然后到拼多多,权衡最终还是选择了天猫 --------->(淘宝第一页就得登入, 拼多多没有网页版,别说出去哈)
使用了我最近才学的selenium自动化技术,能达到可见就可爬的效果,非常的震惊啊! 有解释的不好地方的话,见谅见谅哈。
一页成果:
最后的一点点倔强!
实战技术:
函数库:
表示从来没见过这么多函数库的我,一下子也是蒙蔽了。对着书本一个个的敲出来,生怕打错了一个 =。 =
获得一页的真实源代码:
网址如下: https://list.tmall.com/search_product.htm?q=iphoneXR
这里的关键词 iphoneXR 待会得用函数表示,不然可能乱码,网页识别不了
函数功能: 获得源代码,然后判断页码,如果是第二页或者其他页数,那我们就进行翻页操作,然后继续获得该页源代码,将源代码传给其他函数,
函数实现: 使用selenium根据xpath进行定位,这里使用到了显性等待unit的使用方法,这也是我在书上看到的一种,刚接触把我蒙了,不过,我代码中解释的很清楚。
图示: 定位这几处,我是通过xpath定位的,不会书上的css定位。
代码如下:
def index_page(page):
"""
抓取索取页源代码
param: page 页码
如果page大于1 那么就进行翻页操作
"""
print(f'正在抓取关键词为{KEYWORD} 的 {page} 页')
try:
url = 'https://list.tmall.com/search_product.htm?q=' + quote(KEYWORD)
browser.get(url)
# print(browser.page_source) 此处ok
if page > 1: # 进行翻页操作
inp = wait.until(
EC.presence_of_element_located((By.XPATH, '//*[@id="content"]/div/div[8]/div/b[2]/form/input[6]')))
submit = wait.until(
EC.element_to_be_clickable((By.XPATH, '//*[@id="content"]/div/div[8]/div/b[2]/form/button')))
inp.clear() # 清空
inp.send_keys(page) # 输出页码
time.sleep(1)
submit.click()
# 某个节点文本是否包含某文字 判断当前高亮页码数是不是跳转页码数
wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="content"]/div/div[8]/div/b[1]/b[2]'),
str(page)))
# 判断商品是否全部加载出来 节点加载出来,传入定位元组
wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="J_ItemList"]//div')))
get_product() # 调用
except TimeoutException: # 如果超时 重新访问
index_page(page)
获得该页的需求数据:
比如这张图: 我想获得图片,价格,名称,店铺,还有销售额,但是这是一个产品呀,要想获得该页所有产品,我们就得先定位总产品,思路是这样的。
就是我箭头所指的位置,我们这样定位:就可以获得所有的产品了,打开这个树节点,就可以看到每个产品的节点。那下面就是编写对于的数据的xpath语法了。
roducts = html.xpath('//*[@id="J_ItemList"]//div') # 定位总产品
代码如下:
def get_product():
"""
根据传来的网页源代码
进行数据的解析
param : None
"""
product = []
html = browser.page_source # 获得该页的真实源代码
html = etree.HTML(html)
html = etree.tostring(html)
html = etree.fromstring(html)
products = html.xpath('//*[@id="J_ItemList"]//div') # 定位总产品
for item in products:
img = item.xpath('//div[@class="product-iWrap"]/div[@class="productImg-wrap"]/a/img/@src')
price = item.xpath('//div[@class="product-iWrap"]/p[@class="productPrice"]/em/text()')
title = item.xpath('//div[@class="product-iWrap"]/p[@class="productTitle"]/a/text()')
shop = item.xpath('//div[@class="product-iWrap"]/div[@class="productShop"]/a[@class="productShop-name"]/text()')
buy = item.xpath('//div[@class="product-iWrap"]/p[@class="productStatus"]/span/em/text()')
for i, j in enumerate(img):
product_item = {
'img': j,
'title': title[i],
'price': price[i],
'shop': shop[i],
'buy': buy[i]
}
product.append(product_item)
save_prduct(product) # 保存
保存该页数据:
我使用的是csv表格的保存,对于数据库来说,因为我还没学过,但是我计划过一段时间学习数据库。
简单的cvs表格的录入实例:
def save_prduct(product):
"""
根据抓取的信息 按照条数保存
param: None
"""
header = ['img', 'title', 'price', 'shop', 'buy']
with open('天猫' + KEYWORD + '数据.csv', 'a+', newline='') as fw:
fw_write = csv.DictWriter(fw, header)
fw_write.writeheader() # 写入表头
fw_write.writerows(product)
print('数据保存成功一次!')
主函数:
"""基本设置 和 关键词"""
# browser = webdriver.Chrome(chrome_options=chrome_options)
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 30) # 设置显性时间
KEYWORD = 'iphoneXR'
if __name__ == '__main__':
"""遍历每一页"""
for i in range(1, 3):
index_page(i)
browser.close()
后记:
对于爬虫来说,其实我也是在学习中,我不是很聪明,但是我很认真的会做笔记,我也会骚扰别人,寻求我不会的东西,挺感谢他们的,这是我的学习方法。
还有一点,请问有没有大佬能指导我一下,这个淘宝和天猫,我到底要怎么爬! 我真的没办法了。
若看到这里,请点个关注和赞,你我一起加油!
原文链接:https://blog.csdn.net/qq_45906219/article/details/106121233