1. 程式人生 > >python爬蟲【一】爬取文字

python爬蟲【一】爬取文字

我們在安裝py是建議如果使用windows不要安裝原生的py因為windows的c編譯器原因會使某些套件安裝起來有麻煩

也就是安裝anaconda版本的pyhttps://www.anaconda.com/download/#windows

py官網下載的是原生版本https://www.python.org/

本文爬取文字使用原生python進行演示

爬蟲的原理就是模仿人類登入不同的網頁 然後使用開發者工具來獲得伺服器傳回的資訊 將其按照特定格式儲存起來

簡單說就是ETL(資料獲取extract,資料轉換translation,資料儲存loading)

 

如果文中的程式碼直接複製進py的編輯器會打亂  呢就先copy到notepad++  然後在copy到編輯器就ok了

 

我們以chrome瀏覽器為示例

首先我們開啟一個頁面右鍵檢查 或者使用f12

點選重新整理/或按下f5我們可以看到伺服器返回的內容 

 

我們可以看到 我們需要的內容

 

這裡可以看到一個get我們要注意這裡有了這些經驗我們就可以開始利用無所不能的python來完成這些過程 

我們在安裝過程中一定要注意是在cmd下安裝不能再python環境下安裝!!! 

py環境會失敗

開啟cmd輸入

pip install requests
pip install beautifulsoup4

同理安裝 anaconda 的庫

然後安裝jypyter

下面安裝完成後只需要輸入

會自動開啟瀏覽器 我們通過一個port訪問自己電腦 然後可以建立python的專案

下面我們開始寫一個程式模擬人類點選的過程

但是因為我們爬取文字等拿原生py就可以做到我們就不使用anaconda作為案例了

下面我們開啟notepad++這個文字編輯器有中文版並且免費

https://notepad-plus-plus.org/

或者直接使用py的idle互動式編譯器

在這裡直接複製網址 

我們執行就可以獲取獲取網頁html的所有內容

 這樣我們的第一隻爬蟲就寫好了,但是怎樣獲取到我們需要的資訊呢?

import requests
res = requests.get('http://www.jinyongwang.com/shen/781.html')
res.encoding = 'utf-8'
print(res.text)

點選f5執行我們會發現程式會卡死這是因為我們開啟的文字太多了

所以我們需要將爬取的文字放入二進位制檔案

並且刪除標籤 選擇正確的內容

現在我們強行關閉shell

加入程式碼可以爬出前500行的程式碼

import requests
url='http://www.jinyongwang.com/shen/781.html'
r = requests.get(url,timeout=30)
type(r) 		#檢視型別
print(r.text[:500])	#顯示前500位元組內容
print(r.status_code)    #顯示狀態碼

 

下面我們使用beautifulsoup

先來看html的結構

bs4套件的使用模板

import requests
from bs4 import BeautifulSoup
url = 'https://python123.io/ws/demo.html' 
r =  requests.get(url,timeout=30)
r.encoding = r.apparent_encoding      
#分析頁面內容,以中文編碼顯示
html = r.text
soup = BeautifulSoup(html, 'html.parser') 

#訪問head、body、a、p、b
soup.find_all(‘a’)、soup.body.contents、soup.prettify()

使用beautifulsoup尋找標籤

url = http://news.qq.com/a/20170504/012032.htm
div.hd	L131
div.a_info	L135
P.text	L164


title = soup.select("div.hd > h1")
time = soup.select("div.a_Info > span.a_time")
paras = soup.select("div.Cnt-Main-Article-QQ > p.text")

我們注意py中是不需要宣告變數的

尋找特定的HTML標籤

找到h1標籤的文字

soup = BeautifulSoup(html_sample)

header = soup.select('h1')  #h1可以改成任意標籤

print(header)

print(header[0])            #去除中括號保留標籤和文字

print(header[0].text)       #去除標籤保留文字

尋找特定css元素

id類

id名前加#

 alink = soup('#title')

print(laink)

class類

class名前加.

soup = BeautifulSoup(html_sample)

for link in soup.select('.link'):

    print(link)

取得標籤中的屬性

取得所有a標籤的連結

a tag找出所有herf(超連結)的連結

a = '<a herf="#" qwe=123 asd=456>i am a link</a>'
soup = BeautifulSoup(a,'html.parser')
print(soup.select('a')[0]['href'])
print(soup.select('a')[0]['qwe'])

 

儲存文字檔案

fo = open("text.txt", "w+")
    fo.writelines(title[0].get_text() + "\n")
    fo.writelines(time[0].get_text() + "\n")
    for para in paras:
        if len(para) > 0:
            fo.writelines(para.get_text() + "\n\n")
    fo.writelines(author[0].get_text() + '\n')
    fo.close()

於是我們將程式碼結合寫出一個爬蟲將小說寫入二進位制檔案中

import re
import requests
from bs4 import BeautifulSoup
def getHTML(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def getContent(url):
    html = getHTML(url)
    soup = BeautifulSoup(html,'html.parser')
    title = soup.select('div.mbtitle')
    paras_tmp = soup.select('p')
    paras = paras_tmp[3:]
    return paras

def saveFile(text):
    f=open('novel.txt','w')
    for t in text:
        if len(t) > 0:
            f.writelines(t.get_text() + "\n\n")
    f.close()
    
def main():
    url = 'http://www.jinyongwang.com/shen/781.html'
    text = getContent(url)
    saveFile(text)

main()

執行完出現我們需要的文件

開啟就是我們需要的文字了