Python網絡爬蟲


 

Python網絡爬蟲html

 

做者:songyifeipython

歸檔:學習筆記mysql

2019/02/26web

 

快捷鍵:ajax

Ctrl + 1    標題1redis

Ctrl + 2    標題2sql

Ctrl + 3    標題3瀏覽器

Ctrl + 4    實例服務器

Ctrl + 5    程序代碼cookie

Ctrl + 6    正文

格式說明:

藍色字體:註釋

黃色背景:重要

綠色背景:注意


 

第1章   Python爬蟲的分類

1.1 通用爬蟲:

通用爬蟲是搜索引擎BaiDu Google YaHoo等,抓取的重要組成部分,主要目的是將互聯網上的網頁下載到本地,造成一個互聯網內容的鏡像備份。

1.2 聚焦爬蟲

是根據指定的需求抓取網絡上的數據

1.3 Robots.txt協議

本身的門戶網站中的指定頁面中的數據不想讓爬蟲程序取到的化,那麼則能夠經過編寫一個robots.txt的協議文件來約束爬蟲程序的數據爬取

1.4 反爬蟲

門戶網站經過相應的策略和技術手段,放置爬蟲程序進行網站數據的爬取

1.5 反反爬蟲

爬蟲程序經過相應的策略和技術的手段,破解門戶網站的反爬蟲手段,從而爬取到相應的數據

 

 

 

第2章 什麼是Jupyter Notebook

2.1 簡介

Jupyter Notebook是基於網頁的用於交互式計算的應用程序,期可被應用用全過程編碼開發,文檔編寫,運行代碼和展現結果

 

Jupyter Notebook的主要特色

  1. 編寫時具備語法高亮、縮進、tab補全的功能
  2. 可直接經過瀏覽器運行代碼,同時在代碼塊下放展現運行的結果
  3. 對代碼編寫說明文檔或語句時,支持Markdown語法

 

2.2 安裝

 

安裝前提:

安裝Jupter Noteboo的前提須要安裝python3.3版本或2.7以上的版本

使用Anaconda安裝

    經過安裝Anacida來解決Jupter NoteBoo的安裝問題

    官方下載地址: www.anaconda.com/download 自行下載,傻瓜式安裝,默認配置環境變量

運行Jupyter Notebook

    Jupyter notebook

 

2.3 使用介紹

 

經常使用快捷鍵

    向下插入一個cell b

    向上插入一個cell a

將cell的類型切換成Markdown類型 m

將cell的類型切換成code類型   y

運行  shift + enter

幫助文檔 Shift + Tab

補全 tab

 

第3章 網絡爬蟲模塊

3.1 Urlib

Python中自帶的一個基於爬蟲的模塊。

做用:可使用代碼模擬瀏覽器發起請求.request parse

使用流程:

    指定url

    發起請求

    獲取頁面數據

    持久化存儲

 

實例3-1  需求 爬取搜狗首頁數據

#需求爬取搜狗首頁

import urllib.request

#1.指定url

url = 'https://www.sogou.com/'

#2.發請求,urlopen能夠根據指定的url發起請求,且返回一個響應對象

response = urllib.request.urlopen(url=url)

#3.獲取頁面數據:read函數返回的就是響應對象中存儲的頁面數據(byte)

page_text = response.read()

#4.持久化存儲

with open('./sogou.html','wb') as fp:

    fp.write(page_text)

print('寫入數據成功')

 

#需求:爬取指定詞條所對應的頁面數據

import urllib.request

import urllib.parse

#指定url

url =  'https://www.sogou.com/web?query='

#url的特性:url不能夠存在非ASCII編碼的字符數據

word = urllib.parse.quote('范冰冰')

url += word #有效的url

#發送請求

response = urllib.request.urlopen(url=url)

 

#獲取頁面數據

page_text = response.read()

print(page_text)

 

#將獲取的數據作持久化存儲

page_text = response.read()

with open('fanbingbing.html','wb') as fp:

    fp.write(page_text)

print('寫入成功')

 

 

3.2 反爬機制

-反爬蟲機制:網站會檢查請求的UA,若是發現請求的UA是爬蟲程序,則拒絕提供網站數據

    -User-Agent(UA):請求載體的身份標識

    -反反爬機制:假裝爬蟲程序請求的UA,

實例3-2  UA假裝

import urllib.request

url = 'http://www.baidu.com/'

#UA假裝

#1.自制定一個請求的對象

headers = {

    #存儲任意的請求頭信息

    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

    }

#該請求對象的UA進行了成功的假裝

 

request = urllib.request.Request(url=url,headers=headers)

#2.針對自制定的請求對象發起請求

response = urllib.request.urlopen(request)

print(response.read())

 

3.3 Post請求

 

import urllib.request

import urllib.parse

#指定url

url = 'https://fanyi.baidu.com/sug'

#post請求攜帶的參數進行處理 流程:

#1.將POST 請求參數封裝到字典

data = {

    'kw':'西瓜'

    }

#2。使用parse模塊中的urlencode(返回值類型爲str)進行編碼處理

data = urllib.parse.urlencode(data)

type(data)

#3.將步驟2的編碼結果轉換成byte類型

data  = data.encode()

#2.發起post請求:urlopen函數的data參數表示的就是通過處理以後的post請求攜帶的參數

response = urllib.request.urlopen(url=url,data=data)

response.read()

 

 

 

3.4 Urllib操做

3.4.1 代理操做

什麼是代理:代理就是第三方代替本體處理相關

代理分類:

    正向代理:代理客戶端獲取數據,正向代理是爲了保護客戶端防止被追究責任

    反響代理:代理服務端提供數據,反向代理爲了保護服務器或負載均衡

 

3.5 Requests模塊

一、 什麼是requests模塊

Python原生一個基於網絡請求的模塊,模擬瀏覽器發起請求。

二、 爲何要使用requests模塊

  1. 自帶處理url編碼,
  2. 自動處理post請求的參數urlencode()
  3. 簡化Cookie的代理的操做

建立一個cookiejar對象

建立一個handler對象

建立一個openrner

 

建立一個handler對象,代理IP和端口封裝到該對象

建立openner對象

3.requests如何被使用

安裝:pip install requests

使用流程:

  1. 指定url
  2. 使用requests模塊發起請求
  3. 獲取響應數據
  4. 進行持久化存儲

 

 

3.6 基於requests模塊

實例3-3  —爬取搜狗首頁

import requests

url = 'https://www.sogou.com/'

#發起get請求:get 方法會返回請求成功後的響應對象

response = requests.get(url=url)

#獲取響應中的數據值,text能夠獲取響應對象中的字符串形式頁面的數據

page_data = response.text

print(page_data)

#持久化操做

with open('./sogou.html','w',encoding='utf-8') as fp:

    fp.write(page_data)

   

實例3-4  Response對象中其餘重要的屬性

#response對象中其餘重要的屬性

import requests

url = 'https://www.sogou.com/'

#發起get請求:get 方法會返回請求成功後的響應對象

response = requests.get(url=url)

#獲取響應中的數據值,text能夠獲取響應對象中的字符串形式頁面的數據

#content獲取的是response對象中二進制類型的數據

# print (response.content)

 

#返回一個狀態碼

#print(response.status_code)

 

#返回相應頭信息

# print(response.headers)

 

 

#獲取請求的url

print(response.url)

實例3-5  Requests如何請求攜帶參數的get請求

-方式一

 

方式二

 

 

實例3-6  Requsts模塊get請求自定義請求頭信息

#自定義請求頭信息

import requests

 

url = 'https://sogou.com/web'

 

#將參數封裝到字典中

params = {

     'query':'周杰倫',

    'ie':'utf-8'

}

#自定義請求頭信息

headers = {

    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

}

response = requests.get(url=url,params=params,headers=headers)

response.status_code

實例3-7  基於requests模塊發起的post請求

#基於requests模塊發起的post請求

 #- 需求:登錄豆瓣網,獲取登錄成功後的頁面數據

import requests

url = 'https://accounts.douban.com/login'

#封裝post請求的參數

data = {

    'source':'movie',

    'redir':'https://movie.douban.com/',

    'form_email':'18401747334',

    'form_password':'fei@163.com',

    'login':'登陸',

}

#自定義請求頭信息

headers = {

      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

}

#發起post請求

respomse = requests.post(url=url,data=data,headers=headers)

#獲取響應對象中的頁面數據

page_text = respomse.text

#持久化

with open('./douban.html','w',encoding='utf-8') as fp:

fp.write(page_text)

實例3-8  Requests模塊ajax的get請求、

#基於ajax的get請求

import requests

url = 'https://movie.douban.com/j/chart/top_list?'

#封裝ajax的get請求中攜帶的參數

params = {

    'type': '13',

    'interval_id': '100:90',

    'action': '',

    'start': '10',

    'limit': '20'

}

#請求頭信息

headers = {

      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

}

respomse = requests.get(url=url,params=params,headers=headers)

print(respomse.text)

 

實例3-9  基於ajax的post請求

 

#基於ajax的post請求

#需求:爬取肯德基城市餐廳位置數據

import requests

#指定url

post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

#post請求的參數

data = {

    'cname': '',

    'pid': '',

    'keyword': '杭州',

    'pageIndex': '1',

    'pageSize': '10'

}

#自定義請求頭

headers = {

      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

}

#發起基於ajax的post請求

response = requests.post(url=post_url,headers=headers,data=data)

response.text

3.7 Requests模塊綜合學習

## 獲取前3頁

import requests

import os

 

#建立文件夾

if not os.path.exists('./pages'):

    os.mkdir('./pages')

   

word = input('enter a word:')

#動態指定頁碼的範圍

start_pagenum = int(input('enter a start pageNum:'))

end_pageNum = int(input('enter a end pageNum:'))

#請求頭信息

headers = {

      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

}

#指定url,設計成一個具備通用的url

url = 'https://zhihu.sogou.com/zhihu'

for page in range(start_pagenum,end_pageNum+1): 

    param = {

        'query':word,

        'page':page,

        'ie':'utf-8'

    }

    response = requests.get(url=url,params=params,headers=headers)

    #獲取相應中的頁面數據(指定頁面(page))

    page_text = respomse.text

    #持久化

    fileName = word +str(page)+'.html'

    filePath = 'pages/'+fileName

    with open(filePath,'w',encoding='utf-8') as fp:

        fp.write(page_text)

        print('第%d頁寫入成功'%page)

 

實例3-10            Requests – cookie

--cookie

基於用戶的用戶數據

-需求:爬取張三用戶的豆瓣網上的我的主頁頁面數據

              --cookie做用:

                            1.執行登錄操做(獲取cookie)

                            2.在發起我的主頁請求時,須要將cookie攜帶到請求中

                            注意:session對象:發送請求

 

 

               -代理操做:

爲何使用代理?

-          反爬操做

-          反反爬蟲手段

分類:

              正向代理:代替客戶端獲取數據

              反向代理:代理服務端提供數據

               免費代理ip的網站提供商

                            www.goubanjia.com

                            快代理

                            西祠代理

 

第4章 三種數據解析方式

4.1 數據解析

指定url

發起請求

獲取數據

數據解析

持久化存儲

4.2 三種數據解析方式

正則

 

Bs4

 

 

Xpath


安裝xpath插件:就能夠直接將xpath表達式做用於瀏覽器的網頁當中

 

4.3 動態頁面加載

  1. seleniun
  2. phantomJs

 

 

第5章 Scrapy框架

 

 

 

 

實例5-1   

#建立爬蟲項目

 

#建立爬蟲文件

 

 

#編寫爬蟲文件

 

修改setting的19行的AU和22行的ROBOTSTXT_OBEY默認是true 改爲False不讓他遵循ROBOTS協議

 

啓動>scrapy crawl qiubai –nolog

5.1.2 持久化存儲

持久化存儲操做

A 磁盤文件

    基於終端指令:

    保證parse方法返回一個可迭代類型的對象(存儲解析到頁面內容)

    使用終端指令完成數據存儲到指定的文件當中

  

-o 指定的磁盤文件 –nolog 不輸出日誌

 

 

實例5-2  基於管道的數據存儲

  1. items:存儲解析到的頁面數據
  2. pipelines:處理解析持久化存儲相關操做
  3. 基於mysql
  4. 基於redis存儲
相關文章
相關標籤/搜索