前言
純粹學習一下爬蟲,以後拿數據之類的保不準真的要用到,本篇聊作學習記錄。
1、網頁url查看
現在的網頁都是異步傳輸的網頁了,就是說地址欄的網址不變的情況下刷新網頁的一部分內容
所以從地址欄網址上根本看不出異步響應傳輸的信息,因此需要使用瀏覽器查看響應信息
以chrome爲例:
第一步:打開需要爬的網頁,按F12或者空白處右鍵,檢查
第二步:打開的檢查窗口最上方的NetWork標籤
第三步:在網頁上點擊異步響應的操作,比如選擇框選擇、按鈕重新第點按等
第四步:查看檢查窗口Network下左下方的Name,點擊最新的響應文件,查看RequestURL就可以看到每次異步操作的url了
第五步:根據異步響應的url判斷需要修改的參數是哪些
例如我在http://tianqi.2345.com/wea_history/59287.htm 重新選擇月份,獲得每個月的歷史天氣,根據三次響應的URL可以判斷年份和月份的位置
2、網站數據獲取與存儲
直接上代碼吧,話不多說,都在註釋裏面了:
import requests
import xlwt
from bs4 import BeautifulSoup as bs
# 實際得到的表格內部內容有一些多餘的要去除
def tagString(str):
return str.get_text().strip().split("<")[0]
def get_tag(year, month):
"""
requests使用:
requests.get(url)獲取網址信息
response.content獲取二進制數據,response.text獲取自動解碼數據
但是自動解碼使用的方法可能無法得到正確的信息,因此採用對content的手動解碼
response.content.decode('解碼方法') 直接使用utf8會出現某些信息還是unicode編碼格式,unicode_escape可以避免這種錯誤
使用beautifulSoup獲取html頁面的信息,html.parser方法無需額外的語言庫,lxml方法需要額外的c語言庫
beautifulSoup常用方法:
soup.th:獲取的數據是bs4.element.Tag對象
soup.span.attrs:獲取的數據是span的屬性,比如id、class、style等,爲字典類型
soup.find_all(th):獲取到的數據是bs4.element.ResultSet對象,類似於list
soup.find_all(th)[0].get_text():其中get_text()方法獲取標籤內部的文字,信息如果出現亂碼之類的還要自行處理一下
"""
# 獲取網頁內容
response = requests.get(
"http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=59287&areaInfo%5BareaType%5D=2&date%5Byear%5D=" + year + "&date%5Bmonth%5D=" + month)
soup = bs(response.content.decode("unicode_escape"), "html.parser")
# 正則表達式常用方法:
# 只獲得單一標籤數據的時候,也可以使用正則表達式
# 正則表達式有很多教程,我這裏只寫一個 .* 指的是中間可以爲任意
# 例如:reg = r'<td>.*</td>',可以找到所有<td></td>標籤的內容,但是同時會帶有<td>標籤,後續仍需處理
# condition = re.compile(reg)
# textlist = re.findall(condition, theContent)
tr = soup.find("table").find_all("tr") # 獲得table中的所有記錄行,th是字段行,tr是記錄行
trlist = []
for j in tr:
td = j.find_all("td") # 獲得一個tr中的所有td,學過前端的應該很好理解
date = tagString(td[0])
temp = tagString(td[1])
weather = tagString(td[2])
wind = tagString(td[3])
air = tagString(td[4])
trlist.append([date, temp, weather, wind, air])
return trlist
if __name__ == "__main__":
"""
xlwt 三步走:
先workbook建立文件,後add_sheet建立工作簿
sheet.write(行,列,label=內容)
workbook.save("文件名稱.xls")保存文件
"""
# 建立excel文件
wb = xlwt.Workbook(encoding="utf-8")
sheet1 = wb.add_sheet("sheet1")
data = [["時間", "氣溫", "天氣", "風力", "空氣質量"]] # 這裏是寫入excel的字段名稱,放在第一行
# 獲取2018年到2020年5月份的廣州的天氣數據
for year in range(2018, 2021): # 左閉區間[2018,2021)
maxMonth = (13 if year < 2020 else 6)
for month in range(1, maxMonth):
print(year, month)
data += get_tag(str(year), str(month))
# 寫入excel,注意保存爲xls
col = len(data[0])
row = len(data)
for i in range(row):
for j in range(col):
sheet1.write(i, j, label=data[i][j])
wb.save("天氣.xls")
參考:
爬蟲學習:https://blog.csdn.net/weixin_43488742/article/details/90742453
beautifulSoup介紹:http://www.jsphp.net/python/show-24-214-1.html