預備知識
HTML
www.w3school.com.cn/html/html_j…
- 全稱:超文字標記語言
- 標記語言:一套標記標籤(markup language)
- 作用:使用標記標籤描述網頁
HTML標籤
- 成對出現
- 是<>括起的關鍵詞
HTML 文件=網頁
-
作用:描述網頁
-
包含:HTML標籤和純文字
-
瀏覽器使用標籤解釋頁面內容,不顯示HTML標籤
-
html參考手冊
<html>
<body>
<h1>此處文字被顯示為標題</h1>
<p>此處文字被顯示為段落</p>
</body> #body之間的文字是可見頁面內容
</html> #html之間的文字是描述頁面
複製程式碼
XML
www.w3school.com.cn/xml/xml_int…
HTML 被設計用來顯示資料。
XML 被設計用來傳輸和儲存資料。XML 標籤沒有被預定義,需要自行定義標籤。
安裝requests和beautifulsoup4過程中出現的問題
1)報錯:需要升級pip;
2)升級pip報錯:No module named pip
原因:windows的命令許可權不足
解決方法:右鍵命令提示符程式,以管理員身份執行 ,切換到python的安裝包目錄,不要進入scripts,再執行:python -m pip install --upgrade pip
pip的使用
- 安裝:pip install 模組名
- 解除安裝:pip uninstall 模組名
- pip 安裝模組無法執行->easy_install(同pip)
- pip、easy_install都不可行:官網下原始碼安裝或找官網上的一鍵安裝包字尾名msi。有時需安裝類似VCforpython的環境檔案
使用Pycharm安裝Python第三方庫
File->settings->project->project Interpreter->點選上面介面右上角的“+”->在搜尋框中搜尋需要安裝的第三方庫->點選介面左下角的Install Package進行安裝即可
注意:安裝的版本要匹配Python版本
簡單爬蟲
注意
編碼格式問題
-
Python3預設utf8,Python預設的編碼格式不能識別漢字
-
資料亂碼:可能是資料使用gbk2312或gbk編碼,而Python3預設utf8,解碼方式錯誤
-
html文字編碼格式會宣告在響應頭和html的head標籤的meta標籤裡。 有時響應頭可能沒有宣告編碼
解決方法->使用chardet模組自動識別
爬蟲被識別
- requests 模組在生成請求時不帶Cookie,User-Agent寫為python
解決方法->修改requests請求頭部
headers = {
"User-Agent": "",
"Cookie": ""}
response = requests.get(URL, headers=headers)
複製程式碼
用XPath遍歷html文件
- 教程:www.w3school.com.cn/xpath/index…
- 原因:BeautifulSoup模組通過標籤的class,id等屬性鎖定標籤的位置,但有的標籤壓根就沒有class和id屬性用,XPath允許通過多渠道定位目標,可用XPath來定位標籤。
- 優點:BeautifulSoup直接去根據class定位標籤,若想改成根據標籤名定位標籤,需要修改python程式碼、呼叫的BeautifulSoup的方法和傳進去的引數;使用XPath定位,則只需改變傳進去的引數,甚至可以把XPath存進資料庫,改動時開啟資料庫即可。
流程:資料獲取->資料處理->資料儲存
示例(獲取和處理)
import requests
from bs4 import BeautifulSoup
html=requests.get('https://movie.douban.com/top250?start=0')
soup = BeautifulSoup(html.text, 'html.parser')
for item in soup.find_all('div',"info"):
title=item.div.a.span.string #獲取標題
yearline=item.find('div','bd').p.contents[2].string #獲取年份那一行
yearline=yearline.replace(' ','') #去掉這一行的空格
yearline=yearline.replace('\n','') #去掉這一行的回車換行
year=yearline[0:4] #只取年份前四個字元
print(title,'\t',year)
複製程式碼
利用for迴圈自動採集10個頁面的資料
import requests
from bs4 import BeautifulSoup
start=0
for n in range(0,10):
html=requests.get('https://movie.douban.com/top250?start='+str(start))
start+=25
soup = BeautifulSoup(html.text, 'html.parser')
for item in soup.find_all('div',"info"):
title=item.div.a.span.string #獲取標題
yearline=item.find('div','bd').p.contents[2].string #獲取年份那一行
yearline=yearline.replace(' ','') #去掉這一行的空格
yearline=yearline.replace('\n','') #去掉這一行的回車換行
year=yearline[0:4] #只取年份前四個字元
print(title,'\t',year)
複製程式碼