scrapy框架-- response
1.Scrapy response
1.1 response方法和引數
(1)body:http響應的正文,位元組
(2)body_as_unicode:字串型別的響應
(3)copy:複製
(4)css: 以css進行匹配
(5)encoding:加碼
(6)headers:響應頭部
(7)meta:響應處理的引數
(8)replace:替換
(9)request:產生http請求的request物件
(10)selector:scrapy 的字元匹配器
(11)status:狀態碼 200 400
(12)text:文字形式的響應內容
(13)url:http響應的地址
(14)urljoin:構造絕對url
(15)xpath:以xpath進行匹配
①程式碼:
②結果:
1.2 response分類
TextResponse、 HtmlResponse、Xmlresponse
2. Scrapy selector
Scrapy匹配核心selector
Beautifulsoup 比較方便,但是解析速度比較慢
Lxml 解析速度比較快
Scrapy集合二者的優點,進行總和。
①程式碼:
from scrapy.selector import Selector
def parse(self,response):
selector = Selector(response)
self.log(selector)
②結果:
2.1 Selector物件支援
2.1.1 css查詢
表示式 |
描述 |
例子 |
* |
所有元素 |
* 所有的標籤 |
Tag |
指定標籤 |
img 所有的img標籤 |
Tag1,tag2 |
指定多個標籤 |
img,a img和a標籤 |
Tag1 tage2 |
下一層標籤 |
img a img下的a標籤 |
Attrib = value |
指定屬性 |
Id = 1 id等於1的標籤 |
①程式碼(selector呼叫)
from scrapy.selector import Selector
def parse(self,response):
selector = Selector(response)
img_list = selector.css("img")
for img in img_list:
self.log(img)
②程式碼【response直接呼叫,優化程式碼】
無需匯入Selector,結果與優化前的顯示一致
def parse(self,response):
img_list = response.css("img")
for img in img_list:
self.log(img)
③結果:
2.1.2 xpath查詢
(1)在scrapy當中寫xpath不會有 text() attrib() tag()這樣的方法,我們需要把這些方法寫到匹配當中
(2).當前節點,
(3)..上一層節點
表示式 |
描述 |
例子 |
/ |
當前文件的根或者層 |
/html/body/div 取div |
text() |
文字 |
/html/body/div/a/text() 取a的文字 |
@attrib |
屬性 |
/html/body/div/a/@href 取a的屬性 |
* |
代表所有 |
/html/body/*[@class=’hello’] 取所有class屬性等於hello的標籤 /html/body/a/@* 取a標籤所有的屬性 |
[] |
修飾語 |
/html/body/div[4] 取第4個div /html/body/div[@class=“xxx”] |
①程式碼:
def parse(self,response):
img_list = response.xpath("//img/@src")
for img in img_list:
self.log(img)
②結果:
2.1.3 re查詢
他不可以獨立用,只可以加在匹配項後面
①程式碼:
def parse(self,response):
img_list = response.xpath("//img/@src")
for img in img_list:
img = img.re(".*png$")
self.log(img)
②結果:
2.2 返回字元結果的方法
2.2.1 extract()針對單個物件
①程式碼:
def parse(self,response):
img_list = response.xpath("//img/@src")
for img in img_list:
img = img.extract()
self.log(img)
②結果:
2.2.2 extract_first()針對列表
①程式碼:
def parse(self,response):
img_list = response.xpath("//img/@src")
img_List = img_list.extract_first()
self.log(img_List)
②結果:
3.Scrapy item
3.1 item介紹
(1)Scrapy有一個巨大的優勢,scrapy可以定義資料模型,我們用item可以定義我們的資料模型類(定義一個類),定義的方法類似django的模型,但也有不同。
(2)Scrapy預設會建立一個模型,我們可以在裡面定義我們想要的資料模型。
(3)scrapy 的item當中所有的欄位都可以為Field
(4)item將解析結果返回成字典形式
3.2 item使用
①程式碼(spider):
import scrapy
from ScrapySpider.items import ScrapyTest
from scrapy import Request
class TestSpider(scrapy.spiders.Spider):
name = "baiduSpider"
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):
img_list = response.xpath("//img/@src")
for img in img_list:
item = ScrapyTest()
item["src"] = img.extract()
self.log(item)
②程式碼(items):
import scrapy
class ScrapyspiderItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
# 繼承ScrapyspiderItem
class ScrapyTest(ScrapyspiderItem):
src = scrapy.Field()
③結果:
4.Scrapy pipeline
這個時候,我們可以把資料格式化了,但是資料輸出我們還需要使用piplines
4.1 pipeline介紹
(1)使用pipelines的第一步是在settings當中解開(取消註釋)pipelines的配置
這條配置分為兩部分
①pipelines的位置
②優先順序,優先順序分為1-1000,數值越小越先執行
(2)爬蟲要有生成器生成item步驟
4.2 pipelines使用
①程式碼(spider):
import scrapy
from ScrapySpider.items import ScrapyTest
from scrapy import Request
class TestSpider(scrapy.spiders.Spider):
name = "baiduSpider"
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):
img_list = response.xpath("//img/@src")
for img in img_list:
item = ScrapyTest()
item["src"] = img.extract()
self.log(item)
yield item
②程式碼(pipelines):
③結果:
5.Scrapy 專案例項
5.1 新建爬蟲檔案qiushi.py
import scrapy
from ScrapySpider.items import ScrapyTest
class qiushiTest(scrapy.spiders.Spider):
name = "qiushi"
def start_requests(self):
url = "https://www.qiushibaike.com/"
headers = {
"Referer": "https://www.baidu.com/link?url=0NjZXCRuEfuf8lcVVYy8j3o_548KY5Nvc_GHkq6auqOxoY7-LnODt6dLkTcihaWC&wd=&eqid=8e7edbd1000211e4000000055bc19182",
"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 scrapy.Request(url,headers=headers)
def parse(self,response):
img_list = response.xpath("//img/@src")
for img in img_list:
item = ScrapyTest()
item["src"] = img.extract()
self.log(item)
yield item
5.2 items.py
import scrapy
class ScrapyspiderItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
# 繼承ScrapyspiderItem
class ScrapyTest(ScrapyspiderItem):
src = scrapy.Field()
5.3 pipelines.py
from urllib import request
class ScrapyspiderPipeline(object):
def process_item(self, item, spider):
src = item["src"]
url = "http:" + src
if "?" in src:
URL = src.split("?")[0] # 以“?”從左邊開始分割,取左邊第一個
name = URL.rsplit("/", 1)[1] # 以“/”從右邊開始分割一次,取右邊第一個
else:
name = src.rsplit("/", 1)[1]
print("===========")
print(name)
print(url)
path = "F:\\img\\" + name
try:
request.urlretrieve(url, path)
except Exception as e:
print(e)
else:
print("%s is down" % name)
return item
5.4 run.py
from scrapy import cmdline
cmdline.execute("scrapy crawl qiushi".split())
5.5 結果