python /selenium /动态网页 /爬虫

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

[python]  view plain  copy
  1. find_element_by_id('J_Quick2Static').click()  
去点击右上角的小电脑图标切换到账号密码登录界面,这样我们就可以实现通过传递账号密码实现自动登录。

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

[python]  view plain  copy
  1.     js="var q=document.documentElement.scrollTop=1000"  
  2.     firefox_login.execute_script(js)  
  3.     time.sleep(2)  
  4.     js="var q=document.documentElement.scrollTop=2000"  
  5.     firefox_login.execute_script(js)   
  6.     time.sleep(2)  
  7.     js="var q=document.documentElement.scrollTop=3000"  
  8.     firefox_login.execute_script(js)   
  9.     time.sleep(2)    
  10.     js="var q=document.documentElement.scrollTop=4000"  
  11.     firefox_login.execute_script(js)  
  12.     time.sleep(2)  
  13.     js="var q=document.documentElement.scrollTop=5000"  
  14.     firefox_login.execute_script(js)  
  15.     time.sleep(2)  
  16.     js="var q=document.documentElement.scrollTop=6000"  
  17.     firefox_login.execute_script(js)  
  18.     time.sleep(2)  
  19.     js="var q=document.documentElement.scrollTop=7000"  
  20.     firefox_login.execute_script(js)  
  21.     time.sleep(2)  
这里要注意不能一次性下拉到底部,否则中间的商品信息不会加载,之后一点点下拉才华加载全部的数据,等到数据全部加成完成后,我们在获取网页源码然后利用beautifulSoup进行解析以及搜索节点

[python]  view plain  copy
  1. from selenium import webdriver  
  2. from bs4 import BeautifulSoup  
  3. import random   
  4. import re  
  5. import time  
  6. import mysql.connector  
  7. import xlwt  
[python]  view plain  copy
  1. #初始化火狐浏览器  
  2. def init(url):  
  3.     firefox_login=webdriver.Firefox()  
  4.     firefox_login.get(url)  
  5.     firefox_login.maximize_window()  
  6.     return firefox_login  
  7. # 登录淘宝并进行商品搜索    
  8. def login(firefox_login):  
  9.     firefox_login.find_element_by_id('J_Quick2Static').click()  
  10.     firefox_login.find_element_by_id('TPL_username_1').clear()  
  11.     firefox_login.find_element_by_id('TPL_username_1').send_keys(u'账户')  
  12.     firefox_login.find_element_by_id('TPL_password_1').clear()  
  13.     firefox_login.find_element_by_id('TPL_password_1').send_keys(u'密码')  
  14.     a=firefox_login.find_element_by_id('J_SubmitStatic')     
  15.     a.click()  
  16.     time.sleep(random.randint(6,8))  
  17.     firefox_login.find_element_by_id('q').clear()  
  18.     firefox_login.find_element_by_id('q').send_keys(u'魅族mx6')     
  19.     firefox_login.find_element_by_class_name("btn-search").click()   
  20.     time.sleep(random.randint(5,8))  
  21.     firefox_login.find_element_by_xpath('//a[@traceidx="0"]').click()   
  22.     """ 
  23.     time.sleep(10) 
  24.     js="var q=document.documentElement.scrollTop=10000" 
  25.     firefox_login.execute_script(js) 
  26.     time.sleep(10) 
  27.     b=firefox_login.find_element_by_xpath('//a[@data-index="2"]') 
  28.     b.click() 
  29.     """  
  30.     return firefox_login  
  31. #得到总的页面数目      
  32. def get_pageNum(firefox_login):  
  33.     data=firefox_login.page_source  
  34.     soup=BeautifulSoup(data,'lxml')  
  35.     comments=soup.find("div"class_="total")  #匹配总的页数  
  36.     pattern=re.compile(r'[0-9]+')  
  37.     pageNum=re.search(pattern,comments.text).group(0)  # 将数字页数提取  
  38.     pageNum=int(pageNum)  
  39.     return pageNum     #用于循环的次数设置  
  40. #获取每个页面的商品信息  
  41. def ObtainHtml(firefox_login):    
  42.     js="var q=document.documentElement.scrollTop=1000"  
  43.     firefox_login.execute_script(js)  
  44.     time.sleep(2)  
  45.     js="var q=document.documentElement.scrollTop=2000"  
  46.     firefox_login.execute_script(js)   
  47.     time.sleep(2)  
  48.     js="var q=document.documentElement.scrollTop=3000"  
  49.     firefox_login.execute_script(js)   
  50.     time.sleep(2)    
  51.     js="var q=document.documentElement.scrollTop=4000"  
  52.     firefox_login.execute_script(js)  
  53.     time.sleep(2)  
  54.     js="var q=document.documentElement.scrollTop=5000"  
  55.     firefox_login.execute_script(js)  
  56.     time.sleep(2)  
  57.     js="var q=document.documentElement.scrollTop=6000"  
  58.     firefox_login.execute_script(js)  
  59.     time.sleep(2)  
  60.     js="var q=document.documentElement.scrollTop=7000"  
  61.     firefox_login.execute_script(js)  
  62.     time.sleep(2)  
  63.     data=firefox_login.page_source  
  64.     soup = BeautifulSoup(data,'lxml')   
  65.     comment=soup.find_all("div"class_="item g-clearfix")  
  66.     j=0  
  67.     for i in  comment:  
  68.         j+=1  
  69.         print(j)  
  70.         temp=[]  
  71.         Item=i.find("a",class_="J_U2IStat")  #商品详情页链接  
  72.         if Item:  
  73.             temp.append(Item.get('href'))  
  74.         shop=i.find("a",class_="shopname")  
  75.         if shop:          
  76.             temp.append(shop.text)    #店铺名称  
  77.         address=i.find('div',class_='location')   
  78.         if address:          
  79.             temp.append(address.text.strip())   #店铺所在地  
  80.         priceandnum=i.find("div",class_="price-row")  
  81.         if priceandnum:          
  82.             Y=priceandnum.find('span',class_='price g_price g_price-highlight')  
  83.             if Y:          
  84.                 temp.append(Y.text.strip('<span>'.strip('</span>').strip('<strong>').strip('</strong>').strip())) #商品价格  
  85.         Num=i.find('p',class_='col deal-cnt')  
  86.         if Num:          
  87.             temp.append(Num.text.strip())   #购买人数  
  88.         print(temp)  
  89.         Infolist.append(temp)  
  90.               
  91. # 点击下一页 //更新数据。     
  92. def NextPage(firefox_login):  
  93.     firefox_login.find_element_by_xpath('//a[@trace="srp_bottom_pagedown"]').click()  #点击下一页ajax刷新数据  
  94.       
  95.   
  96. #数据库连接函数      
  97. def connDB():  
  98.     conn=mysql.connector.connect(user='root',passwd='123456',database='review',charset='utf8')  
  99.     cursor=conn.cursor()  
  100.     return(conn,cursor)  
  101.   
  102. #关闭数据库连接  
  103. def exitConn(conn,cursor):  
  104.     cursor.close()  
  105.     conn.close()  
  106.       
  107. #将爬取的内容保存到数据库  
  108. def SaveMySql(datalist):  
  109.     conn,cursor=connDB()  
  110.     cursor.execute('create table taoBao_mx6\  
  111.     (prod_url varchar(100),\  
  112.      store varchar(20),\  
  113.      location varchar(10),\  
  114.      price varchar(10),\  
  115.      buyer_Num varchar(10))')  
  116.        
  117.     for i in range(0,len(Infolist)):  
  118.         data=datalist[i]  
  119.         print('insert into taoBao_mx6 values\  
  120.          (%s,%s,%s,%s,%s)',[data[0],data[1],data[2],data[3],data[4]])  
  121.         cursor.execute('insert into taoBao_mx6 values\  
  122.          (%s,%s,%s,%s,%s)',[data[0],data[1],data[2],data[3],data[4]])  
  123.         conn.commit()  
  124.     exitConn(conn,cursor)  
  125.    
  126. #保存成excel格式的文件  
  127. def saveData(datalist,savepath):  
  128.     book=xlwt.Workbook(encoding='utf-8',style_compression=0)  
  129.     sheet=book.add_sheet(u'魅族mx6',cell_overwrite_ok=True)  
  130.     col=[u'链接',u'店名',u'地点',u'价格',u'购买人数']  
  131.     for i in range(0,5):  
  132.         sheet.write(0,i,col[i])  
  133.     for i in range(len(Infolist)):  
  134.         data=datalist[i]  
  135.         for j in range(5):  
  136.             sheet.write(i+1,j,data[j])  
  137.     book.save(savepath)  
  138.   
  139. if __name__=='__main__':  
  140.     Infolist=[]  
  141.     url='https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F'  
  142.     firefox_login=init(url)  
  143.     firefox_login=login(firefox_login)  
  144.     time.sleep(random.randint(5,6))  
  145.     Num=get_pageNum(firefox_login)  
  146.     print(Num)  
  147.     for i in range(Num-1):  
  148.         ObtainHtml(firefox_login)  
  149.         time.sleep(random.randint(2,3))  
  150.         NextPage(firefox_login)  
  151.     print("信息爬取完成")  
  152.     SaveMySql(Infolist)  
  153.     savepath='魅族mx6.xls'  
  154.     saveData(Infolist,savepath)  
  155.     firefox_login.quit()  

原创地址:http://blog.csdn.net/chenpe32cp/article/details/54232353

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值