目錄
二、Scrapy爬蟲基本使用
1、Scrapy爬蟲的第一個實例
(1)演示HTML地址
演示HTML頁面地址:http://python123.io/ws/demo.html。
文件名稱:demo.html。
(2)產生步驟
步驟1:建立一個Scrapy爬蟲工程
管理員權限啓動cmd。
輸入:
scrapy startproject python123demo
生成的工程目錄:
python123demo/ middlewares.py |
外層目錄 Middlewares代碼模板(繼承類) |
步驟2:在工程中產生一個Scrapy爬蟲
管理員權限啓動cmd。
輸入:
cd python123demo
scrapy genspider demo python123.io
該命令作用:生成一個名稱爲demo的spider;在spiders目錄下增加代碼文件demo.py。
該命令僅用於生成demo.py,該文件也可以手工生成。
demo.py文件:
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
allowed_domains = ['python123.io']
start_urls = ['http://python123.io/']
def parse(self, response):
pass
# parse()用於處理響應,解析內容形成字典,發現新的URL爬取請求。
步驟3:配置產生的spider爬蟲
配置:初始URL地址;獲取頁面後的解析方式。
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
# allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
# parse()用於處理響應,解析內容形成字典,發現新的URL爬取請求。
步驟4:運行爬蟲,獲取網頁
管理員權限啓動cmd。
輸入:
scrapy crawl demo
demo爬蟲被執行,捕獲頁面存儲在demo.html。
(3)小結
①回顧demo.py代碼:
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
②demo.py代碼的完整版本:
# demo.py代碼的完整版本
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
def start_requests(self):
urls = [
'http://python123.io/ws/demo.html'
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
③demo.py兩個等價版本的區別:
yield scrapy.Request(url=url, callback=self.parse)
2、yield關鍵字的使用
(1)yield關鍵字
yield↔生成器。
生成器是一個不斷產生值的函數。
包含yield語句的函數是一個生成器。
生成器每一次產生一個值(yield語句),函數被凍結,被喚醒後再產生一個值。
(2)實例
①生成器寫法:
# 生成器寫法
def gen(n):
for i in range(n):
yield i ** 2
for i in gen(5):
print(i, " ", end="")
②普通寫法:
# 普通寫法
def square(n):
ls = [i ** 2 for i in range(n)]
return ls
for i in square(5):
print(i, " ", end="")
(3)爲何要有生成器?
生成器相比一次列出所有內容的優勢:更節省存儲空間;響應更加迅速;使用更靈活。
如果n=1M、10M、100M或更大呢?
# 爲何要有生成器?
def square(n):
ls = [i ** 2 for i in range(n)]
return ls
def gen(n):
for i in range(n):
yield i ** 2
3、Scrapy爬蟲的基本使用
(1)Scrapy爬蟲的使用步驟
步驟1:創建一個工程和Spider模板。
步驟2:編寫Spider。
步驟3:編寫Item Pipeline。
步驟4:優化配置策略。
(2)Scrapy爬蟲的數據類型
Request類;Response類;Item類。
①Request類:
class scrapy.http.Request()。
Request對象表示一個HTTP請求;由Spider生成,由Downloader執行。
屬性或方法 | 說明 |
.url | Request對應的請求URL地址 |
.method | 對應的請求方法,‘GET’ ‘POST’等 |
.headers | 字典類型風格的請求頭 |
.body | 請求內容主體,字符串類型 |
.meta | 用戶添加的擴展信息,在Scrapy內部模塊間傳遞信息使用 |
.copy() | 複製該請求 |
②Response類:
class scrapy.http.Response()。
Response對象表示一個HTTP響應;由Downloader生成,由Spider處理。
屬性或方法 | 說明 |
.url | Response對應的URL地址 |
.status | HTTP狀態碼,默認是200 |
.headers | Response對應的頭部信息 |
.body | Response對應的內容信息,字符串類型 |
.flags | 一組標記 |
.request | 產生Response類型對應的Requests對象 |
.copy() | 複製該響應 |
③Item類:
class scrapy.item.Item()。
Item對象表示一個從HTML頁面中提取的信息內容;由Spider生成,由Item Pipeline處理;Item類似字典類型,可以按照字典類型操作。
(3)Scrapy爬蟲提取信息的方法
Scrapy爬蟲支持多種HTML信息提取方法。
①Beautiful Soup。
②lxml。
③re。
④XPath Selector。
⑤CSS Selector。
(4)CSS Selector的基本使用
使用格式:
<HTML>.css('a::attr(href)').extract()
①a:標籤名稱。
②href:標籤屬性。
CSS Selector由W3C組織維護並規範。