使用python + selenium爬取淘宝商品信息

因为淘宝是动态网页,很多商品的数据是动态加载的,所以我们就无法使用爬取静态页面的方式来抓取淘宝商品信息。这里我使用了自动化测试工具selenium来爬取动态页面的商品信息。这里有几个需要注意的地方,因为淘宝首页打开首先是二维码登录界面,所以为了直接通过程序实现登录,我们要利用指令

find_element_by_id('J_Quick2Static').click()
去点击右上角的小电脑图标切换到账号密码登录界面,这样我们就可以实现通过传递账号密码实现自动登录。
使用python + selenium爬取淘宝商品信息_第1张图片

在爬取的时候需要注意的是,有些商品信息,只有在下拉滑动条的时候才会自动加载,而且要注意下拉的长度,否则加载的数据是不完整的,这就导致有些数据爬取不到。这里我采用的方法是:输入商品名称点击搜索之后跳转到商品信息列表界面,之后加入下拉滑动块的代码

    js="var q=document.documentElement.scrollTop=1000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=2000"
    firefox_login.execute_script(js) 
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=3000"
    firefox_login.execute_script(js) 
    time.sleep(2)  
    js="var q=document.documentElement.scrollTop=4000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=5000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=6000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=7000"
    firefox_login.execute_script(js)
    time.sleep(2)
这里要注意不能一次性下拉到底部,否则中间的商品信息不会加载,之后一点点下拉才华加载全部的数据,等到数据全部加成完成后,我们在获取网页源码然后利用beautifulSoup进行解析以及搜索节点

使用python + selenium爬取淘宝商品信息_第2张图片

from selenium import webdriver
from bs4 import BeautifulSoup
import random 
import re
import time
import mysql.connector
import xlwt
#初始化火狐浏览器
def init(url):
    firefox_login=webdriver.Firefox()
    firefox_login.get(url)
    firefox_login.maximize_window()
    return firefox_login
# 登录淘宝并进行商品搜索  
def login(firefox_login):
    firefox_login.find_element_by_id('J_Quick2Static').click()
    firefox_login.find_element_by_id('TPL_username_1').clear()
    firefox_login.find_element_by_id('TPL_username_1').send_keys(u'账户')
    firefox_login.find_element_by_id('TPL_password_1').clear()
    firefox_login.find_element_by_id('TPL_password_1').send_keys(u'密码')
    a=firefox_login.find_element_by_id('J_SubmitStatic')   
    a.click()
    time.sleep(random.randint(6,8))
    firefox_login.find_element_by_id('q').clear()
    firefox_login.find_element_by_id('q').send_keys(u'魅族mx6')   
    firefox_login.find_element_by_class_name("btn-search").click() 
    time.sleep(random.randint(5,8))
    firefox_login.find_element_by_xpath('//a[@traceidx="0"]').click() 
    """
    time.sleep(10)
    js="var q=document.documentElement.scrollTop=10000"
    firefox_login.execute_script(js)
    time.sleep(10)
    b=firefox_login.find_element_by_xpath('//a[@data-index="2"]')
    b.click()
    """
    return firefox_login
#得到总的页面数目    
def get_pageNum(firefox_login):
    data=firefox_login.page_source
    soup=BeautifulSoup(data,'lxml')
    comments=soup.find("div", class_="total")  #匹配总的页数
    pattern=re.compile(r'[0-9]+')
    pageNum=re.search(pattern,comments.text).group(0)  # 将数字页数提取
    pageNum=int(pageNum)
    return pageNum     #用于循环的次数设置
#获取每个页面的商品信息
def ObtainHtml(firefox_login):  
    js="var q=document.documentElement.scrollTop=1000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=2000"
    firefox_login.execute_script(js) 
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=3000"
    firefox_login.execute_script(js) 
    time.sleep(2)  
    js="var q=document.documentElement.scrollTop=4000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=5000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=6000"
    firefox_login.execute_script(js)
    time.sleep(2)
    js="var q=document.documentElement.scrollTop=7000"
    firefox_login.execute_script(js)
    time.sleep(2)
    data=firefox_login.page_source
    soup = BeautifulSoup(data,'lxml') 
    comment=soup.find_all("div", class_="item g-clearfix")
    j=0
    for i in  comment:
        j+=1
        print(j)
        temp=[]
        Item=i.find("a",class_="J_U2IStat")  #商品详情页链接
        if Item:
            temp.append(Item.get('href'))
        shop=i.find("a",class_="shopname")
        if shop:        
            temp.append(shop.text)    #店铺名称
        address=i.find('div',class_='location') 
        if address:        
            temp.append(address.text.strip())   #店铺所在地
        priceandnum=i.find("div",class_="price-row")
        if priceandnum:        
            Y=priceandnum.find('span',class_='price g_price g_price-highlight')
            if Y:        
                temp.append(Y.text.strip(''.strip('').strip('').strip('').strip())) #商品价格
        Num=i.find('p',class_='col deal-cnt')
        if Num:        
            temp.append(Num.text.strip())   #购买人数
        print(temp)
        Infolist.append(temp)
            
# 点击下一页 //更新数据。   
def NextPage(firefox_login):
    firefox_login.find_element_by_xpath('//a[@trace="srp_bottom_pagedown"]').click()  #点击下一页ajax刷新数据
    

#数据库连接函数    
def connDB():
    conn=mysql.connector.connect(user='root',passwd='123456',database='review',charset='utf8')
    cursor=conn.cursor()
    return(conn,cursor)

#关闭数据库连接
def exitConn(conn,cursor):
    cursor.close()
    conn.close()
    
#将爬取的内容保存到数据库
def SaveMySql(datalist):
    conn,cursor=connDB()
    cursor.execute('create table taoBao_mx6\
    (prod_url varchar(100),\
     store varchar(20),\
     location varchar(10),\
     price varchar(10),\
     buyer_Num varchar(10))')
     
    for i in range(0,len(Infolist)):
        data=datalist[i]
        print('insert into taoBao_mx6 values\
         (%s,%s,%s,%s,%s)',[data[0],data[1],data[2],data[3],data[4]])
        cursor.execute('insert into taoBao_mx6 values\
         (%s,%s,%s,%s,%s)',[data[0],data[1],data[2],data[3],data[4]])
        conn.commit()
    exitConn(conn,cursor)
 
#保存成excel格式的文件
def saveData(datalist,savepath):
    book=xlwt.Workbook(encoding='utf-8',style_compression=0)
    sheet=book.add_sheet(u'魅族mx6',cell_overwrite_ok=True)
    col=[u'链接',u'店名',u'地点',u'价格',u'购买人数']
    for i in range(0,5):
        sheet.write(0,i,col[i])
    for i in range(len(Infolist)):
        data=datalist[i]
        for j in range(5):
            sheet.write(i+1,j,data[j])
    book.save(savepath)

if __name__=='__main__':
    Infolist=[]
    url='https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F'
    firefox_login=init(url)
    firefox_login=login(firefox_login)
    time.sleep(random.randint(5,6))
    Num=get_pageNum(firefox_login)
    print(Num)
    for i in range(Num-1):
        ObtainHtml(firefox_login)
        time.sleep(random.randint(2,3))
        NextPage(firefox_login)
    print("信息爬取完成")
    SaveMySql(Infolist)
    savepath='魅族mx6.xls'
    saveData(Infolist,savepath)
    firefox_login.quit()


你可能感兴趣的:(python)