主要內容
_動態抓取樂透雲的所有頁面資料
_抓取台北測站的資料
1.動態抓取樂透雲的所有頁面資料
先抓取所有的a標籤
然後透過if判斷,是第幾個a標籤文字為”最末頁”
利用get(“href”)取得超連結路徑
因為樂透雲的網址是indexpage=頁數
所以再利用正則表達式的findall()取出字串中的數字
符合規則的資料會存成陣列型態資料,因為只會有1筆,所以用[0]取出
取出來的頁數等於是目前所有的頁數
因此之後的迴圈長度就是這個頁數
要注意的是這個頁數是字串型態
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import requests from bs4 import BeautifulSoup import re #取得所有的連結 抓出最後一頁的頁數 url = "https://www.lotto-8.com/listltobigbbk.asp?indexpage=1&orderby=new" html = requests.get(url) html.encoding = html.apparent_encoding #https://stackoverflow.com/questions/66987294/unable-to-encode-unicode-beautiful-soup-python #sp = BeautifulSoup(html.content, "html.parser") sp = BeautifulSoup(html.text, "html.parser") aUrl = sp.find_all("a") page="" url="" for i in range(len(aUrl)): print(aUrl[i].text) if aUrl[i].text == "最末頁": #print(i) #print(aUrl[i].get("href")) #listltobigbbk.asp?indexpage=68&orderby=new #print(re.findall(r"\d+", aUrl[i].get("href")))#https://iter01.com/485672.html 取出字串中的數字 url = aUrl[i].get("href") page =re.findall(r"\d+", url)[0] #print(url) #print(page) #print(type(page)) # <class 'str'> #爬取資料 寫入excel檔 colum=["日期",1,2,3,4,5,6,"特別號","備註"] index=[] data=[] j=1 for p in range(1,int(page)): #取出所有頁面 url = "https://www.lotto-8.com/listltobigbbk.asp?indexpage="+str(p)+"&orderby=new" html = requests.get(url) html.encoding="utf-8" sp = BeautifulSoup(html.text, "html.parser") sp1=sp.find("table","auto-style4") sp2=sp1.find_all("tr") #print(sp2[5].text.replace("\xa0","")) for i in range(1,len(sp2)): sp3=sp2[i].find_all("td") d1=sp3[0].text d2=sp3[1].text.replace("\xa0","") d3=sp3[2].text d4=sp3[3].text # print(d2) d2Array = d2.split(",") # print(d2Array) d2Array= list(map(int, d2Array)) data.append([d1,d2Array[0],d2Array[1],d2Array[2],d2Array[3],d2Array[4],d2Array[5],int(d3),d4]) index.append(j) j+=1 #print(data) # s +="{},{},{}\n".format(d1,d2,d3) # for i in range(4,len(sp2),4): # s +="{},{},{}\n".format(sp2[i].text,sp2[i+1].text.replace("\xa0",""),sp2[i+2].text) # print(s) # f=open("0920-22.csv","w") # f.write(s) # f.close() print(data) import pandas as pd df=pd.DataFrame(data,index,colum) df.to_excel("0920-24.xlsx") |
備註:
Python正規表示式匹配字串中的數字
2.抓取台北測站的資料
使用selenium控制Chrome模擬點取網頁資料
取得網站動態回傳的資料
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import time driver = webdriver.Chrome(r"chromedriver\chromedriver.exe") driver.get("http://e-service.cwb.gov.tw/HistoryDataQuery/index.jsp") time.sleep(3) driver.find_element(By.ID,"station").click() #Select(driver.find_element("id","station")).select_by_visible_text("臺北 (TAIPEI)") Select(driver.find_element(By.ID,"station")).select_by_visible_text("臺北 (TAIPEI)") driver.find_element(By.ID,"station").click() time.sleep(1) #**將資料存檔 html = driver.page_source sp = BeautifulSoup(html, "html.parser") sp1=sp.find_all("table") # 抓取第二個table標籤的所有td標籤資料 sp2=sp1[1].find_all("td") for i in range(len(sp2)): print(sp2[i].text) driver.close() |