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()
執行完出現我們需要的文件
開啟就是我們需要的文字了