python爬蟲編程實踐task1

0 前期準備

知識目標:
瞭解http基礎,html基礎,嘗試使用request-get爬取豆瓣電影信息,瞭解api的使用

0-1 Window 下安裝配置ChromeDriver

(1)點擊瀏覽器最右上角圖標的查看瀏覽器版本

依次:最右上角home圖標-幫助-關於GoogleChrome
可以看出在這裏插入圖片描述可以看出我的瀏覽器版本是75.0.3770.100

(2) 下載對應的ChromeDriver(是個.exe文件)

http://npm.taobao.org/mirrors/chromedriver/
在這裏插入圖片描述
這裏有三個類似的,我選擇的75.0.3770.140,可正常使用,說明最後的幾位不相同也可

(3)將下載好的ChromeDriver.exe文件放在Chrome的根目錄下: 我的是

在這裏插入圖片描述
另外,如果想要在anaconda中使用,則需把ChromeDriver.exe文件放在anaconda的scripts目錄下:
在這裏插入圖片描述

(4)配置環境變量:

右鍵點擊我的電腦----->屬性—>高級系統設置---->環境變量------>在path路徑下添加上文中瀏覽器

.文件所在的根目錄
需要注意的是:配置完環境變量後需要重啓電腦纔會生效!!!

0-2 配置其項目運行的相關環境

(1)創建虛擬環境

使用conda 創建基於python3.6的初始環境
在這裏插入圖片描述
這裏踩了一個坑,報錯如下:
在這裏插入圖片描述
解決方法:
找到.condarc文件
刪掉channels下面的 -defaults一行
就ok啦。

(2)激活環境

activate spider_py

(3)將環境添加到jupyter中

python -m ipykernel install --user --name spider_py --display-name spider_py

如此,我們就可以在jupyter的kernel中找到我們新建的環境了
在這裏插入圖片描述

1、基礎知識

1-1 HTTP

HTTP是一個客戶端(用戶)和服務器端(網站)之間進行請求和應答的標準。
HTTP的請求方法有很多種,主要包括以下幾個:

GET:向指定的資源發出“顯示”請求。GET方法應該只用於讀取數據,而不應當被用於“副作用”的操作中(例如在Web Application中)。其中一個原因是GET可能會被網絡蜘蛛等隨意訪問。

HEAD:與GET方法一樣,都是向服務器發出直頂資源的請求,只不過服務器將不會出傳回資源的內容部分。它的好處在於,使用這個方法可以在不必傳輸內容的情況下,將獲取到其中“關於該資源的信息”(元信息或元數據)。

POST:向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求文本中。這個請求可能會創建新的資源或修改現有資源,或二者皆有。

PUT:向指定資源位置上傳輸最新內容。

DELETE:請求服務器刪除Request-URL所標識的資源,或二者皆有。

TRACE:回顯服務器收到的請求,主要用於測試或診斷。

OPTIONS:這個方法可使服務器傳回該資源所支持的所有HTTP請求方法。用“*”來代表資源名稱向Web服務器發送OPTIONS請求,可以測試服務器共能是否正常。

CONNECT:HTTP/1.1 協議中預留給能夠將連接改爲管道方式的代理服務器。通常用於SSL加密服務器的連接(經由非加密的HTTP代理服務器)。方法名稱是區分大小寫的。當某個請求所針對的資源不支持對應的請求方法的時候,服務器應當返回狀態碼405(Method Not Allowed),當服務器不認識或者不支持對應的請求方法的時候,應當返回狀態碼501(Not Implemented)。

1-2 網頁基礎

網頁是由 HTML 、 CSS 、JavaScript 組成的。

HTML 是用來搭建整個網頁的骨架,
CSS 是爲了讓整個頁面更好看,包括我們看到的顏色,每個模塊的大小、位置等都是由 CSS 來控制的, 
JavaScript 是用來讓整個網頁“動起來”,這個動起來有兩層意思,一層是網頁的數據動態交互,還有一層是真正的動,比如我們都見過一些網頁上的動畫,一般都是由 JavaScript 配合 CSS 來完成的。

2 初步學習與實踐

一個網絡爬蟲程序最普遍的過程:

訪問站點;
定位所需的信息;
得到並處理信息。

2-1 嘗試使用request-get爬取豆瓣電影信息

import requests
import os

if not os.path.exists('image'):   #檢查輸出路徑是否存在,不存在則創建
     os.mkdir('image')

def parse_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}   
        #模擬瀏覽器發送的Request Headers中的User-Agent
    res = requests.get(url, headers=headers)
    text = res.text
    item = []
    for i in range(25):
        text = text[text.find('alt')+3:]
        item.append(extract(text))
    return item
       
def extract(text):
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image

def write_movies_file(item, stars):
    print(item)
    with open('douban_film.txt','a',encoding='utf-8') as f:
        f.write('排名:%d\t電影名:%s\n' % (stars, item[0]))
    r = requests.get(item[1])
    with open('image/' + str(item[0]) + '.jpg', 'wb') as f:
        f.write(r.content)
        
def main():
    stars = 1
    for offset in range(0, 250, 25):
        url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
        for item in parse_html(url):
            write_movies_file(item, stars)
            stars += 1

if __name__ == '__main__':
    main()

2-2 瞭解api的使用

下面以百度地圖提供的API爲例

首先我們打開鏈接:http://lbsyun.baidu.com/apiconsole/key 填寫自己的信息
郵箱激活後點擊申請密鑰,然後填入下圖信息,注意應用類型選擇瀏覽器端
點擊提交後就可以獲得AK了

下面以兩個小例子展示一下AK的作用:

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
	<style type="text/css">
		body,
		html,
		#allmap {
			width: 100%;
			height: 100%;
			overflow: hidden;
			margin: 0;
			font-family: "微軟雅黑";
		}
	</style>
	<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak="></script> //在 ak=後面輸入你的ak
	<title>地圖展示</title>
</head>

<body>
	<div id="allmap"></div>
</body>

</html>
<script type="text/javascript">
	// 百度地圖API功能
	var map = new BMap.Map("allmap"); // 創建Map實例
	map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地圖,設置中心點座標和地圖級別
	//添加地圖類型控件
	map.addControl(new BMap.MapTypeControl({
		mapTypes: [
			BMAP_NORMAL_MAP,
			BMAP_HYBRID_MAP
		]
	}));
	map.setCurrentCity("北京"); // 設置地圖顯示的城市 此項是必須設置的
	map.enableScrollWheelZoom(true); //開啓鼠標滾輪縮放
</script>

然後用Chrome打開這個文件,效果如下圖所示:
在這裏插入圖片描述
第2個例子:

import requests

def getUrl(*address):
    ak = ''  ## 填入你的api key
    if len(address) < 1:
        return None
    else:
        for add in address:   
            url = 'http://api.map.baidu.com/geocoding/v3/?address={0}&output=json&ak={1}'.format(add,ak)  
            yield url
            

def getPosition(url):
    '''返回經緯度信息'''
    res = requests.get(url)
    #print(res.text)
    json_data = eval(res.text)
    
    if json_data['status'] == 0:
        lat = json_data['result']['location']['lat'] #緯度
        lng = json_data['result']['location']['lng'] #經度
    else:
        print("Error output!")
        return json_data['status']
    return lat,lng

if __name__ == "__main__":
    address = ['北京市清華大學','北京市北京大學','保定市華北電力大學','上海市復旦大學','武漢市武漢大學']
    for add in address:
        add_url = list(getUrl(add))[0]
        print('url:', add_url)
        try:
            lat,lng = getPosition(add_url)
            print("{0}|經度:{1}|緯度:{2}.".format(add,lng,lat))
        except Error as e:
            print(e)

輸出入下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章