数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)
未經允許,請勿轉載。
連載未完成狀態
網址:
【數據挖掘】2019年最新python3 數據分析與爬蟲實戰_嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av22571713/?p=1
目標:
網絡爬蟲工程師
數據分析(數據挖掘)工程師
第一周 python基礎知識(4課時)
第二周 爬蟲
第三周 數據分析與挖掘技術
第一周——第一課
001課程介紹
002初始python
Python 是一門面向對象的,解釋型的編程語言。
面向對象:區別于面向過程,大型項目很方便
編程語言:
解釋型:區別于編譯型,解釋型是一行一行的執行。
Python2.X處理速度更快
Python3.X各方面更成熟完善些
Python 優點 :簡潔 基本上是全能的
Python 能做什么
數據分析與挖掘、黑客逆向編程、網絡爬蟲、機器學習(AI)、開發網站WEB項目、開發游戲、自動化運維。
Python 安裝
Idle是python的編輯器
Python2和python3可以共存
注釋方法
#號注釋后面的
‘’’ ‘’’三引號注釋法
快捷鍵
F5運行
CTRL+N 新建文件
CTRL+O 打開文件
CTRL+C 強制停止
標識符命名規則
1第一個字符為字符或者下劃線
2除了第一個字符以外的其他字符是字符、下劃線或數字。
a+=b 相當于a=a+b
數據類型:數、字符串、列表(list)、元組(tuple)、集合(set)、字典(dictionary)
沒有數組的概念,列表和元組類似數組
列表aaa=[“my”,”you”] aaa[0]=’my’ aaa[1]=’you’ 列表中元素可以替換
元組ccc=(“my”,”you”) ccc[0]=’my’ 元組中元素不能替換
集合(set) a=”aadshhdladljaj” b=”sadjhlajaljcjadl” sa=set(a) sb=set(b)
交集(共同的元素)sa&sb 并集(合并起來的元素) sa|sb
字典 格式{key1:value1,key2:value2} 單個元素key1(間):value1(值)d1={“name”:“weiwei”,“sex”:“man”} d1[“name”]=’weiwei’
運算符:常見的有 +、 -、 *、 /、 %(取余) 優先級() //不要余數 整除
- 字符串和變量之間鏈接可以用+ p=“python” “hello”+p=‘hellopython’
縮進 強制縮進了 美觀
同一層次的代碼,處于同一個縮進幅度上;下一層次的代碼,需要相對于上一層次的代碼進行縮進,建議使用tab鍵縮進。
三種控制流概述(順序結構、條件分支結構(選擇)、循環結構)
控制流:程序的執行流程
3種基本控制流(順序結構、條件分支結構(選擇)、循環結構)
還有一種 叫做 中斷結構
If語句(條件分支結構)
a=6 if(a>7):print(a) elif(a<2):print(a) else:print("nnn")while語句(循環結構)
a=0 while a<8:print("hello")a+=1for語句(循環結構)
a=["a","b","c","d"] for i in a:print(i) for i in range(0,10):print(i) for i in range(0,8):print("hello python")中斷結構 即:中途退出的一種結構。常有break語句和continue 語句
中斷一次循環,用continue語句(這一次不做,但之后繼續);
中斷一個循環,使用break(這一次不做,之后都不做);
輸出乘法口訣
for i in range(1,10):for j in range(1,i+1):print str(i)+"*"+str(j)+"="+str(i*j)+" ",print
作業:逆向輸出乘法口訣
第一周——第二課
認識python函數
函數的本質就是功能的封裝。使用函數可以大大提高變成的效率和程序的可讀性。
局部變量和全局變量
變量有生效范圍的,生效范圍被稱為作用域。
作用域從變量出現開始到程序的最末的變量叫做全局變量。
作用于只在局部的變量叫做局部變量。
Function 里面的局部變量 加global 變成全局變量
函數參數使用詳解
在漢書中,如果需要讓函數和外界有數據的傳遞,我們需要使用參數。參數分為形參和實參,一般來說,在函數定義時使用的參數是形參,在函數調用時使用的參數叫做實參。
函數使用實戰
什么是python模塊
模塊相當于函數的升級版;一個模塊里面有多個函數(一個函數)。
為了讓python程序實驗起來更方便,我們可以按需求類別將一些常見的功能(函數)組合在一起,形成模塊,以后我們要實現這一類功能的時候,直接導入該模塊即可。模塊里面的函數叫做模塊的方法。系統中自帶的模塊在安裝目錄的lib目錄中。
Python模塊的導入
我們可以使用以下兩種方式導入模塊:
Import模塊名 將整個模塊導入進去 from模塊.方法 import函數 導入某個方法爬蟲
導入方法一
import urllib from urllib.request import urlopen data1=urllib.request.urlopen("http://www.baidu.com").read() print(len(data1)) data2=urlopen("http://m.baidu.com").read() print(len(data2))導入方法二
from urllib import request data3=request.urlopen("http://jd.com").read()Import誰,就從誰開始寫。
如果是程序陷入死循環,想強制結束,則按Ctrl + C。
自定義python模塊
除了使用別人的模塊,我們也可以子集定義一些模塊,自己定義的模塊叫做自定義模塊。
返回值
Return 返回的是返回值。
文件操作概述
我們通常會通過手工去打開、寫入、讀取文件等操作,其實我們也可以使用python程序對文件進行打開,關閉,讀取,寫入等操作,使用python進行文件操作可以自動對程序進行處理,比如合并多個excel表格文件的內容等。
文件操作實戰
文件的創建和打開 (沒有文件就是創建,有文件就是打開)
open(“路徑”,”目的”) 目的:w(寫入) wb(以二進制的方式寫入) r(讀取)例:
open("F:/file1.txt","w") fh=open("F:/file2.txt","w") #fh是句柄,方便以后的操作定位 fh1=open("F:/file3.txt","w")文件的寫入和關閉
fh1.write("dsafgafe") fh1.close()#文件一定要記得關掉 否則之后句柄可能會錯亂文件的讀取和按行讀取
#按行輸出
fh2=open("F:/file3.txt","r") while True:line=fh2.readline()if len(line)==0:breakprint(line) fh2.close()天善學院
異常處理概述
Python程序在執行的時候,經常會遇到異常,如果中間異常不處理,經常會導致程序崩潰。比如后面我們寫爬蟲的時候,如果不進行異常處理,很可能蟲爬了一半,直接崩潰了。
異常處理實戰
try:#(正常內容)print("my")printsssv("hi") except Exception as er:#(異常處理內容)print(er)#輸出異常內容 print("hello")作業2:將多個EXCEL表格里面的內容合并到一個文件中。
思路:這個作業我們可以采用一些操作EXCEL的模塊去實現,比如說xlrd,xlwt,openpyxl,xlsxwriter等模塊。Xlrd模塊主要用于讀取excel表,xlwt與xlsxwriter模塊主要用于將數據寫入表中,兩個模塊任選其一即可,但是xlwt和 xlsxwriter模塊不支持修改表,所以在信息最佳的時候比較麻煩,此時有兩種思路解決。其一是換成其他的模塊,比如說openpyxl模塊等,其二是仍用xlwt和xlsxwriter等模塊,但先將每次讀取的信息存儲到list(列表)中,然后,最后一次寫入。此外還有一個難點,當一個表格中有多個sheet,我們希望能夠用程序自用獲取這多個sheet,然后將各個sheet的內容一起寫入最終表格中
之后先學習以下相關模塊,再重新學習(目前不懂)
011作業講解及爬蟲知識
如何查看模塊功能以及
一、如何了解模塊的功能?
1、help()–輸入對應的模塊名
>>> help() help> xlrd
2、閱讀該模塊的文檔,一些大型的模塊都有,比如說scrapy等
3、查看模塊的源代碼,分析個方法的作用,也可以從名字進行相應的分析
二、如何安裝模塊?
安裝模塊的時候經常會出現超時然后自動斷掉的問題,解決這種問題,我們應該
1、使用VPN(推薦)
2、多試幾次
3、使用本地whl文件來安裝(推薦)
1、實戰講解:http://www.lfd.uci.edu/~gohlke/pythonlibs/
Ctrl+f find
milk-0.6.1-cp37(python版本)-cp37m-win_amd64(32或者64).whl
2、下載后打開cmd 到達下載好的文件的目錄 然后寫pip install milk……(可以寫了mi,然后按tab鍵補全)
具體也可以參考我的其他的csdn博客的模塊安裝的兩種方法
第二周 網絡爬蟲
網絡爬蟲是什么?
網絡爬蟲是自動從互聯網中定向或不定向的采集信息的一種程序。
網絡爬蟲的類型很多,常用的有通用網絡爬蟲(搜索引擎常用)、聚焦網絡爬蟲(有目標,比通用難,重點)等。
網絡爬蟲能做什么?
網絡爬蟲可以做很多事情,比如說通用網絡爬蟲可以應用在搜索引擎中,聚焦網絡爬蟲可以從互聯網中自動采集信息并代替我們篩選出相關的數據出來。
具體來說,網絡爬蟲可以應用在一下方面:
1搜索引擎
2采集金融數據
3采集商品數據
4自動過濾廣告
5采集競爭對手的客戶數據
6采集行業相關數據,進行數據分析
……
第二周——第一節 重點是正則表達式
012網絡爬蟲運行原理
通用網絡爬蟲的運行原理
獲取最初的URL 爬頁面并獲取新的URL 將爬到的內容放到我們的服務器中, 將新的URL放到URL隊列中 讀取新的URL 是否滿足停止條件 是就停止,否就繼續爬頁面并獲得新的url 會從當前的頁面,爬取當前的網頁 再從當前的網頁獲取新的頁面,新的內容 沒有什么爬的目的
聚焦網絡爬蟲的運行原理
首先 要對抓取的目標進行相應的定義或者描述 (比如說提取Q Q號) 需要獲取初始URL 爬頁面并獲得新的URL 爬的頁面放到服務器中,并過濾無關鏈接 將過濾后的URL放入到url隊列中 確定下一步要爬的鏈接 讀取待爬url 是否滿足停止條件 滿足停止 不滿足 爬頁面并獲得新的url
聚焦網絡爬蟲有一個過濾的過程,通用的網絡爬蟲沒有過濾的過程
013正則表達式實戰(重點)
什么是正則表達式
世界上信息非常多,而我們關注的信息是有限的,假如我們希望只提取出關注的數據,此時可以通過一些表達式來進行提取,正則表達式是其中一種進行數據篩選的表達式。
re 正則表達式模塊
原子
原子是正則表達式中最基本的組成單位,每個正則表達式中至少要包含一個原子。
常見的原子類型有:
a:普通字符作為原子
b:非打印字符作為原子
c:通用字符作為原子
通用字符表示這個字符可以匹配一系列的東西。
d:原子表 [jsz] 就是jsz三選一都可以 這就是原子表 jsz三個字符的地位相等
import re pat="pyth[jsz]n" string="afgfagafgapythsn" rst2=re.search(pat,string) print(rst2)元字符
元字符是正則表達式中具有一些特殊含義的字符,比如重復N次前面的字符等。
. 可以匹配任意一個字符 ^ 可以匹配字符串的開始位置 在原子表[]里面代表除了后面的原子以外的原子 $ 可以匹配字符串的結束位置 * 可以匹配0次,1次,多次 “s*” s ss sss ?可以匹配0次或1次 “s?” s ss + 可以匹配1次,多次 “s*” ss sss {n} 可以匹配 前面的字符正好出現n次 t{3} ttt {n,} 可以匹配 前面的字符至少出現n次 t{3,} ttt tttt {n,m} 可以匹配 前面的字符至少出現n次,至多出現m次 t{3,4} ttt tttt |模式選擇符號 t|s t或者s () 模式斷垣 可以匹配 體悟某內容 具體看后面 這個沒聽懂 ()可以輸出括號里面的內容 import re pat=".python..." string="hjjkdkhpythondshihdsaih" rst=re.search(pat,string) print(rst) import re pat="python|php" string="abcdphp362pythonggigk" rst=re.search(pat,string) print(rst)模式修正符
模式修真符:即可以再不改變正則表達式的情況下,通過模式修正符改變正則表達式的含義,從而實現一些匹配結果的調整等功能。
I 匹配時忽略大小寫 M 匹配時 進行多行匹配 L 匹配時 本地化識別匹配 U 匹配時 根據unic(寫錯了)字符進行匹配 S 匹配時 讓點.也參與匹配 import re pat1="python" string="uguggyhuPythonfuifuy" rst=re.search(pat1,string) print(rst) import re pat1="python" string="uguggyhuPythonfuifuy" rst=re.search(pat1,string,re.I) print(rst)貪婪模式與懶惰模式
貪婪模式的核心點就是盡可能多的匹配
懶惰模式的核心點是盡可能少的匹配
正則表達式函數
re.match()函數 從頭開始搜索 如果頭頭不匹配 就不合格
re.search()函數 從文本框(字符串)里面搜索 無論是頭 尾 中間 都可以 只有一個結果
全局匹配函數
re.sub()函數 用于替換?
>>>
import re pat1="p.*y" pat2="p.*?y" string="hgdfuagphauyfjsgguphbgjkagky"#變了 rst=re.search(pat2,string)#變了 print(rst)
#re.search()只會出現一個符合要求的
常見正則實例
如何匹配.com和.cn,電話號碼
import re ##1如何匹配.com和.cn,電話號碼 pat="[a-zA-Z]+://[^\s]*[.com|.cn]" string='<a href="http://www.baidu.com">hj</a>' rst2=re.compile(pat).findall(string) print(rst2)如何從網頁中爬去qq群
import re #2如何從網頁中爬取qq群(如何爬取csdn的一個課程頁,并自動提取出QQ群) pat="<em>QQ:(.*?)</em>" import urllib.request data=urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/215").read() result=re.compile(pat).findall(str(data)) print(result).*?是匹配任何字符多次的懶惰模式
第二周第二次課(總共四個小結)
1 urllib實戰
作業講解 :
如何從http://read.douban.com/provider/all中將所有出版社提取出來,把無關信息過濾掉
import re #3作業 如何從http://read.douban.com/provider/all中將所有出版社提取出來,把無關信息過濾掉 import urllib.request data=urllib.request.urlopen("http://read.douban.com/provider/all").read() data=data.decode("utf-8")#指定編碼格式解碼字符串 pat='<div class="name">(.*?)</div>' mydata=re.compile(pat).findall(data) fh=open("E:/1.txt","w") for i in range(0,len(mydata)):fh.write(mydata[i]+"\n") fh.close()#decode()解碼
#encode()編碼
關于學習方法
1講過必須熟悉,未講不急
2多敲代碼,自己寫的才是自己的
3遇到問題獨立解決,利用搜索引擎,提高獨立解決問題能力
urllib基礎:
urlretrieve()、urlcleanup()、info()、getcode()、geturl()
#urlretrieve()一次性的直接將某個網頁爬到我們的本地 #urllib.request.urlretrieve("網址,要爬的url",filename="本地的地址和名字") #urlcleanup()可以將urlretrieve()產生的緩存清理掉 #info()將一些基本的環境信息展現出來 #getcode()獲取當前網頁的狀態碼 #geturl()獲取當前爬取的網址例:
import urllib.request #urlretrieve()一次性的直接將某個網頁爬到我們的本地 #urllib.request.urlretrieve("網址,要爬的url",filename="本地的地址和名字") urllib.request.urlretrieve("http://www.hellobi.com",filename="E:/1.html") #urlcleanup()可以將urlretrieve()產生的緩存清理掉 urllib.request.urlcleanup() #info()將一些基本的環境信息展現出來 file=urllib.request.urlopen("http://www.hellobi.com") file.info() #getcode()獲取當前網頁的狀態碼 #geturl()獲取當前爬取的網址 file.getcode() file.geturl()超時設置
由于網速和對方服務器的問題,我們在爬取網頁的時候需要時間,如果訪問網頁時網頁長時間未響應,我我們的系統會判斷網頁超時了,即無法打開該網頁。有的時候我們需要根據自己的需要來設置超時的時間值,比如,有些網頁反應快,我們希望2秒內沒有反應,則判斷超時,此時,timeout的值為2.比如,有些網頁反應慢,我們希望100秒內沒有反應,則判斷超時,此時,timeout的值為100.
file=urllib.request.urlopen("http://www.hellobi.com",timeout=1) file=urllib.request.urlopen("http://www.hellobi.com",timeout=0.01) import urllib.request for i in range(0,100):try:file=urllib.request.urlopen("http://yum.iqianyue.com",timeout=0.05)data=file.read()print(len(data))except Exception as e:print("出現異常:"+str(e))自動模擬HTTP請求
客戶端如果要與服務器端進行通信,需要通過http請求,http請求有很多種,我們再次會講post和get兩種請求方式。
登錄一個網站就需要post請求,
搜索某些信息時需要get請求。
如何通過爬蟲自動獲取搜索界面呢?
字段名=字段值 字段與字段之間用 &連接
2爬蟲的異常處理
異常處理概述
爬蟲在運行的過程中,很多時候都會遇到這樣或者那樣的異常。如果沒有異常處理,爬蟲遇到異常時就會直接崩潰停止運行,下次在運行時,優惠重頭開始,所以,要開發一個具有頑強生命力的爬蟲,必須要進行異常處理。
常見狀態碼及含義(明白基本含義)
200 請求正常進行 301 Moved Permanently:重定向到新的URL,永久性 302 Found: 重定向到臨時的URL,非永久性 304 Not Modified : 請求的資源未更新 400 Bad Request:非法請求 401 Unauthorized:請求未經授權 403 Forbidden: 禁止訪問 404 Not Found:沒有找到對應頁面 500 Internal Server Error:服務器內部出現錯誤 501 Not Implemented:服務器不支持實現請求所需要的功能URLError與HTTPRrror
兩者都是異常處理的類,HTTPError是URLError的子類,HTTPError有異常狀態碼和異常原因,URLError沒有異常狀態碼,所以,在處理的時候,不能用URLError直接代替HTTPError,因為無法獲得異常狀態碼。如果要代替,必須要判斷是否有狀態碼屬性。
URLError產生可能原因:
1、連不上服務器
2、遠程的URL不存在
3、假如本地沒有網絡
4、假如觸發了對應的HTTPError子類
異常處理實戰
#異常處理實戰 import urllib.error import urllib.request try:urllib.request.urlopen("http://blog.csdn.net") except urllib.error.URLError as e:if hasattr(e,"code"):#判斷是都有狀態嗎print(e.code)if hasattr(e,"reason"):print(e.reason)3爬蟲的瀏覽器偽裝技術
瀏覽器偽裝技術原理
我們可以試著爬取csdn博客,然后會返回403禁止訪問,因為對方服務器會對爬蟲進行屏蔽,我們需要偽裝成瀏覽器才能爬取。瀏覽器偽裝我們一般通過報頭進行。
打開網頁 按F12 點擊NetworK 然后按刷新f5 最后任意點一下NetworK下面的name里面的一行 然后右邊就有Headers 最后找User-Agent:后面的東西進行瀏覽器偽裝
4 python新聞爬蟲實戰
新聞爬蟲需求及實現思路
需求:將新浪新聞首頁(http://news.sina.com.cn/)所有新聞都爬到本地
思路:先爬首頁,通過正則獲取所有新聞鏈接,然后依次爬各個新聞,并儲存在本地。
####### 新聞爬蟲編寫實戰
# python新聞爬蟲實戰import urllib.request import re data=urllib.request.urlopen("http://news.sina.com.cn/").read() data2=data.decode("utf-8","ignore")#gbk utf-8 #右鍵 查看源代碼 Ctrl+f pat='href="(https://news.sina.com.cn/.*?)">' allurl=re.compile(pat).findall(data2) for i in range(0,len(allurl)):try:print("第"+str(i)+"次爬取")thisurl=allurl[i]file="F:/sinanews/"+str(i)+".html"urllib.request.urlretrieve(thisurl,file)print("-----成功----")except urllib.error.URLError as e:if hasattr(e,"code"):#判斷是都有狀態嗎print(e.code)if hasattr(e,"reason"):print(e.reason)這個需要自己在F盤里面建立一個sinanews文件夾
作業
爬取csdn博客http://blog.csdn.net/首頁顯示的所有文章,每個文章內容單獨生存一個本地網頁存在本地中。
難點:瀏覽器偽裝,循環爬各文章
思路:先爬首頁,然后通過正則篩選出所有文章url,然后通過循環分別爬取這些url到本地。
Encode()編碼 和 decode()解碼
第三周
1爬蟲防屏蔽手段之代理服務器實戰
作業講解
思路1 將opener添加為全局
思路2 用request
什么是代理服務器
代理服務器就是一個處于我們和互聯網中間的服務器,如果使用代理服務器,我們瀏覽信息的時候,先向代理服務器發出請求,然后由代理服務器向互聯網獲取消息,再返回給我們。
使用代理服務器進行爬取網頁實戰
使用代理服務器進行信息爬取,可以很好的解決ip限制的問題
免費代理ip 網址 :
http://www.xlcldaili.com/
http://31f.cn/
我試了很多,有的可以,有的不行,結果圖如下
、
2圖片爬蟲實戰(成功)
什么是圖片爬蟲
圖片爬蟲是從互聯網中自動把對方服務器上的圖片趴下來的爬蟲程序
淘寶圖片爬蟲實戰:如何爬取淘寶的圖片
(沒有成功,可能是因為需要登錄)
因為后續的內容太長了,而且還在不斷嘗試是否成功。所以開了個單篇。鏈接如下:
數據分析與數據挖掘實戰視頻——學習筆記之淘寶圖片爬蟲(包括淘寶登錄)
2019.5.25號 我嘗試了之前沒有學習的cookies加session,最后把功能實現了。
之后我回頭把失敗的項目實現的話,我會開個單篇,不然筆記太長太亂了。還會重新審核。
作業:試試把千圖網(http://www.58pic.com/) 某頻道的所有圖片爬下來,要高清版
(最開始失敗了,但最后成功了,好像重點是亂碼問題,見下一篇)
接下來的內容見:數據分析與爬蟲實戰視頻——學習筆記(二)
總結
以上是生活随笔為你收集整理的数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript异步编程系列【八】-
- 下一篇: 仿天天动听5应用项目源码