Python 爬取Shopee商品信息

2020年09月25日 228点热度 2人点赞 0条评论

每次我们都要上购物网站去找我们想要买的东西,然而想要快速的知道那些商品的价格的最低价钱,市价上卖出的价格又是多少?那些是比较可靠的商店?品质比较好的?那么我们就要使用爬虫来获取这些数据,再进行数据分析,那么今天使用了Selenium框架来简单的爬取在Shopee上的一些商品的基本信息,Ex:商品名称,商品价格,出货地点以及商品的链接。

首先,我们需要先导入我们需要用到的模块:

from selenium import webdriver
import time

接着,就需要先去分析,查看Shopee网站的源代码,而我这里使用了马来西亚的URL地址作为演示。

在Shopee里我们可以发现到,如果想要买东西时,一定会去搜索商品,而在Shopee搜索当商品后的URL链接为/search?keyword=xxx, xxx中的内容就是想要搜索到的东西。

知道整个搜索过程后,就先来定义一个函数:

def command():
    search_name = input('请输入你想要搜索的内容:')
    page_num = input('请输入要爬取的页数:')
    print('正在努力爬取中。。。')
    for page in range(0, int(page_num)):
        url = 'https://shopee.com.my/search?keyword={}&page={}'.format(search_name, page)
        spider(url, page)

在这里同时发现到,当我们查看下一页的时候,URL上会多一个字串为page,代表着页数,如:第0-9...页,因此可以使用字符串格式化保留两个占位空间。

接着,我们来看看抓包工具给我提供了些什么信息,直接使用抓包工具定位到我们想要的信息,如:

在这张抓包工具的图中,我们能够发现,div标签下的类class都是相同的标签,这里能看到商品链接的标签,商品名称以及价格等等的属性标签。那么,我们就可以通过这些标签来进行定位,这里使用了selenium自带的find_element 来进行定位,也可以通过xpath的方式。

找到定位元素后,就可以定义第二个函数:

def spider(url, page):
    try:
        driver = webdriver.Chrome()
        driver.get(url)  # Get方法获取URL地址
        driver.implicitly_wait(1)  # 隐式等待
        driver.find_element_by_xpath('//*[@id="modal"]/div[1]/div[1]/div/div[3]/div[3]/button').click()  # 点击选择语言
        time.sleep(0.8)
        items = driver.find_element_by_class_name('col-xs-2-4')
        court = 0
        for item in items:
            driver.execute_script("window.scrollBy(0,1000)")
            court += 1
            item_name = item.find_element_by_css_selector('._1NoI8_').text
            item_price = item.find_element_by_css_selector('._341bF0').text
            item_location = item.find_element_by_css_selector('._3amru2').text
            item_url = item.find_element_by_tag_name('a').get_attribute('href')

            msg = '''
                爬取页数:%s
                爬虫序号:%s
                商品名称: %s
                商品价格: %s
                出货地点: %s
                商品链接:%s
            ''' % (page, court, item_name, item_price, item_location, item_url)

            print(msg)

            with open('items_page_{}.csv'.format(page), 'a', encoding='utf-8') as f:
                f.write(msg)

        print('数据爬取完成!只爬取到了', court, '个商品')

    except Exception:
        print('中途遇到👽外星人阻挡去路,数据爬取不完整!')

一般上首次进入Shopee的网站的时候,我们会发现会弹出一个窗口提示选择的语言,那么这个选择可以让Selenium自动的帮我们进行点击。我通过了xpath来定位Button按钮,接着爬着爬着的时候你就会发现,有些信息无法爬出来,原因就是页面本身加载的时候并没有全部加载出来,这里增加了一个script,driver.execute_script("window.scrollBy(0,1000)"),放在循环内帮我们下拉窗口后就能加载到全部元素。

最后就是把所有爬到的信息打印出来,保存在CSV文件,而我这里就做了一个简单的保存,下次或许你可以帮我把它改成Excel头部以及身体表格的信息,这样会更美观,效果更好。

在第二个函数中,也用了蒱抓异常,若是页面无法正常加载,这样也不会报错。你会发现在Selenium框架代码中经常会使用到time模块,原因是担心在网页/网速快慢加载的时候会受到影响。

最最最后别忘了定义了函数后是需要调用的,要不然代码是没办法运行的噢!

if __name__ == '__main__':
    command()

效果展示:

PS:// 这里悄悄告诉你噢,Shopee本身也是有使用API的噢,直接调用API也是可以的噢!

以上代码皆为学习使用,请勿用于非法途径,谢谢

YenYoong☕

当你能梦的时候就不要放弃梦~😎

文章评论