Py / Python網頁資料擷取與分析班-筆記 9/27

主要內容

_動態抓取樂透雲的所有頁面資料

_抓取台北測站的資料


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()