python爬蟲[簡易版]

python爬數據[簡易版]

對于每個網站的爬的原理基本是一樣的,但是具體的代碼寫法的區別就在于爬的數據中解析出想要的數據格式:

以爬取有道詞典中的圖片為例:

第一步:打開網站,分析圖片的數據源來自哪里,

https://dict-subsidiary.youdao.com/home/content?invalid=&previewEnvTest=

發現我們要的數據原來自這里,

{"data": {.........."secondList": [{"name": "網易有道詞典APP","picture": "https://ydlunacommon-cdn.nosdn.127.net/4e7ca43db1a83f11c467105181e9badb.png","desc": "智能學習更高效","buttonList": [{"text": "下載","type": 0,"url": "https://cidian.youdao.com/download-app/"}]},{"name": "有道詞典筆","picture": "https://ydlunacommon-cdn.nosdn.127.net/c30638638a393dc38464600caf4888fb.jpg","desc": "更專業的詞典筆","buttonList": [{"text": "查看詳情","type": 0,"url": "https://smart.youdao.com/dictPenX6Pro"}]},..........
}

接下來就是分析返回的數據,解析數據~拿出圖片的url

response = requests.get(url, headers)
# response = request.urlopen(url).read()
# 處理數據json_load = json.loads(response.text)
# json_load = json.loads(response)
dt = json_load['data']
dumps = json.dumps(dt)
loads = json.loads(dumps)
listS = loads["secondList"]
arr = []
for i in listS:json_dumps = json.dumps(i)json_loads = json.loads(json_dumps)arr.append(json_loads["picture"])

爬取數據:

i = 0
for item in arr:requests_get=request.urlopen(item).read()png = "d:/PythonData/pic/" + str(i) + ".png"with open(png, "wb") as f:f.write(requests_get)i = i + 1

完整的代碼:

from urllib import request
import re
import requests
import json
"""爬取有道詞典的圖片
"""
url = "https://dict-subsidiary.youdao.com/home/content?invalid=&previewEnvTest="
headers = {# User-Agent 用戶代理 瀏覽器基本身份信息'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 ''Safari/537.36'
}
response = requests.get(url, headers)
# response = request.urlopen(url).read()
# 處理數據
json_load = json.loads(response.text)
# json_load = json.loads(response)
dt = json_load['data']
dumps = json.dumps(dt)
loads = json.loads(dumps)
listS = loads["secondList"]
arr = []
for i in listS:json_dumps = json.dumps(i)json_loads = json.loads(json_dumps)arr.append(json_loads["picture"])
i = 0
for item in arr:requests_get=request.urlopen(item).read()png = "d:/PythonData/pic/" + str(i) + ".png"with open(png, "wb") as f:f.write(requests_get)i = i + 1

example:

"""
# 導入數據請求模塊 --> 第三方模塊, 需要安裝 pip install requests
# 導入正則模塊 --> 內置模塊, 不需要安裝
"""
import requests
import re"""
1.
發送請求, 模擬瀏覽器對于url地址發送請求
- 模擬瀏覽器 < 反爬處理 > 請求頭 < 字典數據類型 >
如果你不偽裝, 可能會被識別出來是爬蟲程序, 從而得到數據內容
可以直接復制粘貼 --> 開發者工具里面就可以復制- < Response[200] > 響應對象
Response: 中文意思 -->響應
<>: 表示對象
200: 狀態碼
表示請求成功
發送請求, 請求成功了分析請求url地址變化規律:
第一頁: http: // www.netbian.com / dongman /
第二頁: http: // www.netbian.com / dongman / index_2.htm
第三頁: http: // www.netbian.com / dongman / index_3.htm
第四頁: http: // www.netbian.com / dongman / index_4.htm"""
for page in range(2, 11):print(f'=================正在采集第{page}頁的數據內容=================')# 請求圖片目錄頁面urlurl = f'http://www.netbian.com/dongman/index_{page}.htm'# 偽裝模擬成瀏覽器headers = {# User-Agent 用戶代理 瀏覽器基本身份信息'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'}# 發送請求# 調用requests模塊里面get請求方法, 對于url地址發送請求, 并且攜帶上headers請求頭偽裝, 最后用自定義變量名response接受返回的數據response = requests.get(url=url, headers=headers)"""
2.
獲取數據, 獲取服務器返回響應數據
response
網頁源代碼
response.text
獲取響應文本數據 < 網頁源代碼 >
3.
解析數據, 提取我們想要的數據內容
- 圖片ID
正則表達式Re
會1
不會0
調用re模塊里面findall方法 --> 找到所有我們想要的數據
re.findall('找什么數據', '從哪里找') --> 從什么地方, 去匹配找什么樣的數據內容
從
response.text < 網頁源代碼 > 里面
去找 < a
href = "/desk/(\d+).htm"
其中(\d +) 就是我們要的內容
\d + 表示任意數字
"""
# 提取圖片ID --> 列表 <盒子/箱子> '29381' 是列表<箱子>里面元素<蘋果>
img_id_list = re.findall('<a href="/desk/(\d+).htm"', response.text)
# for循環遍歷, 把列表里面元素 一個一個提取出來
for img_id in img_id_list:# img_id變量<袋子> 給 img_id_list 列表<盒子> 里面 元素<蘋果> 給裝起來print(img_id)"""
4.
發送請求, 模擬瀏覽器對于url地址發送請求
- 請求
圖片詳情頁頁面url
http: // www.netbian.com / desk / {圖片ID}.htm
5.
獲取數據, 獲取服務器返回響應數據
response
網頁源代碼
"""# 請求詳情頁鏈接 --> f'{img_id}' 字符串格式化方法link = f'http://www.netbian.com/desk/{img_id}.htm'# 發送請求response_1 = requests.get(url=link, headers=headers)# 獲取數據內容 網頁源代碼 ---> 亂碼了, 進行轉碼response_1.encoding = 'gbk'# 6. 解析數據, 提取我們想要的數據內容<圖片鏈接/圖片標題>img_url, img_title = re.findall('<img src="(.*?)" alt="(.*?)"', response_1.text)[0]# 7. 保存數據 --> 先獲取圖片數據內容img_content = requests.get(url=img_url, headers=headers).contentwith open('img\\' + img_title + '.jpg', mode='wb') as f:f.write(img_content)print(img_url, img_title)

python中的拷貝

import copy
from typing import override"""對于簡單的 object,用 shallow copy 和 deep copy 沒區別"""
"""構造一個類,然后構造一個實例,然后拷貝這個實例,就會發現,淺拷貝和深拷貝效果一樣"""
"""如果是拷貝的list,深拷貝會拷貝list里面的內容,淺拷貝不會拷貝list里面的內容,而是拷貝list的地址""""""淺拷貝"""class Dog(object):def __init__(self, name):self.name = name"""如果要求名一樣就是一個,那么需要重寫下面的方法## def __eq__(self, other):#     return self.name == other.name## def __gt__(self, other):#     return self.name > other.name"""a = Dog("a")copy_obj_dog = copy.copy(a)deep_copy_obj_dog = copy.deepcopy(a)print(copy_obj_dog)  # <__main__.Dog object at 0x000002A0BFA56210>
print(deep_copy_obj_dog)  # <__main__.Dog object at 0x000002A0BFA56ED0>
print(copy_obj_dog == deep_copy_obj_dog)  # FALSE# 修改其中的一個,修改深拷貝的對象不影響源對象
deep_copy_obj_dog.name = "b"
print(copy_obj_dog.name)  # a
print(deep_copy_obj_dog.name)  # b
print(a.name)  # a
"""深拷貝"""class Cat:def __init__(self, name):self.name = namec = Cat("c")
copy_obj_cat = copy.copy(c)
deep_copy_obj_cat = copy.deepcopy(c)copy_obj_cat.name = "d"
print(copy_obj_cat.name)  # d
print(deep_copy_obj_cat.name)  # c
print(c.name)  # c# 可以看到淺拷貝跟深拷貝對于簡單的obj對象,效果是一樣的,都是拷貝到一個新對象中cat = Cat("list")
arr = [cat]
# 淺拷貝list~復雜對象 此時淺拷貝考的是地址
copy_arr = copy.copy(arr)
print(copy_arr == arr)  # Trueprint(arr[0])
print(copy_arr[0])# 修改list中的一個,修改淺拷貝的對象會影響源對象
copy_arr[0].name = "修改了"
print(arr[0].name)# 深拷貝~list 修改不會影響源對象
cat2 = Cat("list2")
arr2 = [cat2]deepcopy_arr2 = copy.deepcopy(arr2)
print(deepcopy_arr2 == arr2)print(arr2[0])
print(deepcopy_arr2[0])deepcopy_arr2[0].name = "change"
print(arr2[0].name)"""淺拷貝list中填充的是地址"""
"""深拷貝list中填充的是原始對象的副本"""class CustomCopy():"""自定義復制行為"""def __init__(self, name):self.name = namedef __copy__(self):print("copy")return CustomCopy(self.name)def __deepcopy__(self, memo):print("deepcopy")return CustomCopy(copy.deepcopy(self.name, memo))a = copy.copy(CustomCopy("a"))
ab = copy.deepcopy(CustomCopy("a"))
print(a == ab)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13395.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13395.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統磁盤管理類問題

例題&#xff1a;在磁盤上存儲數據的排列方式會影響1/0服務的總時間。假設每個磁道被劃分成10個物理塊&#xff0c;每個物理塊存放1個邏輯記錄。邏輯記錄R1,R2....R10存放在同一個磁道上&#xff0c;記錄的排列順序如下表所示&#xff1a; 假定磁盤的旋轉速度為10ms/周&#xf…

VMware虛擬機-安裝程序無法自動安裝virtual machine......_windows server 2008 R2

系統版本&#xff1a;windows server 2008 R2 問題-安裝程序無法自動安裝virtual machine… 在使用虛擬機安裝windows server 2008 R2系統中&#xff0c;安裝VMware Tools工具安祖啊寄給你失敗&#xff0c;提示安裝程序無法自動安裝virtual machine…&#xff0c;必須手動安裝…

從源頭到洞察:大數據時代的數據提取與分析實戰指南

隨著科技的飛速發展&#xff0c;大數據已經成為現代社會的核心驅動力之一。從商業決策到科學研究&#xff0c;從政策制定到個人生活&#xff0c;數據無處不在&#xff0c;影響著我們的每一個決策。然而&#xff0c;如何從海量的數據中提取有價值的信息&#xff0c;并轉化為深刻…

List類

什么是 List 在集合框架中&#xff0c; List 是一個接口&#xff0c;繼承自 Collection 。 Collection 也是一個接口 &#xff0c;該接口中規范了后序容器中常用的一些方法&#xff0c;具體如下所示&#xff1a; List 中提供了好的方法&#xff0c;具體如下&#xff1a; List…

Conda 常用命令大全

Conda 常用命令大全 配置源conda配置清華源pip配置清華源pip配置阿里源 環境管理創建一個新的虛擬環境列出虛擬環境激活虛擬環境退出虛擬環境刪除虛擬環境復制某個虛擬環境 conda包管理列出全部包安裝包卸載包 pip包管理列出全部包安裝包卸載包 其他命令查詢 conda 版本查看環境…

python發票真偽查驗開發文檔、票據OCR、數電票查驗

想象一下&#xff0c;只需一行行簡潔的代碼&#xff0c;復雜繁瑣的發票審核工作瞬間變得井然有序。翔云發票查驗開發文檔詳盡易懂&#xff0c;即便是Python新手也能迅速上手&#xff0c;搭建起自己的發票真偽查驗系統。無論是紙質發票的掃描圖像&#xff0c;還是電子發票的數據…

C語言詳解:數組指針

數組指針是指針 int* p[10] 這是指針數組的寫法 &#xff0c;因為【】的優先級比*高&#xff0c; 所以為了解決優先級問題&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//數組的地址要存起來 說明p是指針&#xff08;首先與*結合&#xff09;&#xff0c…

哈希表法快速求解最長連續序列 | 力扣128題詳細解析

?????? 歡迎來到我的博客。希望您能在這里找到既有價值又有趣的內容&#xff0c;和我一起探索、學習和成長。歡迎評論區暢所欲言、享受知識的樂趣&#xff01; 推薦&#xff1a;數據分析螺絲釘的首頁 格物致知 終身學習 期待您的關注 導航&#xff1a; LeetCode解鎖100…

Oracle 數據庫 19c 選件和管理包 英文技術文檔

都是英文的&#xff0c;點擊鏈接可單獨下載。點這里批量下載。 Database Options&#xff1a; 數據庫選件或管理包數據表技術白皮書MultitenantData Sheet(12c)White PaperReal Application ClustersData Sheet(12c)White PaperActive Data GuardData Sheet(沒找到)White Pap…

關于電源3(整流濾波電路)

整流濾波電路 框圖 一共有四種整流電路 以下是自己參考別人的文章https://blog.csdn.net/zhuguanlin121/article/details/130653498?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171582622316800215096518%2522%252C%2522scm%2522%253A%252220140713.130102334…

jenkins配置不同版本nodeJS,保姆級叫你配置

問題描述&#xff1a;公司jenkins被改了nodejs版本適配其他項目導致以前的項目構建失敗&#xff0c;原因就是nodejs版本太高或太低導致&#xff0c;這里教大家不去更改服務器默認版本&#xff0c;當需要特殊版本直接在jenkins里配置即可。 過程 1、安裝nodeJS插件 1.1點擊管…

Linux中的nproc命令

2024年5月15日&#xff0c;周三上午 nproc 是一個在類 Unix 系統中使用的命令行實用程序&#xff0c;用于返回系統上可用的處理器核心數量。這個數字通常比物理 CPU 核心的數量要少&#xff0c;因為它可能排除了超線程核心或熱插拔核心。nproc 命令讀取 /proc/cpuinfo 文件來獲…

怎么把照片變小做頭像?多種方法教你圖片改尺寸

現在在社交媒體平臺或者是社交軟件上&#xff0c;我們經常會去更改頭像來展示自己&#xff0c;但是有時候我們拍攝的照片太大無法直接用作頭像&#xff0c;這時候就需要去修改圖片尺寸&#xff0c;將圖片改大小到合適的數值才能使用&#xff0c;那么如何快速的將圖片改大小呢&a…

Ansys Mechanical|中遠程點的Behavior該如何設置?

Remote point是ANSYS mechanical中的一種常見節點自由度耦合建模形式&#xff0c;在轉動裝配體中的連接轉動副、或者在施加遠端約束及遠端載荷的時候&#xff0c;我們經常用到遠端單元來耦合一個面或者一條線。例如銷軸似的滾動摩擦連接&#xff0c;如果我們希望將兩個物體通過…

TCP實現文件傳輸以及下載

目錄 1.上傳文件思路 2.下載文件思路 3.上傳文件代碼 4.下載文件代碼 5.運行格式 1.上傳文件思路 上傳文件就相當于客戶端發送文件 步驟&#xff1a; 創建套接字連接服務器獲取文件大小循環少量多次發送關閉文件和套接字 2.下載文件思路 下載文件就相當于服務器端接收…

layui+java前端傳json后端接收

項目場景&#xff1a; layui前端使用復選框選擇Table的數據傳到java后端進行業務操作 問題描述 報錯類型錯誤JSON轉換接收失敗的類型錯誤 解決方案&#xff1a; 分為前后端兩種情況 先說前端的: 前端需要是集合轉json下面是代碼案例 主界面的table選擇之后通過緩存傳到子界…

JavaScript 實現敏感信息脫敏

JavaScript 實現敏感信息脫敏 銀行卡號脫敏 要在 JavaScript 中對銀行卡信息進行脫敏&#xff0c;可以使用字符串處理方法來替換敏感信息為特定的字符。以下是一個簡單的示例代碼&#xff0c;將銀行卡號的中間數字用 “*” 替換&#xff1a; function desensitizeCardNumber…

小白git

克隆 &#xff1a;git clone 鏈接地址 如果沒有.git文件的話&#xff1a;git init 切換分支&#xff1a;cd 目錄 拉代碼&#xff1a;git pull 查看你自己改了那些文件&#xff1a;git status 添加道本地暫存區&#xff1a;git add * 提交到遠端&#xff1a;git commit …

吳恩達深度學習筆記:優化算法 (Optimization algorithms)2.9-2.10

目錄 第二門課: 改善深層神經網絡&#xff1a;超參數調試、正 則 化 以 及 優 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;優化算法 (Optimization algorithms)2.9 學習率衰減(Learning rate decay) 第二門…

HP5V80、HP5V105、HP3V28電比例驅動柱塞泵放大器

HP5V80、HP5V105、HP3V28、HP3V45、HP3V60、HP3V80、HP3V125、HP3V140帶電比例控制泵放大器&#xff0c;變排量泵的排量可通過由BEUEC比例放大器輸出到比例電磁閥電流變化而進行調整&#xff0c;控制電流范圍為300mA至800mA(24VDC)或600mA至1600mA(12VDC)。主要適合應用于工程機…