最近想從一個網站上下載資源,懶得一個個的點擊下載了,想寫一個爬蟲把程序所有下載下來,在這裏作一個簡單的記錄css
Python的基礎語法在這裏就很少作敘述了,黑馬程序員上有一個基礎的視頻教學,能夠跟着學習一下html
本篇博客爲基礎章:利用Python從網頁端抓取數據,閒話很少說,開始正題:python
首先須要學習這幾個模塊:git
1 webbrowser:Python自帶的模塊,打開瀏覽器獲取到指定的頁面程序員
2 requests:從英特網上下載文件和網頁github
3 Beautiful Soup:解析HTML,即網頁編寫的格式web
4 selenium:啓動並控制一個Web瀏覽器。selenium可以填寫表單,並模擬鼠標在這個瀏覽器上點擊shell
1 webbrowser模塊:瀏覽器
能夠利用.open()方法打開指定的Url。例如在idea中輸入以下代碼:ide
運行Python文件,系統會自動打開一個瀏覽器,打開百度
2 requests模塊:
這是一個第三方模塊,須要先從網上下載:
我在Python的運行環境下報錯:
切換到cmd環境:
安裝成功,在項目中加載requests模塊:
1 import requests 2 # 調用requests.get()下載文件 3 res = requests.get('http://www.gutenberg.org/files/57156/57156-h/57156-h.htm') 4 # 確保程序正在下載失敗時候中止 5 res.raise_for_status() 6 # Python文件使用「wb」方式打開,寫入字符串會報錯,由於這種打開方式爲: 7 # 以二進制格式打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 8 playFile = open('test.txt','wb') 9 # 利用iter_content()方法作循環 10 # 一段爲10000字節 11 for chuck in res.iter_content(10000): 12 playFile.write(chuck) 13 playFile.close()
這裏放兩個對於這個模塊寫的比較詳細的Blog:
2.1 快速上手
2.2 用法總結
3 Beautiful Soup模塊:
用於從html中提取元素信息
首先安裝第三方模塊:
在項目中加載
首先在項目中添加名爲example的html網頁,代碼以下:
<html><head><title>The Website Title</title></head> <body> <p>Download my <strong>Python</strong> book from <a href="http://inventwithpython.com">my website</a>.</p> <p class="slogan">Learn Python the easy way!</p> <p>By <span id="author">Al Sweigart</span></p> </body></html>
顯示效果以下:
示例代碼以下:
1 import requests,bs4 2 3 exampleFile = open('example.html') 4 exampleSoup = bs4.BeautifulSoup(exampleFile.read(),"html.parser") 5 print('----------經過id----------') 6 # 返回一個帶有id = "author" 的元素,將這個Tag對象的列表保存在變量elems中 7 elems = exampleSoup.select("#author") 8 print(type(elems)) 9 # 列表中只有一個Tag對象,只有一次匹配 10 print(len(elems)) 11 print(type(elems[0])) 12 # 元素的文本 13 print(elems[0].getText()) 14 # 一個字符串,包含開始和結束標籤,以及該元素的文本 15 print(str(elems[0])) 16 # 字典,包含元素的屬性以及屬性值 17 print(elems[0].attrs) 18 print() 19 print('----------經過元素----------') 20 pelements = exampleSoup.select('p') 21 print(len(pelements)) 22 print(str(pelements[0])) 23 print(pelements[0].getText()) 24 print(str(pelements[1])) 25 print(pelements[1].getText()) 26 print() 27 print('----------經過屬性----------') 28 spqnelem = exampleSoup.select('span')[0] 29 print(len(spqnelem)) 30 print(str(spqnelem)) 31 print(spqnelem.get('id')) 32 print(spqnelem.attrs)
運行結果如圖所示:
值得一提的是,一開始在項目運行的時候嗎,爆出以下的錯誤:
解決方法很簡單,在調用bs4.BeautifulSoup()函數時添加「html.parser」參數
一些經常使用的css選擇器的模式:
傳遞給select()方法的選擇器 | 將匹配爲... |
soup.select('div’) | 全部名爲<div>的元素 |
soup.select('#author’) | 帶有id屬性爲author的元素 |
soup.select('.notice’) | 全部使用css class屬性爲notice的元素 |
soup.select('div span’) | 全部在<div>元素以內的<span>元素 |
soup.select('div>span’) | 全部直接在<div>元素以內的<span>元素,中間沒有其餘元素 |
soup.select('input[name]’) | 全部名爲<input>,並有一個name屬性,其值無所謂的元素 |
soup.select('input[type = 'button']’) | 全部名爲<input>,並有一個type屬性,其值爲button的元素 |
最後貼一個BeautifulSoup的文檔以便參考
4 selenium模塊:
該模塊可讓Python直接控制瀏覽器
首先導入模塊,方法與以前的略有不一樣,首先須要下載壓縮包,直接運行會報錯:
解壓後在當前文件夾運行pip install selenium,按住Shift,右鍵選擇在此處打開Powershell窗口
在項目中導入模塊,方法較以前幾個模塊,略有不一樣,示例代碼以下:
1 from selenium import webdriver 2 import time 3 bo = webdriver.Firefox() 4 bo.get('https://www.baidu.com/') 5 # 模擬點擊頁面按鈕 6 link = bo.find_element_by_partial_link_text('貼吧') 7 link.click() 8 # 模擬填寫表單並註冊 9 bo.get('https://mail.qq.com/cgi-bin/loginpage') 10 bo.switch_to.frame('login_frame') 11 bo.find_element_by_css_selector('#switcher_plogin').click() 12 emailelem = bo.find_element_by_id('u') 13 emailelem.send_keys('帳號') 14 passelem = bo.find_element_by_id('p') 15 passelem.send_keys('密碼') 16 passelem.submit()
運行時報如下錯誤:
缺乏geckodriver文件,在這裏找到對應的版本後,下載以後解壓到Python.exe和FireFox所在的文件夾裏面便可