程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 萬能代碼模版:爬蟲代碼篇

編輯:Python

你好,我是悅創。

很多同學一聽到 Python 或編程語言,可能條件反射就會覺得“很難”。但今天的 Python 課程是個例外,因為今天講的 **Python 技能,不需要你懂計算機原理,也不需要你理解復雜的編程模式。**即使是非開發人員,只要替換鏈接、文件,就可以輕松完成。

並且這些幾個實用技巧,簡直是 Python 日常幫手的最佳實踐。比如:

  • 爬取文檔,爬表格,爬學習資料;
  • 玩轉圖表,生成數據可視化;
  • 批量命名文件,實現自動化辦公;
  • 批量搞圖,加水印、調尺寸。

接下來,我們就逐一用 Python 實現,其中我提供的代碼是萬能代碼,只用替換成你想爬的網頁鏈接、文件位置、照片就可以進行處理了。

如果你沒有安裝 Python 及相關環境搭建,你可以參考我之前寫的文章:

  • 數據分析的環境不會搭?看這裡准沒錯!
  • Python3 網絡爬蟲系統一對一教學(環境安裝)

**Tips:**因為不同的章節的數據可能會交叉引用,所以建議你首先在桌面建立一個工作夾,然後每個章節都單獨建立一個 Python 文件進行實驗。比如可以新建一個 pytips 的目錄,然後在該目錄下,每個章節創建一個 tips 文件夾,裡面創建對應的 .py 文件。(按你具體的來,我的文件夾也和這個不一樣)

1. 巧用 Python 爬蟲,實現財富自由

首先可以用 Python 來進行爬蟲,什麼是爬蟲?簡單理解來說就是抓取網絡上的數據(文檔、資料、圖片等)。比如你考研可以爬文檔和學習資料,要網絡上的表格數據做分析,批量下載圖片等。

下面我們來看看如何一一實現。

1.1 爬取文檔、學習資料

首先,你得先確定你要爬的網站是什麼?你要獲取的目的是什麼?比如,小悅想爬青巖幫網站中的報考指南,所以他想搜集目前該網頁的所有文章的標題和超鏈接,以方便後續浏覽。

爬取網站的鏈接:https://zkaoy.com/sions/exam
目的:收集目前該網頁的所有文章的標題和超鏈接

那使用 Python,可以參考以下兩步的代碼模板實現(提示:需要先安裝 Python 依賴:urllib3 bs4)。
安裝所需要的庫:

pip install urllib3 BeautifulSoup4

第一步,下載該網頁並保存為文件,代碼如下。
**PS:**這裡,我為了清晰一些,拆成兩個代碼文件,後面我再來一個合並成一個代碼文件。

# urllib3 的方法
# file_name:Crawler_urllib3.py
import urllib3
def download_content(url):
"""
第一個函數,用來下載網頁,返回網頁內容
參數 url 代表所要下載的網頁網址。
整體代碼和之前類似
"""
http = urllib3.PoolManager()
response = http.request("GET", url)
response_data = response.data
html_content = response_data.decode()
return html_content
# 第二個函數,將字符串內容保存到文件中
# 第一個參數為所要保存的文件名,第二個參數為要保存的字符串內容的變量
def save_to_file(filename, content):
fo = open(filename, "w", encoding="utf-8")
fo.write(content)
fo.close()
def main():
# 下載報考指南的網頁
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):
"""
第一個函數,用來下載網頁,返回網頁內容
參數 url 代表所要下載的網頁網址。
整體代碼和之前類似
"""
response = requests.get(url).text
return response
# 第二個函數,將字符串內容保存到文件中
# 第一個參數為所要保存的文件名,第二個參數為要保存的字符串內容的變量
def save_to_file(filename, content):
with open(filename, mode="w", encoding="utf-8") as f:
f.write(content)
def main():
# 下載報考指南的網頁
url = "https://zkaoy.com/sions/exam"
result = download_content(url)
save_to_file("tips1.html", result)
if __name__ == '__main__':
main()

第二步,解析網頁,並提取出文章的鏈接和標題。

# file_name:html_parse.py
# 解析方法一
from bs4 import BeautifulSoup
# 輸入參數為要分析的 html 文件名,返回值為對應的 BeautifulSoup 對象
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
# 輸入參數為要分析的 html 文件名,返回值為對應的 BeautifulSoup 對象
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:**兩個代碼很像,只是差別在指定了解析器——lxml

執行代碼之後,你就可以看到網頁中的標題和鏈接已經被打印到了屏幕上。

敲黑板!這些省份往屆生不能預報名!
https://zkaoy.com/15123.html
二戰必須回戶籍所在地考嗎?
https://zkaoy.com/15103.html
這些同學不能參加預報名!不注意,有可能考研報名失敗!
https://zkaoy.com/15093.html
嗚呼~考研報名費,這種情況可以退款!
https://zkaoy.com/15035.html
注意:又發通知!22研招有4點變化??
https://zkaoy.com/14977.html
2021考研初試時間定了!正式網報時間有變化
https://zkaoy.com/14915.html
快碼住!考研前的這些關鍵時間點,千萬不能錯過!
https://zkaoy.com/14841.html
近萬名考生考研報名失敗!問題出在這!22考研一定注意!
https://zkaoy.com/14822.html
往屆生比應屆生更容易上岸,你認同嗎?
https://zkaoy.com/14670.html
各省市考研報名費用!
https://zkaoy.com/14643.html
要開始報名了?現在不需要擔心,沒你想的那麼復雜……
https://zkaoy.com/14620.html
教育部公布重要數據:研究生擴招20.74%!
https://zkaoy.com/14593.html
虛假招生?這一高校臨近開學取消獎學金!
https://zkaoy.com/14494.html
下個月要預報名了,高頻問題早知道
https://zkaoy.com/14399.html
注意!這些網報信息要准備好,否則影響9月考研報名!
https://zkaoy.com/14352.html
想考上研,各科應該考多少分?
https://zkaoy.com/14273.html
選擇報考點需要注意什麼?報考點有限制!
https://zkaoy.com/14161.html
各地考研報名費匯總!快來看看你要交多少錢!
https://zkaoy.com/14158.html
考研高校推免人數公布,統考名額還剩多少?
https://zkaoy.com/14092.html
這幾所高校考研參考書有變!參考書目要怎麼搜集?
https://zkaoy.com/14061.html
院校指南
https://zkaoy.com/sions/zxgg1
這些要提前准備好!不然影響報名!
https://zkaoy.com/13958.html
救命!近萬人因為這個,錯失考研機會!
https://zkaoy.com/13925.html
考研如何看招生簡章和招生目錄?
https://zkaoy.com/13924.html

上面,我是拆開了,現在合並成一個代碼文件即可:

# file_name:Crawler.py
import requests
from bs4 import BeautifulSoup
def download_content(url):
"""
第一個函數,用來下載網頁,返回網頁內容
參數 url 代表所要下載的網頁網址。
整體代碼和之前類似
"""
response = requests.get(url).text
return response
# 第二個函數,將字符串內容保存到文件中
# 第一個參數為所要保存的文件名,第二個參數為要保存的字符串內容的變量
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):
# 輸入參數為要分析的 html 文件名,返回值為對應的 BeautifulSoup 對象
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():
# 下載報考指南的網頁
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 大必學實用技巧/1.1 巧用 Python 爬蟲,實現財富自由](https://github.com/AndersonHJB/AIYC_DATA/tree/main/01-Python 萬能代碼模版:10 大必學實用技巧/1.1 巧用 Python 爬蟲,實現財富自由)

那如果你想爬取其他網頁如何替換呢?你只需替換幾處即可,如下圖所示。

  1. 替換為想要下載的網頁地址
  2. 替換為網頁保存的文件名
  3. 是 BeautifulSoup 函數,我們用它一步步從 html 的結構中解析出我們想要的內容,這裡我們實現的是首先找到所有 class 屬性是 post-info 的 div 標簽,然後將這些標簽中的 a 標簽的文本部分提取出來。如果你解析的網頁結構和這個不同,具體 BeautifulSoup 的用法可以參考我們這節課程 https://www.aiyc.top/673.html#六、Requests_與_BeautifulSoup_庫的基礎操作。

1.2 抓取表格,做數據分析

我們日常在上網的時候,往往都會看到一些有用的表格,都希望保存下來日後使用,但直接復制到 Excel 往往都很容易發生變形,或者亂碼,或者格式錯亂等種種問題,借助 Python 可以輕松實現網頁中表格的保存。(提示:需要先安裝依賴: urllib3, pandas)

pip install urllib3 pandas

以招行外匯頁面為例:

Python 代碼如下:

# file_name: excel_crawler_urllib3.py
import urllib3
import pandas as pd
def download_content(url):
# 創建一個 PoolManager 對象,命名為 http
http = urllib3.PoolManager()
# 調用 http 對象的 request 方法,第一個參數傳一個字符串 "GET"
# 第二個參數則是要下載的網址,也就是我們的 url 變量
# request 方法會返回一個 HTTPResponse 類的對象,我們命名為 response
response = http.request("GET", url)
# 獲取 response 對象的 data 屬性,存儲在變量 response_data 中
response_data = response.data
# 調用 response_data 對象的 decode 方法,獲得網頁的內容,存儲在 html_content
# 變量中
html_content = response_data.decode()
return html_content
def save_excel():
html_content = download_content("http://fx.cmbchina.com/Hq/")
# 調用 read_html 函數,傳入網頁的內容,並將結果存儲在 cmb_table_list 中
# read_html 函數返回的是一個 DataFrame 的list
cmb_table_list = pd.read_html(html_content)
# 通過打印每個 list 元素,確認我們所需要的是第二個,也就是下標 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/")
# 調用 read_html 函數,傳入網頁的內容,並將結果存儲在 cmb_table_list 中
# read_html 函數返回的是一個 DataFrame 的list
cmb_table_list = pd.read_html(html_content)
# 通過打印每個 list 元素,確認我們所需要的是第二個,也就是下標 1
# print(cmb_table_list)
cmb_table_list[1].to_excel(filename)
def main():
filename = "tips2.xlsx"
save_excel(filename)
if __name__ == '__main__':
main()

下圖為了輔助理解:


執行之後,會在代碼文件所在的目錄生成 tips2.xlsx 的 excel 文件,打開之後如下圖所示。

當你希望抓取自己的表格時,替換下面 3 個部分即可。

  1. 修改你要保存的 excel 文件名稱;
  2. 替換為想要抓取表格所在網頁的網址;
  3. 替換為表格的序號,比如想要抓取網頁中的第幾個表格;

代碼鏈接:https://github.com/AndersonHJB/AIYC_DATA/tree/main/01-Python%20萬能代碼模版:10%20大必學實用技巧/1.2%20抓取表格,做數據分析

1.3 批量下載圖片

當我們看到一個網頁上有很多喜歡的圖片時,一張一張保存效率比較低。

通過 Python 我們也可以實現快速的圖片下載。以堆糖網為例,我們看到了這個網頁。

感覺很好看,希望能夠把所有圖片下載下來,方案大體和 1 是一樣的。

我們首先下載網頁,然後分析其中的 img 標簽,然後把圖片下載下載來。首先我們在工作目錄建立一個文件夾 tips_3 用來放下載的圖片。

首先還是下載網頁,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
# 第一個函數,用來下載網頁,返回網頁內容
# 參數 url 代表所要下載的網頁網址。
# 整體代碼和之前類似
def download_content(url):
http = urllib3.PoolManager()
response = http.request("GET", url)
response_data = response.data
html_content = response_data.decode()
return html_content
# 第二個函數,將字符串內容保存到文件中
# 第一個參數為所要保存的文件名,第二個參數為要保存的字符串內容的變量
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 標簽,下載圖片。

from bs4 import BeautifulSoup
from urllib.request import urlretrieve
# 輸入參數為要分析的 html 文件名,返回值為對應的 BeautifulSoup 對象
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)

執行完畢後打開 tips_3目錄,可以看到圖片都被下載下來了。

替換說明如下。

  1. 替換為想要保存的文件名(網頁文件);
  2. 替換為想要下載網頁的網址;
  3. 替換為想要保存圖片的文件夾,需要創建好文件夾。

另外,有的網站的圖片是先顯示網頁之後才動態加載的,這類動態加載的內容的圖片下載是不支持的喔。
代碼鏈接:https://github.com/AndersonHJB/AIYC_DATA/tree/main/01-Python%20萬能代碼模版:10%20大必學實用技巧/1.3%20批量下載圖片

·推出輔導班啦,包括「Python 語言輔導班、C++輔導班、算法/數據結構輔導班、少兒編程、pygame 游戲開發」,全部都是一對一教學:一對一輔導 + 一對一答疑 + 布置作業 + 項目實踐等。QQ、微信在線,隨時響應!V:Jiabcdefh

先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved