零基礎掌握python網絡爬蟲


目前,本人初學網絡爬蟲,記憶一些爬蟲所遇到的問題和解決方法。對於一些環境的配置僅憑回憶,僅供參考。

零基礎:需要有些基本的編程思想例如 ifelse 和配置環境 運行程序的能力

如果有任何錯誤,例如需要在何處報錯安裝某某模塊或者配件,請提醒博主,因爲博主安裝過 所以沒報錯 就忘記提起。

環境

python3.8(語言環境) 下載與配置


python-3.8.1-amd64.exe 下載鏈接

若失效自行百度搜索下載即可(鏈接爲windows 64位系統,其他系統也自行百度下載即可)

安裝注意事項:
1、勾選Add Python 3.7 to PATH
把Python的安裝路徑添加到系統環境 變量的Path變量中,否則需要自己配置環境變量

2.選擇Install Now(默認安裝到C盤下)/ Customize installation(自定義安裝路徑)

3。自定義安裝可根據需要勾選,如果不知道默認就可以。

檢驗安裝成功;
在cmd命令行中輸入python命令
如果成功進入python交互式命令行,則安裝成功。安裝成功的話可以看到版本信息並進入編程模式

開始中搜索IDLE(在python3.8中)
運行

在這裏插入圖片描述
如果你輸入法是在中文下輸入,這時就會解讀成各種快捷鍵,十分麻煩。
爲此,我們再下載更方便的編輯器prcharm。

pycharm2019 3.3(編寫器) 下載與運行


pycharm-community-2019.3.3.exe下載鏈接
上面爲64位windows 社區版的鏈接 失效或需要其他版本自行搜索下載

安裝注意事項:
1、在Install options中僅勾選 :
64bit launcher(創建桌面快捷方式) 和.py(py文件以後默認由pycharm打開)

2、其他一路確定,然後Do not import settings,之後選擇OK,一路確定 完成安裝。

創建new project 再右鍵項目名添加Python文件即可運行python程序在這裏插入圖片描述

實例說明python編程語言特點

def add(a,b):
    return a+b # 1.遞進:按照遞進 來控制範圍 如下的a與b的定義必須對齊

a = "123"
b = '456'  #2.單引號與雙引號等價
print(add(a,b)) # 3.無分號 還是按照遞進來辨別

if a == "666":
    print(a)
else:
    print("666") # 4.僅通過遞進程序才得知 if與下面的else 是同一個判斷語句

輸出爲:

123456
666

至此,具備基本編程能力就可以邊學邊寫python爬蟲程序。




等等,下面的錯誤是什麼鬼?
unindent does not match any outer indentation level 又是什麼鬼錯誤?

在這裏插入圖片描述

原因在於python對與縮進的變態嚴格要求
可以看第一個print前面的小符號是>:利用tab鍵進行的縮進
而第二個print前面符號是.....:純粹用四個空格對齊的縮進

what the hell?而且pycharm默認是不顯示空格符號和tab符號的,也就是你們要在兩個空白中找不同。
所以如何顯示空格符號和tab符號?

File-Settings-Editor-Apperance-show whitespaces(三個小選項默認全選)




編寫第一個爬蟲:下載貓咪圖片

安裝好以上的環境以後,我們嘗試從貓咪圖片中將可愛的貓咪下載到電腦中
廢話不多說,複製粘貼跑一下試試

import urllib.request
response = urllib.request.urlopen('http://placekitten.com/g/500/600')
# 獲取網頁內容

cat_img = response.read()
# 讀取網頁內容 也就是一個圖片

fp = open('cat_500_600.jpg','wb')
fp.write(cat_img)
# fp是一個文件對象,open方法第一個屬性是文件名稱,第二個屬性是write-bytes也就是寫文件模式 本地不存在則創建
# 寫文件 屬性爲剛讀取的圖片cat_mig

如果你環境沒有問題,不報錯的你就可以去python目錄下找到這個圖片了。

另附加獲取工作目錄的代碼

import os
print (os.getcwd())#獲得當前目錄

下面來解釋上面爬蟲用到的模塊並逐句解釋上面的爬蟲程序

urllib包(主要使用parse和request模塊)

用來訪問網頁並獲取內容,是剛剛設計的爬蟲程序的核心

import urllib.request #引入該包的request 也就是請求(和響應)模塊

parse模塊

urlencode():將字典轉換爲url格式


request模塊:打開url網頁,並返回響應對象(也就是網頁內容)

最主要的方法:urlopen(url,data)
打開URL網址,返回響應對象(http.client.HTTPResponse對象)

url參數可以是一個字符串url,也就是網頁地址。

urlopen的第二個參數data是控制網頁是獲取還是提交的參數
data爲None時用get獲取,data賦值時爲post提交。所以不賦值就是默認獲取,至於何時用post提交以及兩者區別,暫且不論。

也就是說request是一種請求獲取網頁內容的方法,參數即爲網頁地址,so easy

response = urllib.request.urlopen('http://placekitten.com/g/500/600')
# 調用request模塊來獲取網頁內容 
# response爲網頁的響應對象,其中包含網頁的所有內容。

response 響應對象包括許多種方法,其中最重要的是read()方法
使用read()函數 返回未解碼的網頁內容(如字節流或圖片)

read()得到內容後用decode()函數使用對應的解碼方式,返回相應的對象(如utf-8 返回字符串)

cat_img = response.read()
# 讀取未解碼的網頁內容 此處就是一個圖片



Request:信息更完善的請求對象,包括headers(請求頭)等信息

僅僅使用 urlopen(網頁),似乎有些過於侷限,因爲隨着爬蟲技術的進展,反爬蟲技術也在發展。
許多網頁當判斷出網頁請求是來自python時就會拒絕你的訪問請求。如果網頁不讓我獲取數據怎麼辦?
僞裝成你不是python 而是真實用瀏覽器訪問的用戶。

在這裏我們主要是給python的網頁請求增加了許多屬性,例如可以將網頁請求的用戶端(反爬蟲用來判斷是否是python請求的的屬性)User-Agent

獲取User-Agent:
1)隨便打開網頁(後期根據你想要訪問的網頁來選擇),如百度
鼠標右鍵 - 檢查 - Network - 從下面幾個數據欄中隨意點擊一個 - 下拉到Request Headers - 下拉到User-Agent

在這裏插入圖片描述

此處建議使用Chrome瀏覽器。

因此,request模塊中又引入了Request模塊,就是請求網頁的信息更完善的請求對象,包括headers(請求頭)等信息
我們可以給Request對象設置一些更多的信息,然後

urllib.request.urlopen(Reqeust對象)

# 屬性是信息更完善的請求對象,當然其中要包括網頁地址。
# 而不再只是一個網頁地址

嘗試一下

import urllib.request
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}

url = 'http://placekitten.com/g/500/600'

R1 = urllib.request.Request(url=url,headers=headers)
    # R1 是Request的一個對象 其中賦值了地址和信息頭
    # 對於該網頁來說,對python沒有阻攔,所以只是示範,信息頭可以不加
    
response = urllib.request.urlopen(R1)
cat_img = response.read()
# 讀取未解碼的網頁內容 此處就是一個圖片

fp = open('cat_500_600.jpg','wb')
fp.write(cat_img)
# fp是一個文件對象,open方法第一個屬性是文件名稱,第二個屬性是write-bytes也就是寫文件模式 本地不存在則創建
# 寫文件 屬性爲剛讀取的圖片cat_mig



Request對象構造 屬性如下
Request(url = url,data = data, headers = headers,method = ‘POST’)

data參數:訪問網頁攜帶的數據,暫且不論。
要求bytes(字節流)類型,如果是一個字典,先用urllib.parse.urlencode()編碼。

data = urllib.parse.urlencode(字典).encode('utf-8')

data爲空時,method默認爲get,也就是獲取。
data不爲空時,method默認爲pos,也就是提交。




第一次使用框架

Scrapy 1.8.0 安裝與配置

暫無,建議網上搜索教程。

第一次使用框架:下載自己想要的網頁數據

建立scrapy項目

cd你想要創建項目的目錄,此處爲桌面

C:\Users\15650>cd desktop

C:\Users\15650\Desktop>scrapy startproject hello

使用Pycharm打開項目(File-open)hello並操作,如圖,

在這裏插入圖片描述

序號一:在spiders模塊(spiders文件夾)中創建python文件編寫爬蟲程序*

import scrapy

class Number1Spider(scrapy.Spider):
	name = "number1"  # 必須唯一 ,可以理解爲給爬蟲起名字,以後直接叫名字 它就工作

	allowed_domains = ['dmoztools.net']  # 設定域名 允許爬取的域名列表,不設置表示允許爬取所有

	# 填寫起始爬取地址  爬蟲一開始工作就自動訪問並返回信息
	start_urls = [
		"http://dmoztools.net/Computers/Programming/Languages/Python/Books/"
	]
	# 以上爲爬蟲啓動後的第一步,自動訪問網頁然後返回response響應對象(網頁信息)


	# 此處爲自動執行的回調函數parse,也就是處理response信息的函數,爲處理數據部分
	def parse(self, response):
		with open("Book", 'wb') as f:
			f.write(response.body)  # response.body 是網頁前端的所有信息


序號二:主函數(隨便創建一個py文件,代執行cmd語句,運行爬蟲)

from scrapy import cmdline

cmdline.execute('scrapy crawl number1'.split())
# 引號內 本來是cmd下執行的語句,此處引入cmd模塊來代執行
# 意思爲 執行scrapy 的爬蟲  爬蟲名爲number1

查看項目中是否生成Book的文件,文件內容爲網頁全部前端信息,建議從電腦內存中用記事本方式打開




序號三:item模塊,建立數據容器,篩選數據

如果我們只想保留剛纔獲取的網頁的標題、鏈接和說明。
在items.py中定義一個Item容器,其中自己聲明幾個想要的屬性,此處我們想要三個屬性。

import scrapy


class HelloItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()


序號四:添加item後的回調函數parse

# 此處爲自動執行的回調函數parse,也就是處理response信息的函數,爲處理數據部分
	def parse(self, response):
		 # response是 htmlresponse對象

		sel = scrapy.selector.Selector(response)
		 #sel 選擇器,是一個可以被xpath查找到選擇器
		sites = sel.xpath('//div[@class="title-and-desc"]')

		items = []
		for site in sites:
		    item = HelloItem()  # 創建一個該Scrapy項目 item容器的一個對象

		    item['title'] = site.xpath('a/div/text()').extract()
		    item['link'] = site.xpath('a/@href').extract()
		    item['desc'] = site.xpath('div/text()').extract()
		    items.append(item) #將該item對象添加到items列表
			 
		return items

lxml與xpath:用於確定文檔中某部分位置

lxml庫是Python的一個解析庫,支持HTML和XML的解析,支持XPath

安裝,cmd下:pip install lxml

引入etree:from lxml import etree

將字符串等轉換爲html對象,並自動補全結點:html = etree.HTML(text)

讀取文件爲html對象:html = etree.parse('./test.html',etree.HTMLParser())

將html文件轉爲字符串並解碼輸出:

result = etree.tostring(html)

print(result.decode('UTF-8'))


XPath即爲XML路徑語言,它是一種用來確定XML/HTML文檔中某部分位置的語言。

html對象就是xpath解析對象,返回一個列表


extract():
item['name'] = each.xpath("./a/text()").extract()[0]

each                               html文檔

each.xpath("./a/text()")  xpath解析返回的是一個選擇器列表

extract()                         轉換爲Unicode字符串列表

[0]                                  列表第一個位置  


序號五:主函數中執行cmd語句直接保存篩選完的數據

from scrapy import cmdline

cmdline.execute('scrapy crawl number1 -o item.json'.split())

查看項目中是否生成Book的文件,文件內容爲篩選完的信息,建議從pycharm直接讀






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