爬蟲是什麼,如何通過爬蟲獲取貼吧數據?

本章所講內容:

1、 爬蟲的概念

2、 Beautifulsoup 概念

3、 beautifulsoup操作

實戰:爬取百度貼吧圖片

實戰:爬取不得姐視頻

1、 爬蟲的概念

爬蟲(spider:網絡蜘蛛):是一個用腳本代替瀏覽器請求服務器獲取服務器資源的程序。

爬蟲的用處

數據收集

數據的範圍,數據存儲

數據比對

倒買倒賣

模擬操作

模擬登陸

暴力登陸

代碼登陸

瀏覽器驅動登陸

評論、購票

自動化測試,壓力測試

接口操作

爬蟲的原理:

說到底,我們的爬蟲是模擬web請求,不論學習什麼框架我們都需要對http協議的請求和響應有所瞭解:

爬蟲是什麼,如何通過爬蟲獲取貼吧數據?

簡單的瞭解一下這幅圖。

2、beautifulsoup

如果一個正則匹配稍有差池,那可能程序就處在永久的循環之中,而且有的小夥伴們也對寫正則表達式的寫法用得不熟練,沒關係,我們還有一個更強大的工具,叫Beautiful Soup,有了它我們可以很方便地提取出HTML或XML標籤中的內容,實在是方便,這一節就讓我們一起來感受一下Beautiful Soup的強大吧。

什麼是Beautiful Soup

簡單來說,Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取數據。

官方解釋如下:

Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。

Beautiful Soup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。然後,你僅僅需要說明一下原始編碼方式就可以了。

Beautiful Soup已成為和lxml一樣出色的python解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,如果我們不安裝它,Python 會使用 Python默認的解析器,lxml 解析器更加強大,速度更快,推薦安裝。

2.2.1 安裝與使用

1、安裝pip install bs4

2、使用

首先必須要導入 bs4 庫, 創建BeautifulSoup對象

from bs4 import BeautifulSoup as BS
text = '''
<html>
<head>
<meta = charset='UTF-8' >
<title id =1 href = 'http://example.com/elsie' class = 'title'>Test</title>
</head>
<body>
<div class = 'ok'>
<div class = 'nice'>
<p class = 'p'>
Hello World
</p>
<p class = 'e'>
風一般的男人
</p>
</div>
</div>
</body>
</html>
'''
soup = BS(text,"lxml")#前面是要解析的內容,後面是指定的解析器
print(soup.prettify())#轉換字符串
print(type(soup.prettify()))
print(type(soup))

1、 解析器的分類

什麼是網頁解析器,簡單的說就是用來解析html網頁的工具,準確的說:它是一個HTML網頁信息提取工具,就是從html網頁中解析提取出“我們需要的有價值的數據”或者“新的URL鏈接”的工具。

爬蟲是什麼,如何通過爬蟲獲取貼吧數據?

Beautiful Soup將複雜HTML文檔轉換成一個複雜的樹形結構,每個節點都是Python對象,所有對象可以歸納為4種:

1、Tag 就是Html中的標籤,包含name和attrs

我們可以利用 soup加標籤名輕鬆地獲取這些標籤的內容,是不是感覺比正則表達式方便多了?不過有一點是,它查找的是在所有內容中的第一個符合要求的標籤,如果要查詢所有的標籤,我們在後面進行介紹。

#獲取title標籤

print(soup.title)

#獲取標籤的名字

print(soup.title.name)

#獲取標籤的內容

print(soup.title.text)

#獲取標籤的屬性

print(soup.title.attrs)

#指定標籤的某個屬性

print(soup.title.get('class'))

2、NavigableString 獲取標籤的內容

#獲取title標籤中的內容

print(soup.title.string)

#獲取p標籤中的內容

print(soup.p.string)

3、Beautifulsoup

BeautifulSoup 對象表示的是一個文檔的全部內容.大部分時候,可以把它當作 Tag 對象,是一個特殊的 Tag,我們可以分別獲取它的類型,名稱,以及屬性。

4、Comment 註釋

Comment 對象是一個特殊類型的 NavigableString 對象,其實輸出的內容仍然不包括註釋符號,但是如果不好好處理它,可能會對我們的文本處理造成意想不到的麻煩。所以要先進行判斷是否是註釋,再輸出。

2.2.2 搜索文檔樹

find()和find_all()

find_all()方法搜索當前tag的所有tag子節點,並判斷是否符合過濾器的條件。

find()和find_all()的區別就是,find直接返回元素的一個結果,find_all返回元素列表

find_all( name , attrs , recursive , text , **kwargs )簡介一下參數

name 參數可以查找所有名字為name的tag,字符串對象會被自動忽略掉;name參數可以傳入字符串、正則表達式、列表、True、自定義的方法等但是各自代表的含義不一樣。

字符串,在搜索方法中傳入一個字符串參數,Beautiful Soup會查找與字符串完整匹配的內容。

print(soup.find('body'))

print(soup.find_all('body')

正則表達式,Beautiful Soup會通過正則表達式的match()來匹配內容列表,Beautiful Soup會將與列表中任一元素匹配的內容返回。

#獲取所有p標籤的內容

import re

print(soup.find_all(re.compile("^p")))

如果匹配成功將會匹配所有的tag

如果一個指定名字的參數不是搜索內置的一些參數名,搜索時會把該參數當作指定名字tag的屬性來

搜索;例如id=1

如果包含一個名字為 id 的參數,Beautiful Soup會搜索每個tag的”id”屬性;

如果傳入 href 參數,Beautiful Soup會搜索每個tag的”href”屬性;

使用多個指定名字的參數可以同時過濾tag的多個屬性;

對於class ,可以使用class_來搜索

import re

print(soup.find_all(href = re.compile('elsie'),id=1))

#返回這個class=‘p’的標籤內容。

print(soup.find_all('p',class_='p'))

對於某些tag屬性不能通過搜索得到值,可以使用attrs參數得到

#返回class為e的標籤

print(soup.find_all(attrs={'class':'e'}))

2.2.3 CSS選擇器

我們在寫 CSS 時,標籤名不加任何修飾,類名前加點,id名前加 #,在這裡我們也可以利用類似的方法來篩選元素,用到的方法是 soup.select(),返回類型是list。

#通過標籤查找

print(soup.select('title'))

#通過類名查找

print(soup.select('.nice'))

#通過id查找

print(soup.select('#ok'))

練習一爬取百度貼吧

from bs4 import BeautifulSoup
import requests
#爬取目標網頁
html = requests.get("https://tieba.baidu.com/p/5950745302").text
#解析網頁
result = BeautifulSoup(html,"html.parser")
#獲取所有的圖片img
result_imgs = result.find_all("img",class_="BDE_Image")
i=1
for result_img in result_imgs:
#獲取鏈接
img_url = result_img['src']
#獲取文件
result_img_content=requests.get(img_url).content
#聲明文件名
file_name = './images/'+str(i)+".jpg"
#保存圖片
with open(file_name,"wb") as wf:
wf.write(result_img_content)
i+=1
#逐個將圖片保存到本地

練習二爬取不得姐

from bs4 import BeautifulSoup
import requests
import re,time
url="http://www.budejie.com/video/"
def get_page(url,data=None):
header={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
html = requests.get(url,headers=header)
soup=BeautifulSoup(html.text,"html.parser")
lists = soup.findAll('a',href=re.compile('http://svideo.spriteapp.com/video/2019/(.*?).mp4'))
print(lists)
a = 0
for i in lists:
a+=1
url_href = i.get("href")
print(url_href)
req= requests.get(url_href)
print("num"+str(a)+"video")
with open(str(time.time())+".mp4","wb") as file:
file.write(req.content)
def get_more_pages(start,end):
for one in range(start,end):
get_page(url+str(one))
time.sleep(2)
if __name__ == '__main__':
get_more_pages(1,2)

相關推薦

推薦中...