python爬蟲--爬蟲介紹


一 爬蟲

1、什么是互聯網?

    互聯網是由網絡設備(網線,路由器,交換機,防火牆等等)和一台台計算機連接而成,像一張網一樣

2、互聯網建立的目的?

    互聯網的核心價值在於數據的共享/傳遞:數據是存放於一台台計算機上的,而將計算機互聯到一起的目的就是為了能夠方便彼此之間的數據共享/傳遞,否則你只能拿U盤去別人的計算機上拷貝數據了。

3、什么是上網?爬蟲要做的是什么?

我們所謂的上網便是由用戶端計算機發送請求給目標計算機,將目標計算機的數據下載到本地的過程。
只不過,用戶獲取網絡數據的方式是:
	1.瀏覽器提交請求->下載網頁代碼->解析/渲染成頁面。
而爬蟲程序要做的就是:
	2.模擬瀏覽器發送請求->下載網頁代碼->只提取有用的數據->存放於數據庫或文件中
 
1與2的區別在於:  我們的爬蟲程序只提取網頁代碼中對我們有用的數據

4、爬蟲

1.爬蟲的定義:

  向網站發起請求,獲取資源后分析並提取有用數據的程序 

2.爬蟲的價值

  互聯網中最有價值的便是數據,比如天貓商城的商品信息,鏈家網的租房信息,雪球網的證券投資信息等等,這些數據都代表了各個行業的真金白銀,可以說,誰掌握了行業內的第一手數據,誰就成了整個行業的主宰,如果把整個互聯網的數據比喻為一座寶藏,那我們的爬蟲課程就是來教大家如何來高效地挖掘這些寶藏,掌握了爬蟲技能,你就成了所有互聯網信息公司幕后的老板,換言之,它們都在免費為你提供有價值的數據。

爬蟲的分類

1.通用爬蟲

	通用爬蟲是搜索引擎(Baidu、Google、Yahoo等)“抓取系統”的重要組成部分。主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。  簡單來講就是盡可能的;把互聯網上的所有的網頁下載下來,放到本地服務器里形成備分,在對這些網頁做相關處理(提取關鍵字、去掉廣告),最后提供一個用戶檢索接口。 

2.聚焦爬蟲

	聚焦爬蟲是根據指定的需求抓取網絡上指定的數據。例如:獲取豆瓣上電影的名稱和影評,而不是獲取整張頁面中所有的數據值。
2.1 robots協議
	如果自己的門戶網站中的指定頁面中的數據不想讓爬蟲程序爬取到的話,那么則可以通過編寫一個robots.txt的協議文件來約束爬蟲程序的數據爬取。robots協議的編寫格式可以觀察淘寶網的robots(訪問www.taobao.com/robots.txt即可)。但是需要注意的是,該協議只是相當於口頭的協議,並沒有使用相關技術進行強制管制,所以該協議是防君子不防小人。但是我們在學習爬蟲階段編寫的爬蟲程序可以暫時先忽略robots協議。
Allow:允許的
Disallow:不允許的


User-agent:  Baiduspider
Allow:  /article
Allow:  /oshtml
Allow:  /ershou
Allow: /$
Disallow:  /product/
Disallow:  /

User-Agent:  Googlebot
Allow:  /article
Allow:  /oshtml
Allow:  /product
Allow:  /spu
Allow:  /dianpu
Allow:  /oversea
Allow:  /list
Allow:  /ershou
Allow: /$
Disallow:  /

User-agent:  Bingbot
Allow:  /article
Allow:  /oshtml
Allow:  /product
Allow:  /spu
Allow:  /dianpu
Allow:  /oversea
Allow:  /list
Allow:  /ershou
Allow: /$
Disallow:  /

User-Agent:  360Spider
Allow:  /article
Allow:  /oshtml
Allow:  /ershou
Disallow:  /

User-Agent:  Yisouspider
Allow:  /article
Allow:  /oshtml
Allow:  /ershou
Disallow:  /

User-Agent:  Sogouspider
Allow:  /article
Allow:  /oshtml
Allow:  /product
Allow:  /ershou
Disallow:  /

User-Agent:  Yahoo!  Slurp
Allow:  /product
Allow:  /spu
Allow:  /dianpu
Allow:  /oversea
Allow:  /list
Allow:  /ershou
Allow: /$
Disallow:  /

User-Agent:  *
Disallow:  /
2.2 反爬蟲
門戶網站通過相應的策略和技術手段,防止爬蟲程序進行網站數據的爬取。
2.3 反反爬蟲
爬蟲程序通過相應的策略和技術手段,破解門戶網站的反爬蟲手段,從而爬取到相應的數據。

3.增量式爬蟲

通過爬蟲程序監測某網站數據更新的情況,以便可以爬取到該網站更新出的新數據。

二 爬蟲的基本流程

1、發起請求
	使用http庫向目標站點發起請求,即發送一個Request
	Request包含:請求頭、請求體等

2、獲取響應內容
	如果服務器能正常響應,則會得到一個Response
	Response包含:html,json,圖片,視頻等

3、解析內容
    解析html數據:正則表達式,第三方解析庫如Beautifulsoup,pyquery等
    解析json數據:json模塊
    解析二進制數據:以b的方式寫入文件

4、保存數據
    數據庫
    文件

三 請求與響應

#http協議:		
	http://www.cnblogs.com/linhaifeng/articles/8243379.html

#Request:
	用戶將自己的信息通過瀏覽器(socket client)發送給服務器(socket server)

#Response:
	服務器接收請求,分析用戶發來的請求信息,然后返回數據(返回的數據中可能包含其他鏈接,如:圖片,js,css等)

#ps:
	瀏覽器在接收Response后,會解析其內容來顯示給用戶,而爬蟲程序在模擬瀏覽器發送請求然后接收Response后,是要提取其中的有用數據。

四 requests

#1、請求方式:
    常用的請求方式:GET,POST
    其他請求方式:HEAD,PUT,DELETE,OPTHONS

ps:用瀏覽器演示get與post的區別,(用登錄演示post)	
    post與get請求最終都會拼接成這種形式:k1=xxx&k2=yyy&k3=zzz
    post請求的參數放在請求體內:
        可用瀏覽器查看,存放於form data內
    get請求的參數直接放在url后


#2、請求url
    url全稱統一資源定位符,如一個網頁文檔,一張圖片
    一個視頻等都可以用url唯一來確定


    url編碼
    https://www.baidu.com/s?wd=圖片
    圖片會被編碼(看示例代碼)

    網頁的加載過程是:
    加載一個網頁,通常都是先加載document文檔,
    在解析document文檔的時候,遇到鏈接,則針對超鏈接發起下載圖片的請求


#3、請求頭
    User-agent:請求頭中如果沒有user-agent客戶端配置,
    服務端可能將你當做一個非法用戶
    host
    cookies:cookie用來保存登錄信息


    一般做爬蟲都會加上請求頭


#4、請求體
    如果是get方式,請求體沒有內容
    如果是post方式,請求體是format data

    ps:
    1、登錄窗口,文件上傳等,信息都會被附加到請求體內
    2、登錄,輸入錯誤的用戶名密碼,然后提交,就可以看到post,正確登錄后頁面通常會跳轉,無法捕捉到post 

五 response

#1、響應狀態
    200:代表成功
    301:代表跳轉
    404:文件不存在
    403:權限
    502:服務器錯誤

#2、Respone header
    set-cookie:可能有多個,是來告訴瀏覽器,把cookie保存下來
    
#3、preview就是網頁源代碼
    最主要的部分,包含了請求資源的內容
    如網頁html,圖片
    二進制數據等

六 案例

1.爬取搜狗首頁的源碼數據

import requests  #導入requests模塊
url = "https://www.sogou.com/" #請求路徑url
response = requests.get(url=url)  #發送請求
sougou_text = response.text   #獲取響應數據  返回的是 unicode 型的文本數據 
with open ('sougou.html','w',encoding='utf-8') as f:  #持久化存儲
    f.write(sougou_text)

2.基於搜狗編寫簡單的網頁采集

import requests
search = input('輸入要搜索的內容:')   #會自動生成一個input框
url="https://www.sogou.com/web"     #請求路徑
params={
    'query':search     #存儲的就是動態的請求參數
    				  #一定需要將params作用到請求中
					  #params參數表示的是對請求url參數的封裝
}

# headers參數是用來實現UA偽裝
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
response = requests.get(url=url,params=params,headers=headers)   #發起請求
response.encoding='utf-8' ##手動修改響應數據的編碼

respones_text = response.text  #獲取響應對象
filename = search+'.html'   #注意這個html  是 .html,不加這個點只會得到html字符型的數據

with open(filename,'w',encoding='utf-8') as f:#持久化存儲
    f.write(respones_text)
print(search+'獲取成功')

3.爬取豆瓣電影的電影詳情數據

import requests
start = input('請輸入開始數據')
limit = input('請輸入數據個數')
url="https://movie.douban.com/j/chart/top_list"
parmas={
    'type': '5',
    'interval_id' :'100:90',
    'action': '',
    'start': start,
    'limit': limit,
}
'''
data={
    'on': 'true',
    'page': '1',
    'pageSize':'15',
    'productName': '',
    'conditionType': '1',
    'applyname': '',
    'applysn':'',
}
'''
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
response = requests.get(url=url,params=params,headers=headers) #post請求的格式為:requests.post(url=url,headers=headers,data=data)
movie_list = response.json()   #把響應的格式進行轉換

f = open('dbmovie.txt','w',encoding='utf-8')
for dict in movie_list:  #循環,字典格式數據
    title = dict['title']
    score = dict['score']
    f.write(title+':'+ score+'\n')
    print(title,'獲取成功')
f.close()

4.獲取斗圖網的一張圖片

方式一:

斗圖網:http://www.doutula.com/
import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
url = 'http://ww4.sinaimg.cn/large/6af89bc8gw1f8op8nin2ug206t05k7s0.gif' # 圖片的地址鏈接
image = requests.get(url=url,headers=headers).content # content,因為返回圖片的數據類型是bytes類型,所以用content,類似於圖片,音頻,視頻類的數據用content解碼
with open('./img.jpg','wb') as f:
    f.write(image)

方式二:

from urllib import request  # 導入urllib
url = 'http://ww4.sinaimg.cn/large/6af89bc8gw1f8op8nin2ug206t05k7s0.gif'
request.urlretrieve(url,'./image2.jpg')  # urlretrieve需要的參數,url和存儲
# urllib把發送請求和持久化存儲封裝,urllib是一個請求模塊,比較老
# 不可以使用UA偽裝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM