1. 程式人生 > >python+selenium——爬取網站

python+selenium——爬取網站

#coding:utf-8
import re
import xlrd  
import xlwt  
import time
import pandas as pds
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser=webdriver.Chrome()  #驅動谷歌瀏覽器

#讀取excel
def excel(fname):
          data=pds.read_excel(fname)
          return data
        
#進入網站                
def go_url(url):
    wait=WebDriverWait(browser,3)
    try:
                browser.get(url)
                wait.until(
                      EC.presence_of_element_located((By.XPATH,'//div[@class="places-tab margin20"]//table')),
                  )
    except TimeoutException:
                print('Timeout')

#定位節點——點選
def click_locatin_element(element , text):
     try:
                button=browser.find_element_by_xpath(element)
                button.click()
     except:
                print(text+"不可點選")    
                
#根據文字——點選                
def click_according_text(text):
    try:
                button=browser.find_element_by_link_text(text)
                button.click()
    except:
                print(text+'不可點選')
                
#下拉+內容——點選
def pull_down_menu(down_element ,error_text1, text):
    click_locatin_element(down_element , error_text1)
    click_according_text(text)
        
#獲取url中的表並寫入檔案
def write_table_data(url):
    try:
        data =pds.read_html(url)[0]
        data.to_csv('C:/Users/Administrator/Desktop/一批文分數線.csv', sep=',', mode='a',index = False, )
    except:
        print('無資料')
                
#獲取當前網頁的url                
def get_current_url():
    url = browser.current_url
    print(url)
    return url
            
#獲取url中的表並寫入檔案
def write_school(i , school):
        writeschool=pds.DataFrame([[i,school]])
        writeschool.to_csv('C:/Users/Administrator/Desktop/一批文分數線.csv', sep=',', mode='a',index = False,header = False)

#計算執行時間的裝飾器
def my_time(func):
    def wrapper():
        s_time = time.time()  #程式初始時間
        func()
        e_time = time.time()#程式執行完的時間
        print('totally cost :{:.2f}'.format(e_time-s_time)+'秒')  #獲取總時間
    return wrapper        

@my_time   #裝飾器
def  total():
    data=excel("C:/Users/Administrator/Desktop/pandas.xls")  #讀資料
    nrow=data.shape[0]   #獲取資料的行數
    for i in range(0,nrow):
        url=data.values[i][1]
        school=data.values[i][0]
        print("正在爬取第"+str(i)+"個學校")
        write_school(i ,school)  #寫入學校
        go_url(url)  #進入初始網頁
        if (i ==0):         #第一次進入網頁要點選“湖北”
            click_locatin_element('//div[@class="citybox clearfix"]//div[@province_code="42"]' ,'湖北') #點選湖北
        pull_down_menu('//div[@class="li-selectDiv right"]//div[@id="schoolexamieetype"]' , '下拉框' , '文科') #點選文科所在的下拉框
        url=get_current_url() #獲取當前網頁的url
        write_table_data(url)  #獲取url中的表並寫入檔案
    browser.close()    #關閉瀏覽器

if __name__ == '__main__':    
    total()

爬取結果:
在這裡插入圖片描述

附:
在這裡插入圖片描述

在這裡插入圖片描述
當定位其中的“任務型別”的li 標籤時,這樣寫:.//li[text()=‘任務型別:’]

如果想使用contains(可以只指定部分包含的資訊):.//li[contains(text(),‘任務類’)]

當定位其中的“任務型別”的li 標籤時,這樣寫:.//li[text()=‘任務型別:’]

如果想使用contains(可以只指定部分包含的資訊):.//li[contains(text(),‘任務類’)]

這裡客串一下:.//li[starts-with(text(),‘任務類’)]、.//li[strats-with(.,‘任務類’)]

看起來很完美,就這麼簡單?並不是!,如下:
在這裡插入圖片描述


試試定位“單次預約任務§”的li 標籤,發現上面的方法失效了!

那改怎麼辦?不急,說他最好用,那就當然有辦法,look:.//li[contains(.,‘單次預約’)]

perfect!