你好,我是悅創(chuàng)。
很多同學(xué)一聽到 Python 或編程語言,可能條件反射就會(huì)覺得“很難”。但今天的 Python 課程是個(gè)例外,因?yàn)榻裉熘v的 **Python 技能,不需要你懂計(jì)算機(jī)原理,也不需要你理解復(fù)雜的編程模式。**即使是非開發(fā)人員,只要替換鏈接、文件,就可以輕松完成。
并且這些幾個(gè)實(shí)用技巧,簡(jiǎn)直是 Python 日常幫手的最佳實(shí)踐。比如:
爬取文檔,爬表格,爬學(xué)習(xí)資料;
玩轉(zhuǎn)圖表,生成數(shù)據(jù)可視化;
批量命名文件,實(shí)現(xiàn)自動(dòng)化辦公;
批量搞圖,加水印、調(diào)尺寸。
接下來,我們就逐一用 Python 實(shí)現(xiàn),其中我提供的代碼是萬能代碼,只用替換成你想爬的網(wǎng)頁(yè)鏈接、文件位置、照片就可以進(jìn)行處理了。
如果你沒有安裝 Python 及相關(guān)環(huán)境搭建,你可以參考我之前寫的文章:
數(shù)據(jù)分析的環(huán)境不會(huì)搭?看這里準(zhǔn)沒錯(cuò)!
Python3 網(wǎng)絡(luò)爬蟲系統(tǒng)一對(duì)一教學(xué)(環(huán)境安裝)
**Tips:**因?yàn)椴煌恼鹿?jié)的數(shù)據(jù)可能會(huì)交叉引用,所以建議你首先在桌面建立一個(gè)工作夾,然后每個(gè)章節(jié)都單獨(dú)建立一個(gè) Python 文件進(jìn)行實(shí)驗(yàn)。比如可以新建一個(gè) pytips 的目錄,然后在該目錄下,每個(gè)章節(jié)創(chuàng)建一個(gè) tips 文件夾,里面創(chuàng)建對(duì)應(yīng)的 .py 文件。(按你具體的來,我的文件夾也和這個(gè)不一樣)
1. 巧用 Python 爬蟲,實(shí)現(xiàn)財(cái)富自由
首先可以用 Python 來進(jìn)行爬蟲,什么是爬蟲?簡(jiǎn)單理解來說就是抓取網(wǎng)絡(luò)上的數(shù)據(jù)(文檔、資料、圖片等)。比如你考研可以爬文檔和學(xué)習(xí)資料,要網(wǎng)絡(luò)上的表格數(shù)據(jù)做分析,批量下載圖片等。
下面我們來看看如何一一實(shí)現(xiàn)。
1.1 爬取文檔、學(xué)習(xí)資料
首先,你得先確定你要爬的網(wǎng)站是什么?你要獲取的目的是什么?比如,小悅想爬青巖幫網(wǎng)站中的報(bào)考指南,所以他想搜集目前該網(wǎng)頁(yè)的所有文章的標(biāo)題和超鏈接,以方便后續(xù)瀏覽。
爬取網(wǎng)站的鏈接:https://zkaoy.com/sions/exam
目的:收集目前該網(wǎng)頁(yè)的所有文章的標(biāo)題和超鏈接
那使用 Python,可以參考以下兩步的代碼模板實(shí)現(xiàn)(提示:需要先安裝 Python 依賴:urllib3 bs4)。
安裝所需要的庫(kù):pip install urllib3 BeautifulSoup4
第一步,下載該網(wǎng)頁(yè)并保存為文件,代碼如下。
**PS:**這里,我為了清晰一些,拆成兩個(gè)代碼文件,后面我再來一個(gè)合并成一個(gè)代碼文件。# urllib3 的方法 # file_name:Crawler_urllib3.py import urllib3 def download_content(url): """ 第一個(gè)函數(shù),用來下載網(wǎng)頁(yè),返回網(wǎng)頁(yè)內(nèi)容 參數(shù) url 代表所要下載的網(wǎng)頁(yè)網(wǎng)址。 整體代碼和之前類似 """ http = urllib3.PoolManager() response = http.request("GET", url) response_data = response.data html_content = response_data.decode() return html_content # 第二個(gè)函數(shù),將字符串內(nèi)容保存到文件中 # 第一個(gè)參數(shù)為所要保存的文件名,第二個(gè)參數(shù)為要保存的字符串內(nèi)容的變量 def save_to_file(filename, content): fo = open(filename, "w", encoding="utf-8") fo.write(content) fo.close() def main(): # 下載報(bào)考指南的網(wǎng)頁(yè) url = "https://zkaoy.com/sions/exam" result = download_content(url) save_to_file("tips1.html", result) if __name__ == '__main__': main() # requests 代碼 # file_name:Crawler_requests.py import requests def download_content(url): """ 第一個(gè)函數(shù),用來下載網(wǎng)頁(yè),返回網(wǎng)頁(yè)內(nèi)容 參數(shù) url 代表所要下載的網(wǎng)頁(yè)網(wǎng)址。 整體代碼和之前類似 """ response = requests.get(url).text return response # 第二個(gè)函數(shù),將字符串內(nèi)容保存到文件中 # 第一個(gè)參數(shù)為所要保存的文件名,第二個(gè)參數(shù)為要保存的字符串內(nèi)容的變量 def save_to_file(filename, content): with open(filename, mode="w", encoding="utf-8") as f: f.write(content) def main(): # 下載報(bào)考指南的網(wǎng)頁(yè) url = "https://zkaoy.com/sions/exam" result = download_content(url) save_to_file("tips1.html", result) if __name__ == '__main__': main()
第二步,解析網(wǎng)頁(yè),并提取出文章的鏈接和標(biāo)題。# file_name:html_parse.py # 解析方法一 from bs4 import BeautifulSoup # 輸入?yún)?shù)為要分析的 html 文件名,返回值為對(duì)應(yīng)的 BeautifulSoup 對(duì)象 def create_doc_from_filename(filename): with open(filename, "r", encoding='utf-8') as f: html_content = f.read() doc = BeautifulSoup(html_content) return doc def parse(doc): post_list = doc.find_all("div", class_="post-info") for post in post_list: link = post.find_all("a")[1] print(link.text.strip()) print(link["href"]) def main(): filename = "tips1.html" doc = create_doc_from_filename(filename) parse(doc) if __name__ == '__main__': main() # file_name:html_parse_lxml.py # 解析方法二,指定解析器 from bs4 import BeautifulSoup # 輸入?yún)?shù)為要分析的 html 文件名,返回值為對(duì)應(yīng)的 BeautifulSoup 對(duì)象 def create_doc_from_filename(filename): with open(filename, "r", encoding='utf-8') as f: html_content = f.read() soup = BeautifulSoup(html_content, "lxml") return soup def parse(soup): post_list = soup.find_all("div", class_="post-info") for post in post_list: link = post.find_all("a")[1] print(link.text.strip()) print(link["href"]) def main(): filename = "tips1.html" soup = create_doc_from_filename(filename) parse(soup) if __name__ == '__main__': main()
**PS:**兩個(gè)代碼很像,只是差別在指定了解析器——lxml
執(zhí)行代碼之后,你就可以看到網(wǎng)頁(yè)中的標(biāo)題和鏈接已經(jīng)被打印到了屏幕上。敲黑板!這些省份往屆生不能預(yù)報(bào)名! https://zkaoy.com/15123.html 二戰(zhàn)必須回戶籍所在地考嗎? https://zkaoy.com/15103.html 這些同學(xué)不能參加預(yù)報(bào)名!不注意,有可能考研報(bào)名失?。?https://zkaoy.com/15093.html 嗚呼~考研報(bào)名費(fèi),這種情況可以退款! https://zkaoy.com/15035.html 注意:又發(fā)通知!22研招有4點(diǎn)變化?? https://zkaoy.com/14977.html 2021考研初試時(shí)間定了!正式網(wǎng)報(bào)時(shí)間有變化 https://zkaoy.com/14915.html 快碼住!考研前的這些關(guān)鍵時(shí)間點(diǎn),千萬不能錯(cuò)過! https://zkaoy.com/14841.html 近萬名考生考研報(bào)名失敗!問題出在這!22考研一定注意! https://zkaoy.com/14822.html 往屆生比應(yīng)屆生更容易上岸,你認(rèn)同嗎? https://zkaoy.com/14670.html 各省市考研報(bào)名費(fèi)用! https://zkaoy.com/14643.html 要開始報(bào)名了?現(xiàn)在不需要擔(dān)心,沒你想的那么復(fù)雜…… https://zkaoy.com/14620.html 教育部公布重要數(shù)據(jù):研究生擴(kuò)招20.74%! https://zkaoy.com/14593.html 虛假招生?這一高校臨近開學(xué)取消獎(jiǎng)學(xué)金! https://zkaoy.com/14494.html 下個(gè)月要預(yù)報(bào)名了,高頻問題早知道 https://zkaoy.com/14399.html 注意!這些網(wǎng)報(bào)信息要準(zhǔn)備好,否則影響9月考研報(bào)名! https://zkaoy.com/14352.html 想考上研,各科應(yīng)該考多少分? https://zkaoy.com/14273.html 選擇報(bào)考點(diǎn)需要注意什么?報(bào)考點(diǎn)有限制! https://zkaoy.com/14161.html 各地考研報(bào)名費(fèi)匯總!快來看看你要交多少錢! https://zkaoy.com/14158.html 考研高校推免人數(shù)公布,統(tǒng)考名額還剩多少? https://zkaoy.com/14092.html 這幾所高校考研參考書有變!參考書目要怎么搜集? https://zkaoy.com/14061.html 院校指南 https://zkaoy.com/sions/zxgg1 這些要提前準(zhǔn)備好!不然影響報(bào)名! https://zkaoy.com/13958.html 救命!近萬人因?yàn)檫@個(gè),錯(cuò)失考研機(jī)會(huì)! https://zkaoy.com/13925.html 考研如何看招生簡(jiǎn)章和招生目錄? https://zkaoy.com/13924.html
上面,我是拆開了,現(xiàn)在合并成一個(gè)代碼文件即可:# file_name:Crawler.py import requests from bs4 import BeautifulSoup def download_content(url): """ 第一個(gè)函數(shù),用來下載網(wǎng)頁(yè),返回網(wǎng)頁(yè)內(nèi)容 參數(shù) url 代表所要下載的網(wǎng)頁(yè)網(wǎng)址。 整體代碼和之前類似 """ response = requests.get(url).text return response # 第二個(gè)函數(shù),將字符串內(nèi)容保存到文件中 # 第一個(gè)參數(shù)為所要保存的文件名,第二個(gè)參數(shù)為要保存的字符串內(nèi)容的變量 def save_to_file(filename, content): with open(filename, mode="w", encoding="utf-8") as f: f.write(content) def create_doc_from_filename(filename): # 輸入?yún)?shù)為要分析的 html 文件名,返回值為對(duì)應(yīng)的 BeautifulSoup 對(duì)象 with open(filename, "r", encoding='utf-8') as f: html_content = f.read() soup = BeautifulSoup(html_content, "lxml") return soup def parse(soup): post_list = soup.find_all("div", class_="post-info") for post in post_list: link = post.find_all("a")[1] print(link.text.strip()) print(link["href"]) def main(): # 下載報(bào)考指南的網(wǎng)頁(yè) url = "https://zkaoy.com/sions/exam" filename = "tips1.html" result = download_content(url) save_to_file(filename, result) soup = create_doc_from_filename(filename) parse(soup) if __name__ == '__main__': main()
代碼文件:[https://github.com/AndersonHJB/AIYC_DATA/tree/main/01-Python 萬能代碼模版:10 大必學(xué)實(shí)用技巧/1.1 巧用 Python 爬蟲,實(shí)現(xiàn)財(cái)富自由](https://github.com/AndersonHJB/AIYC_DATA/tree/main/01-Python 萬能代碼模版:10 大必學(xué)實(shí)用技巧/1.1 巧用 Python 爬蟲,實(shí)現(xiàn)財(cái)富自由)
那如果你想爬取其他網(wǎng)頁(yè)如何替換呢?你只需替換幾處即可,如下圖所示。
替換為想要下載的網(wǎng)頁(yè)地址
替換為網(wǎng)頁(yè)保存的文件名
是 BeautifulSoup 函數(shù),我們用它一步步從 html 的結(jié)構(gòu)中解析出我們想要的內(nèi)容,這里我們實(shí)現(xiàn)的是首先找到所有 class 屬性是 post-info 的 div 標(biāo)簽,然后將這些標(biāo)簽中的 a 標(biāo)簽的文本部分提取出來。如果你解析的網(wǎng)頁(yè)結(jié)構(gòu)和這個(gè)不同,具體 BeautifulSoup 的用法可以參考我們這節(jié)課程 https://www.aiyc.top/673.html#六、Requests_與_BeautifulSoup_庫(kù)的基礎(chǔ)操作。
1.2 抓取表格,做數(shù)據(jù)分析
我們?nèi)粘T谏暇W(wǎng)的時(shí)候,往往都會(huì)看到一些有用的表格,都希望保存下來日后使用,但直接復(fù)制到 Excel 往往都很容易發(fā)生變形,或者亂碼,或者格式錯(cuò)亂等種種問題,借助 Python 可以輕松實(shí)現(xiàn)網(wǎng)頁(yè)中表格的保存。(提示:需要先安裝依賴: urllib3, pandas)pip install urllib3 pandas
以招行外匯頁(yè)面為例:
Python 代碼如下:# file_name: excel_crawler_urllib3.py import urllib3 import pandas as pd def download_content(url): # 創(chuàng)建一個(gè) PoolManager 對(duì)象,命名為 http http = urllib3.PoolManager() # 調(diào)用 http 對(duì)象的 request 方法,第一個(gè)參數(shù)傳一個(gè)字符串 "GET" # 第二個(gè)參數(shù)則是要下載的網(wǎng)址,也就是我們的 url 變量 # request 方法會(huì)返回一個(gè) HTTPResponse 類的對(duì)象,我們命名為 response response = http.request("GET", url) # 獲取 response 對(duì)象的 data 屬性,存儲(chǔ)在變量 response_data 中 response_data = response.data # 調(diào)用 response_data 對(duì)象的 decode 方法,獲得網(wǎng)頁(yè)的內(nèi)容,存儲(chǔ)在 html_content # 變量中 html_content = response_data.decode() return html_content def save_excel(): html_content = download_content("http://fx.cmbchina.com/Hq/") # 調(diào)用 read_html 函數(shù),傳入網(wǎng)頁(yè)的內(nèi)容,并將結(jié)果存儲(chǔ)在 cmb_table_list 中 # read_html 函數(shù)返回的是一個(gè) DataFrame 的list cmb_table_list = pd.read_html(html_content) # 通過打印每個(gè) list 元素,確認(rèn)我們所需要的是第二個(gè),也就是下標(biāo) 1 cmb_table_list[1].to_excel("tips2.xlsx") def main(): save_excel() if __name__ == '__main__': main() # file_name: excel_crawler_requests.py import requests import pandas as pd from requests.exceptions import RequestException def download_content(url): try: response = requests.get(url) if response.status_code == 200: return response.text else: return "None" except RequestException as e: return e def save_excel(filename): html_content = download_content("http://fx.cmbchina.com/Hq/") # 調(diào)用 read_html 函數(shù),傳入網(wǎng)頁(yè)的內(nèi)容,并將結(jié)果存儲(chǔ)在 cmb_table_list 中 # read_html 函數(shù)返回的是一個(gè) DataFrame 的list cmb_table_list = pd.read_html(html_content) # 通過打印每個(gè) list 元素,確認(rèn)我們所需要的是第二個(gè),也就是下標(biāo) 1 # print(cmb_table_list) cmb_table_list[1].to_excel(filename) def main(): filename = "tips2.xlsx" save_excel(filename) if __name__ == '__main__': main()
下圖為了輔助理解:
執(zhí)行之后,會(huì)在代碼文件所在的目錄生成 tips2.xlsx 的 excel 文件,打開之后如下圖所示。
當(dāng)你希望抓取自己的表格時(shí),替換下面 3 個(gè)部分即可。
修改你要保存的 excel 文件名稱;
替換為想要抓取表格所在網(wǎng)頁(yè)的網(wǎng)址;
替換為表格的序號(hào),比如想要抓取網(wǎng)頁(yè)中的第幾個(gè)表格;
代碼鏈接:https://github.com/AndersonHJB/AIYC_DATA/tree/main/01-Python%20萬能代碼模版:10%20大必學(xué)實(shí)用技巧/1.2%20抓取表格,做數(shù)據(jù)分析
1.3 批量下載圖片
當(dāng)我們看到一個(gè)網(wǎng)頁(yè)上有很多喜歡的圖片時(shí),一張一張保存效率比較低。
通過 Python 我們也可以實(shí)現(xiàn)快速的圖片下載。以堆糖網(wǎng)為例,我們看到了這個(gè)網(wǎng)頁(yè)。
感覺很好看,希望能夠把所有圖片下載下來,方案大體和 1 是一樣的。
我們首先下載網(wǎng)頁(yè),然后分析其中的 img 標(biāo)簽,然后把圖片下載下載來。首先我們?cè)诠ぷ髂夸浗⒁粋€(gè)文件夾 tips_3 用來放下載的圖片。
首先還是下載網(wǎng)頁(yè),Python 代碼如下。# -*- coding: utf-8 -*- # @Author: # @Date: 2021-09-13 20:16:07 # @Last Modified by: aiyc # @Last Modified time: 2021-09-13 21:02:58 import urllib3 # 第一個(gè)函數(shù),用來下載網(wǎng)頁(yè),返回網(wǎng)頁(yè)內(nèi)容 # 參數(shù) url 代表所要下載的網(wǎng)頁(yè)網(wǎng)址。 # 整體代碼和之前類似 def download_content(url): http = urllib3.PoolManager() response = http.request("GET", url) response_data = response.data html_content = response_data.decode() return html_content # 第二個(gè)函數(shù),將字符串內(nèi)容保存到文件中 # 第一個(gè)參數(shù)為所要保存的文件名,第二個(gè)參數(shù)為要保存的字符串內(nèi)容的變量 def save_to_file(filename, content): fo = open(filename, "w", encoding="utf-8") fo.write(content) fo.close() url = "https://www.duitang.com/search/?kw=&type=feed" result = download_content(url) save_to_file("tips3.html", result)
然后是抽取 img 標(biāo)簽,下載圖片。from bs4 import BeautifulSoup from urllib.request import urlretrieve # 輸入?yún)?shù)為要分析的 html 文件名,返回值為對(duì)應(yīng)的 BeautifulSoup 對(duì)象 def create_doc_from_filename(filename): fo = open(filename, "r", encoding='utf-8') html_content = fo.read() fo.close() doc = BeautifulSoup(html_content, "lxml") return doc doc = create_doc_from_filename("tips3.html") images = doc.find_all("img") for i in images: src = i["src"] filename = src.split("/")[-1] # print(i["src"]) urlretrieve(src, "tips_3/" + filename)
執(zhí)行完畢后打開 tips_3目錄,可以看到圖片都被下載下來了。
替換說明如下。
替換為想要保存的文件名(網(wǎng)頁(yè)文件);
替換為想要下載網(wǎng)頁(yè)的網(wǎng)址;
替換為想要保存圖片的文件夾,需要?jiǎng)?chuàng)建好文件夾。
聯(lián)系客服