1. 程式人生 > >Python爬蟲爬取網頁資料並存儲(一)

Python爬蟲爬取網頁資料並存儲(一)

環境搭建

1.需要事先安裝anaconda(或Python3.7)和pycharm
*anaconda可在中科大映象下下載較快
2.安裝中遇到的問題:
*anaconda(記得安裝過程中點新增路徑到path裡,沒新增的話手動新增:
計算機右鍵屬性——高階系統設定——環境變數——使用者/系統變數path路徑中,新增 C:\Users\Aurora\Anaconda3;(anaconda安裝路徑))
開啟jupyter notebook ,出現頁面空白解決方案:
開啟 C:\Users\自己的使用者名稱.jupyter\jupyter_notebook_config.py
在末尾輸入以下程式碼:
import webbrowser
webbrowser.register(“Chrome”, None, webbrowser.GenericBrowser(u"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"))
c.NotebookApp.browser = u’Chrome’
##瀏覽器名,瀏覽器路徑(通過右鍵屬性可以看到路徑)

 *anaconda ,開啟cmd/anaconda prompt,輸入conda list 即可檢視已有的包,還需新增可用 conda install package_name 來新增
 在本次網路爬蟲過程中,我們需要的庫有: re,urllib(這兩個庫為Python內建庫,不需要新增),requests,lxml(anaconda中已存在,Python3.7安裝裝需要使用pip,下載whl軟體),beautifulsoup4,json

 *pycharm基礎設定問題:
     設定為conda環境下Python3.7

爬蟲基本原理

什麼是爬蟲?
爬蟲是請求網站並提取資料的自動化程式

從簡單的例子開始:
我們隨便開啟一個網站,我們在百度上搜索新聞,右鍵,審查元素
在這裡插入圖片描述
會得到這樣一個響應,點Name那一欄唯一的一個news.baidu.com,我們會發現以下資訊:
在這裡插入圖片描述
我們就通過這些html程式碼來獲取資訊。
讓計算機代替人工來提取資訊就是我們要用Python所要實現的任務。
所以我們就可以通過以上過程總結爬蟲的基本原理
1.發出請求:即發出一個Request
2.獲取響應內容:如果伺服器正常響應就可以得到一個Response
3.解析內容:得到的內容是HTML,可以用正則表示式,網頁解析庫進行解析。
4.儲存資料

urllib庫使用

urllib.request 請求模組

//簡單使用
import urllib.request request = urllib.request.Request('http://www.baidu.com') response = urllib.request.urlopen(request) print(response.read(),decode('utf-8'))

urllib.error 異常處理模組

urllib.parse url解析模組

urllib.robotparser robots.txt解析模組

(建議用下面的requests庫而不使用urllib庫)

requests庫使用

解析json

//
import json
import requests
response = request.get("http://httpbin.org/get")
print(response.json())
//新增headers引數(應對一些反爬蟲的最簡單的方法)
//以貓眼電影top100為例
 import requests
 url = 'https://maoyan.com/board/4?offset=0'
 headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
 response = requests.get(url,headers = headers)
 response.encoding = 'utf-8'

正則表示式

正則表示式
在這裡插入圖片描述
在這裡插入圖片描述

一個示例

import requests
from requests.exceptions import RequestException
import re
import json

def get_one_page(url,headers):
   try:
        response = requests.get(url,headers = headers)
        response.encoding = 'utf-8'
        if response.status_code == 200:
            return response.text
        return None
   except RequestException:
       return None

def parse_one_page(html):
//提取網頁資訊的正則表示式
    pattern = re.compile('<dd>.*?board-index.*?>(\d*)</i>.*?data-src="(.*?)".*?name"><a'
                         +'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)(/p)'
                         +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)  
    items = re.findall(pattern,html)
    for item in items:
        yield {
            'index':item[0],
            'image': item[1],
            'title': item[2],
            'actor': item[3].strip()[3:],
            'time': item[4].strip()[5:],
            'score': item[5]+item[6]
        }
//寫入result.txt檔案中
def write_to_file(content):
    with open('result.txt', 'a') as f:
        f.write(json.dumps(content) + '\n')
        f.close()


def main():
//貓眼電影爬取需新增headers,從使用者角度訪問
    url = 'https://maoyan.com/board/4?offset=0'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = {'User-Agent': user_agent}
    html = get_one_page(url, headers)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)


if __name__ == '__main__':
    main()

執行結果:
在這裡插入圖片描述
上述例子為抓取一頁資訊並存儲,若要抓取多頁的資訊,需要引入Pool模組,用多執行緒併發抓取,如下構造:

def main(offset):
    url = 'https://maoyan.com/board/4?offset=0'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = {'User-Agent': user_agent}
    html = get_one_page(url, headers)
     for item in parse_one_page(html):
        print(item)
        write_to_file(item)
if __name__ == '__main__':
    p = Pool()
    p.map(main.[i*10 for i in range(10)]