真实难过,当python爬虫对上淘宝和天猫,我又失败了!

我从来没想过淘宝天猫的反扒机制这么强,随着学习的推进,我用上了selenium,开始爬取这些网站,然后我输很彻底,下面我讲一下我失败的最后倔强!

真实难过,当python爬虫对上淘宝和天猫,我又失败了!_第1张图片


果然学习不会顺水成舟,该碰壁还是得碰壁,我拿着18年的书籍来学习,哪个时候他们可以随意爬取这些网站,而现在反扒机制真的强哎。搞了整整四天,尝试各种方法,很多说可以改chromeDriver.exe这个的,还有的绕开方式,微博登入啥的,其实我都试过了。。。或许哪个时候有用,但是现在真的没用了,我真的不知道用啥方法来搞了,一脸委屈,然后经过我的最后顽强,我还是抓到了仅仅一页的数据,心中有一点点的欣慰。


天猫失败日记:

    • 前言
    • 一页成果:
    • 实战技术:
      • 函数库:
      • 获得一页的真实源代码:
      • 获得该页的需求数据:
      • 保存该页数据:
      • 主函数:
    • 后记:

前言

  • 本次测试最开始从淘宝,然后到天猫,然后到拼多多,权衡最终还是选择了天猫 --------->(淘宝第一页就得登入, 拼多多没有网页版,别说出去哈)

  • 使用了我最近才学的selenium自动化技术,能达到可见就可爬的效果,非常的震惊啊! 有解释的不好地方的话,见谅见谅哈。


一页成果:

  • 最后的一点点倔强!

真实难过,当python爬虫对上淘宝和天猫,我又失败了!_第2张图片


实战技术:

函数库:

表示从来没见过这么多函数库的我,一下子也是蒙蔽了。对着书本一个个的敲出来,生怕打错了一个 =。 =

真实难过,当python爬虫对上淘宝和天猫,我又失败了!_第3张图片


获得一页的真实源代码:

网址如下: https://list.tmall.com/search_product.htm?q=iphoneXR

  • 这里的关键词 iphoneXR 待会得用函数表示,不然可能乱码,网页识别不了

函数功能: 获得源代码,然后判断页码,如果是第二页或者其他页数,那我们就进行翻页操作,然后继续获得该页源代码,将源代码传给其他函数,

函数实现: 使用selenium根据xpath进行定位,这里使用到了显性等待unit的使用方法,这也是我在书上看到的一种,刚接触把我蒙了,不过,我代码中解释的很清楚。

图示: 定位这几处,我是通过xpath定位的,不会书上的css定位。

真实难过,当python爬虫对上淘宝和天猫,我又失败了!_第4张图片

代码如下:

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)

获得该页的需求数据:

比如这张图: 我想获得图片,价格,名称,店铺,还有销售额,但是这是一个产品呀,要想获得该页所有产品,我们就得先定位总产品,思路是这样的。

真实难过,当python爬虫对上淘宝和天猫,我又失败了!_第5张图片


就是我箭头所指的位置,我们这样定位:就可以获得所有的产品了,打开这个树节点,就可以看到每个产品的节点。那下面就是编写对于的数据的xpath语法了。

roducts = html.xpath('//*[@id="J_ItemList"]//div')  # 定位总产品

真实难过,当python爬虫对上淘宝和天猫,我又失败了!_第6张图片

代码如下:

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

后记:

对于爬虫来说,其实我也是在学习中,我不是很聪明,但是我很认真的会做笔记,我也会骚扰别人,寻求我不会的东西,挺感谢他们的,这是我的学习方法。

还有一点,请问有没有大佬能指导我一下,这个淘宝和天猫,我到底要怎么爬! 我真的没办法了。

若看到这里,请点个关注和赞,你我一起加油!

你可能感兴趣的:(爬虫)