便宜VPS主机精选
提供服务器主机评测信息

利用python爬取淘宝商品信息数据的方法

由于淘宝网站的不断更新,以前的爬取方法都无法重现,必须需要登录淘宝网站才可以进行搜索商品。所以我们要利用 Selenium 抓取淘宝商品并用 pyquery 解析得到商品的图片、名称、价格、购买人数、店铺名称和店铺所在地信息,并将其保存到 MongoDB。在开始之前,请确保已经正确安装好 Chrome 浏览器并配置好了 ChromeDriver;另外,还需要正确安装 Python 的 Selenium 库;

首先我们研究一下爬虫入口,在这里我们是无法直接跳转到搜索页面,所以需要使用 selenium 先访问淘宝首页https://www.taobao.com

20190321135944783

利用 webdriver.Chrome()打开淘宝首页后,通过 CSS 选择器获取输入框,塞入关键字,然后启动搜索按钮。在跳转的过程中,页面会跳转到淘宝登陆页面,所以这里我们利用 cookie 来模拟登录淘宝,这样就能跳转到商品搜索页面。

#这是个人登录淘宝网址时,保留的cookie文件,这里我使用的是谷歌浏览器,安装EditThisCookie插件,把登录时的cookie保存下来
def add_cookies():
    with open('taobao.json','rb') as f:
        cookies = json.load(f)
        for item in cookies:
            browser.add_cookie(item)
Python
 print("淘宝模拟登录,搜索ipad物品,爬取一定页数的产品简介....")
    browser.get('https://www.taobao.com')
    add_cookies()
    input = browser.find_element_by_id('q')
    input.send_keys(KeyWord)
    button = browser.find_element_by_class_name('btn-search')
    button.click()
    print("淘宝模拟登录成功,查询完毕,现在开始爬取内容")
Python

– 翻页

分析淘宝商品页面,在页面下方,有一个分页导航,其中既包括前5页的链接,也包括下一页的链接,同时还有一个输入任意页码跳转的链接。

20190321150156740

这里商品的搜索结果一般最大都为 100 页,要获取每一页的内容,只需要将页码从 1 到 100 顺序遍历即可,页码数是确定的。所以,直接在页面跳转文本框中输入要跳转的页码,然后点击“确定”按钮即可跳转到页码对应的页面。

这里不直接点击“下一页”的原因是:一旦爬取过程中出现异常退出,比如到 50 页退出了,此时点击“下一页”时,就无法快速切换到对应的后续页面了。此外,在爬取过程中,也需要记录当前的页码数,而且一旦点击“下一页”之后页面加载失败,还需要做异常检测,检测当前页面是加载到了第几页。整个流程相对比较复杂,所以这里我们直接用跳转的方式来爬取页面。

print('正在爬取第',page,'页')
    try:
        # url = 'https://s.taobao.com/search?q=' + quote(KeyWord)
        # print(url)
        # browser.get(url)
        if page > 1:
            input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager div.form > input')))#找到页面底部页数跳转输入框
            submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager div.form > span.btn.J_Submit')))#输入页数后,点击确定进行跳转
            input.clear()
            input.send_keys(page)
            submit.click()
        #判断当前高亮的页码数是当前的页码数即可,所以这里使用了另一个等待条件text_to_be_present_in_element,它会等待指定的文本出现在某一个节点里面时即返回成功。
        # 这里我们将高亮的页码节点对应的CSS选择器和当前要跳转的页码通过参数传递给这个等待条件,这样它就会检测当前高亮的页码节点是不是我们传过来的页码数,
        # 如果是,就证明页面成功跳转到了这一页,页面跳转成功。
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager .items .item.active .num'), str(page)))
        #我们最终要等待商品信息加载出来,就指定了presence_of_element_located这个条件,然后传入了.m-itemlist .items .item这个选择器,而这个选择器对应的页面内容就是每个商品的信息块,
        # 可以到网页里面查看一下。如果加载成功,就会执行后续的get_products()方法,提取商品信息。
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.m-itemlist .items .item')))
        get_products()
    except TimeoutException:
        index_page(page)
Python

– 提取页面信息

20190321150448789

根据商品信息的源码,我们可以看出:每个商品都是一个 item,它们在 id 为 ‘item J_MouserOnverReq ‘下的 items 的列表中:

 html = browser.page_source
    doc = pq(html)
    #提取了商品列表,此时使用的CSS选择器是#mainsrp-itemlist .items .item,它会匹配整个页面的每个商品。它的匹配结果是多个
    items = doc('#mainsrp-itemlist .items .item').items()#关于css选择器,可以模糊匹配

    for item in items:
        product = {
            'image':item.find('.pic-link .img').attr('data-src'),#商品缩略图
            'price':item.find('.price').text().strip().replace('\n',''),#价格
            'deal':item.find('.deal-cnt').text(),#销售量
            'title':item.find('.title').text().strip().replace('\n',','),#简介
            'shop':item.find('.shop').text(),#商家
            'location':item.find('.location').text()#商家地址
        }
        print(product)
        # save_to_mongo(product)
Python

最后,将商品信息保存到 MongoDB,实现代码如下:

#将爬取的结果存入mongodb中
client = MongoClient()
db = client.learnTest
collection = db.taobao_product

def save_to_mongo(product):
    try:
        collection.insert_one(product)
    except Exception as e:
        print(e)
Python

看一下 MongoDB 中的结果,如图所示。

2019032115092852

详细代码:https://github.com/Acorn2/PythonSpider/blob/master/chapter05/taobao_selenium.py

未经允许不得转载:便宜VPS测评 » 利用python爬取淘宝商品信息数据的方法