爬蟲筆記(一)

Laa_L發表於2019-03-27

預備知識

HTML

www.w3school.com.cn/html/html_j…

  • 全稱:超文字標記語言
  • 標記語言:一套標記標籤(markup language)
  • 作用:使用標記標籤描述網頁

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)
複製程式碼

相關文章