scrapy框架-- request
1.Scrapy 介紹
(1)Python開發的一個快速、高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料
(2)特點:資料結構化、分散式
2.Scrapy 安裝
2.1安裝步驟
2.1.1 安裝依賴包
2.1.1.1安裝lxml
pip install lxml
2.1.1.2安裝Twisted
(1)安裝wheel:pip3 install wheel
(2)下載Twisted包
①下載連結:https://www.lfd.uci.edu/~gohlke/pythonlibs/
②下載後,開啟下載檔案的目錄,開啟cmd
輸入:pip3 install Twisted-18.7.0-cp35-cp35m-win_amd64.whl
2.1.2 安裝scrapy
(1)安裝:pip install scrapy
(2)當我們安裝好scrapy,並且有配置scrapy的環境變數(D:\python3.5.4\Scripts),假如之前配過就不用配了
(3)如果配置好之後,在命令列敲scrapy會有一下反應
3.Scrapy 基本命令與結構
3.1 基本命令
3.1.1 檢視版本
3.1.2 建立專案
3.2結構
3.2.1 爬蟲專案結構
3.2.2 爬蟲結構
Scrapy是python編寫的框架,類裡面規則和python的一樣
4.Scrapy爬蟲步驟
4.1新建爬蟲檔案
4.2編寫爬取程式碼(簡單)
# coding:utf-8
import scrapy
class TestSpider(scrapy.spiders.Spider):
'''
TestSpider 我們定義的爬蟲類
scrapy.spiders.Spider 是scrapy定義好的爬蟲
'''
# 定義爬蟲的名稱,需唯一
name = "baiduSpider"
# 允許爬取的範圍
allowed_domains = [
"https://www.baidu.com/"
]
# 預設爬取的起始點
start_urls = [
"https://www.baidu.com"
]
def parse(self,response):
'''
scrapy 會自動呼叫downloader的下載器,當請求成功scapy會自動呼叫parse,
將結果返回到parse的response引數上
'''
# 除錯方法在是scrapy當中可以代替print
self.log(response.body.decode())
4.3建立啟動檔案
4.4 編寫執行程式碼
4.5 settings設定
4.5.1 Scrapy預設請求頭配置
找到HEADERS,取消註釋,並新增上“UA”資訊
4.5.2 設定不啟動機器人協議
4.6 執行啟動檔案
4.6.1 執行後報錯處理
提示:需安裝win32的庫
(1)下載對應python版本的win32的庫
下載地址:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/
(2)下載後點擊安裝後重新啟動。成功爬取
5.Scrapy 請求處理
假如我們只是爬一個百度這樣寫是沒有問題的,但是如果爬小說網站,請求頭有變化,那麼我們剛才配置預設請求頭就不夠用了,所以我們需要配置自己的請求頭資訊。(settings中的HEADERS重新註釋掉)
5.1 生成器
(1)python 2.4版本之後更新出來的語法糖,可以很高效的減少程式記憶體損耗
Python2 : xrange
Python3 : range
(2)正常函式
使用return返回值,在呼叫函式時,輸出相應的值
(3)yield函式
5.2 Request物件
在這裡我們瞭解一個scrapy的request物件
首先request物件是由scrapy.Request方法建立
引數:
(1)url 請求的url
(2)callback=None 請求的回撥函式,預設是parse
(3)method='GET', 請求的方式
(4)headers=None, 請求的頭部
(5)body=None, 請求的正文,可以是bytes或者str
(6)cookies=None, 請求攜帶的cookie
(7)meta=None, 數是一個字典用於傳遞引數,這裡可以帶表單資料,也可以帶代理如meta = {'proxy': 'xxx.xxxx.com:埠號'}
(8)encoding='utf-8', 字符集 url和body的字符集
(9)priority=0, 優先順序,優先順序越高,越先下載
(10)dont_filter=False, 是否對同一個url多次請求
(11)errback=None, 錯誤返回
(12)flags=None 標籤
5.3程式碼部分
(1)程式碼
# coding:utf-8
import scrapy
from scrapy import Request
class TestSpider(scrapy.spiders.Spider):
'''
TestSpider 我們定義的爬蟲類
scrapy.spiders.Spider 是scrapy定義好的爬蟲
'''
# 定義爬蟲的名稱,需唯一
name = "baiduSpider"
# 繼承並重寫start_requests方法,定義url和headers
def start_requests(self):
url = "https://www.baidu.com/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}
yield Request(url,headers=headers)
def parse(self,response):
'''
scrapy 會自動呼叫downloader的下載器,當請求成功scapy會自動呼叫parse,
將結果返回到parse的response引數上
'''
# 除錯方法在是scrapy當中可以代替print
self.log(response.body.decode())
(2)結果
5.4 補充說明
(1)執行程式碼後沒有報錯:
spider關鍵字出錯
資料匹配出錯
UA頭重複使用次數過多
(2)排錯,從Spoder opened開始查詢,爬取到的資訊、warn、error
(2)allowed_domains,允許爬取範圍www.baidu.com; Request裡的meta引數是一個字典用於傳遞引數,這裡可以帶表單資料,也可以帶代理如meta = {'proxy': 'xxx.xxxx.com:埠號'}