爬虫学习笔记(七)——Scrapy框架(二):Scrapy shell、选择器
一、Scrapy shell
scrapy shell的作用是用于調(diào)試,在項目目錄下輸入scrapy shell start_urls (start_urls:目標(biāo)url)得到下列信息:
scrapy shell 會自動加載settings里的配置,即robots協(xié)議,請求頭等都可以加載,從而發(fā)起請求可以得到正確的響應(yīng)信息。
[s] Available Scrapy objects: [s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc) #scrapy 模塊 [s] crawler <scrapy.crawler.Crawler object at 0x000002624C415F98> #爬蟲對象 [s] item {} #item對象 [s] request <GET https://movie.douban.com/top250> # 請求對象 [s] response <200 https://movie.douban.com/top250> #響應(yīng)對象 [s] settings <scrapy.settings.Settings object at 0x000002624C415EB8> #配置文件 [s] spider <DefaultSpider 'default' at 0x2624c8ed3c8> #spider文件 [s] Useful shortcuts: [s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed) #通過url 獲取response [s] fetch(req) Fetch a scrapy.Request and update local objects #通過請求對象 獲取response [s] shelp() Shell help (print this help) #列出命令 [s] view(response) View response in a browser #response 界面 本地瀏覽器環(huán)境下使用Scrapy shell 本質(zhì)上就是個普通的python shell
只不過提供了一些需要使用的對象,快捷方法便于我們調(diào)試。
- 快捷方法:
shelp()
fetch(url[,redirect=True])
fetch(request)
view(response) - scrapy 對象:
crawler
spider
request
response
setting
二、Scrapy 選擇器
-
Scrapy提供基于lxml庫的解析機(jī)制,它們被稱為選擇器。
因為,它們“選擇”由XPath或CSS表達(dá)式指定的HTML文檔的某部分。
Scarpy選擇器的API非常小,且非常簡單。 -
選擇器提供2個方法來提取標(biāo)簽
xpath() 基于xpath的語法規(guī)則
css() 基于css選擇器的語法規(guī)則快捷方式
response.xpath()
response.css()
它們返回的選擇器列表提取文本:
selector.extract() 返回文本列表
selector.extract_first() 返回第一個selector的文本,沒有返回None -
嵌套選擇器
①有時候我們獲取標(biāo)簽需要多次調(diào)用選擇方法(.xpath()或.css())
例如:response.css(‘img’).xpath(’@src’)
②Selector還有一個.re()方法使用正則表達(dá)式提取數(shù)據(jù)的方法。它返回字符串。它一般使用在xpath(),css()方法之后,用來過濾文本數(shù)據(jù)。
re_first()用來返回第一個匹配的字符串。
示例:
html_str=""" <div class="info"><div class="hd"><a href="https://movie.douban.com/subject/1292052/" class=""><span class="title">肖申克的救贖</span><span class="title"> / The Shawshank Redemption</span><span class="other"> / 月黑高飛(港) / 刺激1995(臺)</span></a><span class="playable">[可播放]</span></div><div class="bd"><p class="">導(dǎo)演: 弗蘭克·德拉邦特 Frank Darabont 主演: 蒂姆·羅賓斯 Tim Robbins /...<br>1994 / 美國 / 犯罪 劇情</p><div class="star"><span class="rating5-t"></span><span class="rating_num" property="v:average">9.7</span><span property="v:best" content="10.0"></span><span>1980500人評價</span></div><p class="quote"><span class="inq">希望讓人自由。</span></p></div> </div> </div> """ from scrapy.selector import Selector #1.通過text 參數(shù)來構(gòu)造對象 select = Selector(text=html_str) print(select.xpath('//div[@class="info"]/div/a/span/text()')[0].extract()) print(select.xpath('./body/div[@class="info"]//div/a/span/text()').extract()[0]) print(select.xpath('//div[@class="info"]//div/a/span/text()').extract_first())# 2.通過 response 構(gòu)造selector對象 from scrapy.http import HtmlResponse response = HtmlResponse(url='http://exc.com',body=html_str.encode()) Selector(response=response) print(response.selector.xpath('//div[@class="info"]//div/a/span/text()').extract()[0]) print(response.xpath('//div[@class="info"]//div/a/span/text()').extract()[0])#3.嵌套表達(dá)式 selector 可以任意使用 css xpath re print(response.css("a").xpath('./span[1]/text()').extract()[0]) print(response.css("a").xpath('./span[1]/text()').re("的..")[0]) print(response.css("a").xpath('./span[1]/text()').re_first("的.."))三、scrapy.Spider
spider 的名稱 name
一個字符串,用于定義此蜘蛛的名稱。蜘蛛名稱是Scrapy如何定位(并實例化)蜘蛛,因此它必須是唯一的。這是最重要的蜘蛛屬性,它是必需的。
起始urls
蜘蛛將開始爬取的URL列表。因此,下載的第一頁將是此處列出的頁面。后續(xù)Request將從起始URL中包含的數(shù)據(jù)連續(xù)生成。
自定義設(shè)置
運(yùn)行此蜘蛛時將覆蓋項目范圍的設(shè)置。必須將其定義為類屬性,因為在實例化之前更新了設(shè)置。
logger
使用Spider創(chuàng)建的Python日志器。您可以使用它來發(fā)送日志消息。
from_crawler
這是Scrapy用于創(chuàng)建spider的類方法。一般不用覆蓋。
start_requests() 開始請求
此方法必須返回一個iterable,其中包含第一個要爬網(wǎng)的請求。它只會被調(diào)用一次
parse 默認(rèn)回調(diào)函數(shù)方法
這是Scrapy在其請求未指定回調(diào)時處理下載的響應(yīng)時使用的默認(rèn)回調(diào)
close 關(guān)閉spider
spider關(guān)閉時調(diào)用
四、小案例:次級頁面抓取及數(shù)據(jù)傳遞拼接(豆瓣電影)
基于上一篇博客(小爬蟲學(xué)習(xí)(六)——Scrapy框架(一))的案例,我們在其基礎(chǔ)上爬取每個電影次級頁面的“電影詳情”,最終存儲到excel表格里。
spider文件
(我的文件名:db)
import scrapy import re from ..items import Db250Itemclass DbSpider(scrapy.Spider): #繼承基礎(chǔ)類name = 'db' #爬蟲文件名字# allowed_domains = ['movie.douban.com']start_urls = ['https://movie.douban.com/top250'] #初始url 必須存在page = 0def parse(self, response): #解析函數(shù) 處理響應(yīng)數(shù)據(jù)all_mes = response.xpath('//div[@class="info"]')for mes in all_mes:#電影名字film_name = mes.xpath('./div/a/span[1]/text()')[0].extract()#評分score = mes.xpath('./div/div/span[2]/text()')[0].extract()#導(dǎo)演信息director = mes.xpath('./div/p/text()')[0].extract().strip()#使用管道存儲item = Db250Item()item['film_name'] = film_nameitem['score'] = scoreitem['director'] = director# 次級頁面的url 電影簡介 detail_url = mes.xpath('./div/a/@href').extract()[0]yield scrapy.Request(detail_url,callback=self.get_detail,meta={'info':item}) #參數(shù)的傳遞拼接的關(guān)鍵參數(shù)是 meta參數(shù)#發(fā)送新一頁的請求#構(gòu)造urlself.page += 1if self.page == 3: #我們就先構(gòu)造3頁returnpage_url = 'https://movie.douban.com/top250?start={}&filter='.format(self.page * 25)yield scrapy.Request(page_url)def get_detail(self,response):items = Db250Item()#解析詳情頁的response#1.meta 會跟隨response 一塊返回 2.通過response.meta接收 3.通過update 添加到新的item對象中info = response.meta["info"]items.update(info)#簡介內(nèi)容detail= response.xpath('//div[@class="indent"]//span[@property="v:summary"]/text()').extract()[0].strip()items['detail'] = detailyield items注意:
目標(biāo)數(shù)據(jù): 電影信息+ 獲取電影簡介數(shù)據(jù) 請求流程: ①訪問一級頁面,提取電影信息+次級頁面的url ②訪問次級頁面url 從次級的數(shù)據(jù)中提取電影簡介 存儲的問題:數(shù)據(jù)沒有次序需要使用 meta傳參保證同一電影的信息在一起items文件
import scrapy class Db250Item(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()film_name = scrapy.Field()score = scrapy.Field()director = scrapy.Field()detail = scrapy.Field()pipelines 文件
將數(shù)據(jù)寫入excel表格
import json import pandas as pd from itemadapter import ItemAdapterclass Db250Pipeline:def open_spider(self,spider): #函數(shù)名字是固定的self.filmlist = []def process_item(self, item, spider):self.filmlist.append(dict(item))return itemdef close_spider(self,spider): #函數(shù)名字是固定的df = pd.DataFrame(self.filmlist)df.to_csv('film.csv')settings 文件
設(shè)置robots協(xié)議,添加全局請求頭,開啟管道
(只修改這三部分就行了)
結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的爬虫学习笔记(七)——Scrapy框架(二):Scrapy shell、选择器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(五)——网页解析工具(bs
- 下一篇: 爬虫学习笔记(八)—— Scrapy框架