Python爬虫实战——Lazada商品数据(selenium自动化爬虫,xpath定位)

这篇具有很好参考价值的文章主要介绍了Python爬虫实战——Lazada商品数据(selenium自动化爬虫,xpath定位)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        在此说明,这个项目是我第一次真正去爬的一个网站,里面写的代码我自己都看不下去,但是已经不想花时间去重构了,所以看个乐呵就好,要喷也可以(下手轻一点)。这篇文算是记录我的学习中出现的一些问题,不建议拿来学习和真拿我的代码去爬Lazada的数据,当然看看我的思路还是可以的。

目标

        我的目标是拿到个分类下的商品数据

lazada爬虫,python,windows,pycharm,网络爬虫

 lazada爬虫,python,windows,pycharm,网络爬虫

 爬虫思路

        1.获取各个分类的链接

        2.获取各个分类下的商品链接

        3.通过商品链接获取到需要的商品数据

需要用到的包和工具准备

import time
import openpyxl
import requests
import re
from lxml import etree
from selenium.webdriver.common.by import By
import bag  # 这个包是别人写好给我的,我会在下面把用到的方法放出来

         这个bag包里面的很多参数是不起作用的,可以不用管它。这里给Chrome浏览器设置了一个9222端口方便用程序控制自己打开的浏览器

 class Bag:   
    def web_debug():
        chrome_options = Options()
        chrome_options.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
        chrome_options.page_load_strategy = 'eager'
        chrome_options.add_argument('–disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
        chrome_options.add_argument('--incognito')
        chrome_options.add_argument('--disable-javascript')
        chrome_options.add_argument('--enable-automation')
        chrome_options.add_argument('--no-sandbox')  # 解决DevToolsActivePort文件不存在的报错
        chrome_options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
        web = Chrome(service=Service(), options=chrome_options)
        return web

右键Chrome浏览器的属性把目前路径改成如下:

C:\Program Files\Google\Chrome\Application\chrome.exe (括号里面的是解释用的时候记得删掉:前面是你谷歌浏览器的放在文件夹里的位置)[--headless] --remote-debugging-port=9222 --user-data-dir="D:\工作文件\data  (还要创建一个放数据的文件夹)

设置好后就可以win+R打开运行窗口,输入cmd打开Windows命令行窗口:

输入如下命令:

cd C:\Program Files\Google\Chrome\Application\ (浏览器在电脑中的位置)
chrome.exe --remote-debugging-port=9222 --user-data-dir="D:\工作文件\data"

就可以打开一个浏览器,到时候我们让程序通过端口控制自己打开的浏览器,这样好突破网站的反爬手段

商品链接爬取

讲了那么多终于开始准备爬虫了(再次吐槽自己写的是什么鬼东西搞这么复杂),下面是进行第一步拿到分类的链接。

通过下一页还有F12的一个观察,发现链接数据都是通过访问如下链接请求回来的

lazada爬虫,python,windows,pycharm,网络爬虫

 这是第一个分类第三页的链接:https://www.lazada.sg/shop-power-banks/?ajax=true&isFirstRequest=true&page=3&spm=a2o42.searchlistcategory.cate_1_1.2.46115305qPLfPu

 然后?之后的链接都是可以不用要的,但是为了页数我们只把page= 后面的链接删了,page是控制页数的参数

整理如下

https://www.lazada.sg/shop-power-banks/?ajax=true&isFirstRequest=true&page=3

 再观察发现链接中的这部分

lazada爬虫,python,windows,pycharm,网络爬虫

 刚好就是最小的那个分类的名字,那这个链接就好搞了

通过xpath定位可以找到分类的链接

lazada爬虫,python,windows,pycharm,网络爬虫

 爬取分类链接的代码如下:

头文件和cookie,要设置好,不然网站不会返回数据

headers = {
    'User-Agent': ''
}
cookies = {
    'cookie': ''
}
def shop_spider(url):
    '''
    遇到的问题:
        1.在获取商品分类界面的url时request访问回来的数据不全(网页源代码有数据)。 解决方法:这个网站需要添加cookie
        2.形成的JSON链接有一些是错误的,使用时需要抛出异常
        3.只爬取了分类下的第一页的链接
    '''
    # 获取商品分类界面url
    req = requests.session().get(url, headers=headers, cookies=cookies).text
    ht = etree.HTML(req)
    li = ht.xpath("//li[@class='lzd-site-menu-grand-item']/a/@href")  # 分类界面
    # 组合获取到的分类名字,形成分类链接
    url_list = []
    for i in li:
        url_list.append('https:' + i + '?ajax=true&isFirstRequest=true&page=1')
    # 将获取到的链接存入到txt文档中
    f = open('D:\\工作文件\\lazadaurl.txt', 'w', encoding='utf8')
    f.write('\n'.join(url_list))
    f.close()
shop_spider('https://www.lazada.sg/')  # 启动函数

很好,现在我们完成了第一步,现在到第二步:从获取到的分类界面链接里面提取出商品的链接

实现代码:

def lazada_json():
    f = open('D:/工作文件/lazadaurl.txt') # 这里放的是前面爬到的分类链接
    ls = []
    for i in f:
        try:
            # 发起request请求session是保存之前cookie等数据,拿JSON格式的数据回来
            req = requests.session().get(i, headers=headers, cookies=cookies).json()
            # 正则匹配出需要的url
            js = re.findall(ir, str(req))
            # 集合(set)去重
            li = list(set(js))
            # 循环寻找可以访问的链接(找回来的数据是只有//www开头的链接才可以访问),是就写进一个新的列表,不是就pass
            for j in li:
                if j[:5] == "//www":
                    ls.append(j)
                else:
                    pass
        except Exception as arr:
            print(arr)  # 抛出异常名字和出现异常的链接
            continue  # 抛出异常继续爬取
    # 保存爬取到的链接,以待后面爬商品的详情数据
    url = []
    for i in ls:
        url.append('https:' + i)  # 组合成商品详情页链接
    f = open('D:\\工作文件\\url.txt', 'w')
    f.write(str('\n'.join(url)))
    f.close()

商品数据爬取

接下来到我们的第三步,爬商品详情页的数据了。这也是本人最不满意的一部分,也是问题最多的一部分。

拿数据的部分如下图,当然还有商品的链接:

lazada爬虫,python,windows,pycharm,网络爬虫

 lazada爬虫,python,windows,pycharm,网络爬虫

 

爬取代码如下:

def lazada_data():
    f = open('D:/工作文件/没爬的url1.txt', encoding='utf8')
    p = open(r'D:\工作文件\没爬的url.txt', 'a')
    url = []
    for r in f:
        url.append(r)
    l = openpyxl.load_workbook('D:/工作文件/text.xlsx')  # 读取已经有的工作簿
    sheet1 = l['sheet1']  # 创建sheet工
    ch = bag.Bag.web_debug()  # 使用bag包里面的方法创建浏览器
    x = 1  # 这是写入到Excel里面的第几行,也表示着现在爬到了第几条链接
    for i in url[0:]:  # 这里可以选择从第几条开始爬,记得要-1,因为列表是从0开始数
        data = []
        bq1 = []
        ch.get(i)
        # 出现验证码拦截界面时停止程序,手动处理验证码之后再从新启动
        if ch.title == '验证码拦截':
            print('在第' + str(x) + '终止')
            l.save('D:/工作文件/text.xlsx')  # 保存.xls到当前工作目录
            exit(0)
        # 处理当商品已经下架之后的状况
        if ch.title == 'non-existent products':
            continue
        try:
            ch.implicitly_wait(100)
            time.sleep(1)
            data.append(ch.find_element(By.XPATH, '//*[@id="module_product_title_1"]/div/div/h1').text)  # 标题
            data.append(ch.find_element(By.XPATH, '//*[@id="module_product_brand_1"]/div/a[1]').text)  # 品牌
            bq = ch.find_elements(By.XPATH, '//*[@id="J_breadcrumb"]/li/span/a')  # 分类标签
            for k in bq:
                bq1.append(k.get_attribute('text'))
            data.append(bq1)
            data.append(ch.find_element(By.XPATH, '//*[@id="module_product_review_star_1"]/div/a').text)  # 评级
            req = requests.session().get(i, headers=headerss, cookies=cookiess).text
            et = etree.HTML(req)
            jj = re.findall(jre, str(req))
            # 判断有没有拿到简介的数据,没有就跳过,加入到后续补爬的文件里面
            if jj:
                data.append(jj)  # 简介
            else:
                print('第' + str(x) + '条链接的简介没拿到!')
                p.write(i)
                continue
            data.append(et.xpath("//img[@class='pdp-mod-common-image item-gallery__thumbnail-image']/@src"))  # 商品图片链接

            data.append(i)  # 商品详情页链接
            # 保存到xlsx文件里,因为这里列表里面套列表([1,2,[4,5,6],3]),所以加个判断(当然这部分还可以优化,懒了,不想改了)
            for y in range(len(data)):
                if type(data[y]) != list:
                    sheet1.cell(x, y + 1).value = data[y]  # 写入数据参数对应 行, 列, 值
                else:
                    sheet1.cell(x, y + 1).value = '\n'.join(data[y])
            x += 1
        except Exception as arr:
            print('第' + str(x) + '条错误,已经加入未爬取文件')
            p.write(i)
            continue
        if x % 500 == 0:
            l.save(r'D:/工作文件/text.xlsx')  # 保存.xls到当前工作目录
    l.save('D:/工作文件/text.xlsx')  # 保存.xls到当前工作目录
    p.close()

 main函数启动,一个个起就可以了

if __name__ == '__main__':
    # shop_spider('https://www.lazada.sg/')
    # lazada_json()
    lazada_data()

商品详情的数据爬取这部分在分类标签这部分用了拦截器函数,具体的原理我还没研究明白

总结

        小小的总结一下吧,在获取链接的那两部分我个人感觉还OK,就是在数据获取那边用的方法非常的混乱,用了selenium自动化爬虫,接下又对同一个链接发request请求,说实话真的有点多余了,但是我有不知道怎么把拿商品的介绍这部分,所以才使用了这样的一个非常臃肿的方法(不要学)。

        具体的结果图我就不放出来了,本来就是记录一下自己的学习过程的。文章来源地址https://www.toymoban.com/news/detail-785056.html

到了这里,关于Python爬虫实战——Lazada商品数据(selenium自动化爬虫,xpath定位)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium实战之Python+Selenium爬取京东商品数据

    实战目标:爬取京东商品信息,包括商品的标题、链接、价格、评价数量。 代码核心在于这几个部分: 其一:使用元素定位来获取页面上指定需要抓取的; 其二:将页面上定位得到的数据永久存储到本地文件中。 具体来梳理一下从访问URL开始到爬取数据整个流程下来

    2023年04月13日
    浏览(32)
  • Python 爬虫实战之爬淘宝商品并做数据分析

    前言 是这样的,之前接了一个金主的单子,他想在淘宝开个小鱼零食的网店,想对目前这个市场上的商品做一些分析,本来手动去做统计和分析也是可以的,这些信息都是对外展示的,只是手动比较麻烦,所以想托我去帮个忙。 具体的要求如下: 1.在淘宝搜索“小鱼零食”

    2024年02月05日
    浏览(26)
  • Python 爬虫实战之爬拼多多商品并做数据分析

    Python爬虫可以用来抓取拼多多商品数据,并对这些数据进行数据分析。以下是一个简单的示例,演示如何使用Python爬取拼多多商品数据并进行数据分析。 首先,需要使用Python的requests库和BeautifulSoup库来抓取拼多多商品页面。以下是一个简单的示例代码: 在上面的代码中,我

    2024年02月05日
    浏览(31)
  • Python爬虫实战:自动化数据采集与分析

    在大数据时代,数据采集与分析已经成为了许多行业的核心竞争力。Python作为一门广泛应用的编程语言,拥有丰富的爬虫库,使得我们能够轻松实现自动化数据采集与分析。本文将通过一个简单的示例,带您了解如何使用Python进行爬虫实战。 一、环境准备 首先,确保您已经

    2024年02月11日
    浏览(37)
  • LAZADA平台的商品评论Python封装API接口接入文档和参数说明

         LAZADA是一个位于东南亚的电商平台,成立于2012年。该平台覆盖的国家包括新加坡、马来西亚、印尼、菲律宾、泰国和越南等地。它提供了一个多样化的产品选择,包括时尚、美容、数码、母婴等商品,并且拥有许多知名品牌的官方旗舰店。同时,LAZADA平台也为卖家提供

    2024年02月08日
    浏览(28)
  • 爬虫 + 自动化利器---selenium详解以及实战项目

    什么是selenium Selenium是一个用于Web应用程序测试的工具。 只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。 Selenium测试套件直接运行在浏览器中,就像真正的用户在操作浏览器一样。 Selenium也是一款同样使用Apache Li

    2024年02月09日
    浏览(32)
  • API商品数据接口调用爬虫实战

    随着互联网的发展,越来越多的商家开始将自己的商品数据通过API接口对外开放,以供其他开发者使用。这些API接口可以提供丰富的商品数据,包括商品名称、价格、库存、图片等信息。对于爬虫开发者来说,通过调用这些API接口,可以更加便捷地获取商品数据,避免了爬取

    2024年02月07日
    浏览(27)
  • Selenium + Django + Echarts 实现亚马逊商品数据可视化爬虫项目

    最近完成了1个爬虫项目,记录一下自己的心得。 根据用户输入商品名称、类别名称,使用Selenium, BS4等技术每天定时抓取亚马逊商品数据,使用Pandas进行数据清洗后保存在MySql数据库中. 使用Django提供用户端功能,显示商品数据,以可视化的方式分析数据,以及数据抓取任务管

    2024年01月25日
    浏览(34)
  • python爬虫(七)--------selenium自动化

    查找方法(python3.7之前版本) find_element_by_id 根据id属性来定位 find_element_by_name 根据name元素来定位 find_element_by_xpath 根据xpath语法来定位 find_element_by_tag_name 根据标签名来定位 find_element_by_class_name 根据class的名字来定位 find_element_by_css_selector 根据css选择器来定位 以下两种方法都

    2024年01月16日
    浏览(51)
  • Python爬虫之自动化测试Selenium#7

    在前一章中,我们了解了 Ajax 的分析和抓取方式,这其实也是 JavaScript 动态渲染的页面的一种情形,通过直接分析 Ajax,我们仍然可以借助 requests 或 urllib 来实现数据爬取。 不过 JavaScript 动态渲染的页面不止 Ajax 这一种。比如中国青年网(详见 国内_新闻频道_中国青年网),

    2024年02月20日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包