爬蟲---scrapy框架

scrapy

scrapy是一個爬蟲框架连锯,是用python語言編寫的,如果想更加深入的了解用狱,可以嘗試著看他的源碼运怖,非常出名,非常強悍夏伊,多進程摇展、多線程、隊列等溺忧,底層都有使用
我們只需要按照人家提供的接口去實現(xiàn)即可

安裝: pip install scrapy

學(xué)習(xí)框架:

引擎吗购、spiders、調(diào)度器砸狞、下載器、管道

工作原理:

上網(wǎng)原理.png

官方文檔:

http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html

簡單使用:

(1)創(chuàng)建項目

scrapy startproject firstblood

(2)認識項目結(jié)構(gòu)
firstblood
firstblood 項目文件存放地方
pycache 緩存文件
spiders 存放爬蟲文件的地方
pycache 緩存文件
init.py 包的標記
lala.py 爬蟲文件(核心代碼)(×)
init.py 包的標記
items.py 定義數(shù)據(jù)結(jié)構(gòu)的地方(×)
middlewares.py 了解(下載中間件)
pipelines.py 管道文件镀梭,處理數(shù)據(jù)(×)
settings.py 項目的配置文件(×)
scrapy.cfg 不用了解

(3)開啟項目刀森,生成爬蟲文件

cd firstblood
scrapy genspider 爬蟲名字 爬取域名
爬蟲文件里面屬性的含義
爬蟲的名字
啟動爬蟲的時候需要使用

name = 'qiubai'

允許的域名,是一個列表报账,對要爬取的url進行限制研底,限制域名

妹子圖網(wǎng)站,src和網(wǎng)站的域名不是同一個透罢,如果不注意榜晦,向圖片發(fā)送的請求就都過濾掉了

allowed_domains = ['www.qiushibaike.com', 'www.baidu.com']

起始url,是一個列表羽圃,一般只寫一個

start_urls = ['http://www.qiushibaike.com/']

這是重寫的函數(shù)乾胶,也是一個回調(diào)函數(shù),parse函數(shù)處理起始url的響應(yīng)
response就是過來的響應(yīng)對象

def parse(self, response):

(4)將項目跑起來朽寞,認識response對象

cd firstblood/firstblood/spiders
scrapy crawl qiubai
【注】修改配置文件识窿,robots協(xié)議,定制請求頭
response.text 獲取字符串格式內(nèi)容
response.body 獲取字節(jié)格式內(nèi)容
response.url 獲取請求url
response.headers 獲取響應(yīng)頭部
response.status 獲取響應(yīng)狀態(tài)碼
response.xpath()

(5)抓取糗百內(nèi)容

response.xpath() 和以前的xpath不太一樣脑融,最后要通過extract進行提取才可以
直接輸出json格式 scrapy crawl qiubai -o qiubai.json
scrapy crawl qiubai -o qiubai.xml
scrapy crawl qiubai -o qiubai.csv

【注】你導(dǎo)出的時候有空行喻频,網(wǎng)上搜一下即可解決
【注】亂碼,你使用office打開肘迎,gbk甥温,utf8锻煌,右鍵另存為,選字符集姻蚓,在打開即可

scrapy shell

是什麼宋梧?scrapy的調(diào)試工具,通過xpath來提取數(shù)據(jù)的時候史简,如果直接寫到代碼中乃秀,在調(diào)試的時候不太方便,我們可以通過scrapy shell先進行調(diào)試圆兵,調(diào)試完之后跺讯,將xpath路徑拷貝過去即可
依賴一個庫:ipython
pip install ipython

ipython是一個更加智能的python交互環(huán)境

scrapy shell url

  • 如果進ipython環(huán)境失敗,那就需要到工程目錄下進行調(diào)試
  • 進來之后response即可使用
    response.text 字符串格式內(nèi)容
    response.body 字節(jié)格式內(nèi)容
    response.xpath()

谷歌瀏覽器自動生成xpath殉农,右鍵刀脏,copy==》copy xpath
/html/body/div[3]/div[4]/div[1]/div/div[2]/ul/li[1]/div[1]/div/a/img
/html/body/div[3]/div[4]/div[1]/div/div[2]/ul/li[1]/div[1]/a
ret[0].extract() === ret.extract()[0] == ret.extract_first()
【注】如果xpath寫錯了,前兩個會直接報錯超凳,extract_first會返回None

response.css(),
就是以前學(xué)習(xí)的select方法愈污,里面寫選擇器
body > div.page > div.page-body.clearfix > div.main > div > div.b > ul > li:nth-child(1) > div.cont-list-head > div > a > img
selector對象:
scrapy里面自己封裝的對象,這種對象提取的時候就得extract()

獲取img標簽的data-src屬性轮傍,當然最后還得extract()
ret = response.css('.cont-item > .cont-list-head img::attr(data-src)')
獲取文本內(nèi)容暂雹,當然最后都的extract一下
ret = response.css('.cont-item > .cont-list-head > a::text')
item對象
這種對象的用法和字典的用法一模一樣,而且這種對象可以快速的轉(zhuǎn)化為字典
p = Person()
p['name'] = xxx
p['age'] = xxx
d = dict(p)

2创夜、yield item和請求

yield scrapy.Request(url=url, callback=self.parse)

3杭跪、下載圖片

http://699pic.com/people.html
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36

4、日志信息和等級

CRITICAL 嚴重錯誤
ERROR 一般錯誤
WARNING 警告
INFO 一般信息
DEBUG 調(diào)試信息 默認級別
發(fā)現(xiàn)bug需要3s鐘驰吓,解決bug需要3個小時涧尿,debug卻要一輩子
甲蟲 debug

# 在配置文件中設(shè)置錯誤級別,只顯示ERROR以上的錯誤
LOG_LEVEL = 'ERROR'
# 想看到所有的debug信息檬贰,但是又不想顯示到屏幕中姑廉,可以設(shè)置寫入到文件中
LOG_FILE = 'log.txt'

5、發(fā)送post請求

scrapy也可以發(fā)送post請求翁涤,啟動就發(fā)送post請求怎么做桥言?
將start_urls給注釋掉
重寫start_requests方法即可
yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse)

6、請求傳參

yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})

1迷雪、crawlspider

是什麼限书?CrawlSpider, 類名。在scrapy里面章咧,有好多爬蟲類倦西,最基本的是Spider類,基類赁严,還有一個常用的一個爬蟲類扰柠,就是CrawlSpider粉铐,該類繼承自Spider類,所以功能要比Spider要多卤档,多了一個很重要的功能蝙泼,叫做鏈接提取的功能

鏈接提取器類,通過類創(chuàng)建對象劝枣,對象的方法就能提取鏈接

from scrapy.linkextractors import LinkExtractor
LinkExtractor(
allow=xxx, # 正則表達式
restrict_xpaths=xxx, # xpath路徑汤踏,符合這個路徑的所有a鏈接提取到
restrict_css=xxx, # 選擇器,符合選擇器的所有a鏈接提取到
)
在scrapy shell中演示規(guī)則提取
(1)正則提取
lk = LinkExtractor(allow=r'/8hr/page/\d+/')
lk.extract_links(response)
(2)xpath提取
如下兩種方式都可以
lk = LinkExtractor(restrict_xpaths='//ul[@class="pagination"]/li/a')
lk = LinkExtractor(restrict_xpaths='//ul[@class="pagination"]/li')
(3)css提取
lk = LinkExtractor(restrict_css='.pagination > li > a')
lk = LinkExtractor(restrict_css='.pagination > li')
代碼中使用
犯賤網(wǎng)
圖形修改


2舔腾、存儲到mysql溪胶、mongodb

導(dǎo)入一個讀取配置文件的函數(shù)
from scrapy.utils.project import get_project_settings
通過這個函數(shù),將配置文件全部讀進來稳诚,讀進來是一個字典
settings = get_project_settings()

custom_settings = {
    "ITEM_PIPELINES": {
        'movieproject.pipelines.MyMongoDbPipeline': 302,
    }
}

web方向 框架學(xué)習(xí)
爬蟲方向 高于web 涉及數(shù)據(jù)抓取哗脖,過濾分析,數(shù)據(jù)可視化扳还,性能要求才避,需求改變,立即修改滿足需求氨距,反爬 代理ip就可以搞定桑逝,反爬,課堂上的例子 案例
數(shù)據(jù)方向 高于前兩個

3俏让、redis配置

讓其他的電腦能夠鏈接你的redis肢娘,并且配置和修改值
修改兩個地方
第55行 #bind 127.0.0.1 注釋掉
第75行 protected-mode no yes修改為no
4、存儲到redis舆驶、分布式部署
分布式?為了提高爬取的效率而钞,讓多臺電腦一起爬取沙廉,比如一共100url,三臺電腦一起爬取臼节,一個電腦33個
scrapy寫的工程撬陵,都不能實現(xiàn)分布式,沒有這個功能
要想實現(xiàn)分布式网缝,使用一套組件 scrapy-redis 不是官方的巨税,安裝就能使用\

pip install scrapy-redis
部署
windows redis服務(wù)端 安裝redis服務(wù)器

客戶端,運行代碼的電腦
linux1
linux2
windows1
windows2

演示:
linux : redis服務(wù)端
我的windows:客戶端1
你的linux:客戶端2
你的windows:客戶端3
xxxx
查看官方例子
三個樣本文件
dmoz.py 普通的crawlspider模板
mycrawler_redis.py 如果你的爬蟲文件繼承自CrawlSpider粉臊,又想實現(xiàn)分布式草添,請參考這個模板
myspider_redis.py redisspider模板,如果你的爬蟲繼承自Spider扼仲,又想實現(xiàn)分布式远寸,請參考這個模本

分布式模板:
redis-key : 就是以前的 start_urls 這個列表
init方法: 這個就是以前的 allowed_domains 這個列表
【注】init方法不能使用抄淑,要定義動態(tài)列表,還得用以前的寫法

配置文件說明
見代碼
啟動工程
scrapy runspider xxx.py

lpush fenspider:start_urls http://699pic.com/people.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驰后,一起剝皮案震驚了整個濱河市肆资,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灶芝,老刑警劉巖郑原,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夜涕,居然都是意外死亡犯犁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門钠乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栖秕,“玉大人,你說我怎么就攤上這事晓避〈睾矗” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵俏拱,是天一觀的道長暑塑。 經(jīng)常有香客問我,道長锅必,這世上最難降的妖魔是什么事格? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮搞隐,結(jié)果婚禮上驹愚,老公的妹妹穿的比我還像新娘。我一直安慰自己劣纲,他們只是感情好逢捺,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著癞季,像睡著了一般劫瞳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绷柒,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天志于,我揣著相機與錄音,去河邊找鬼废睦。 笑死伺绽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播憔恳,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瓤荔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钥组?” 一聲冷哼從身側(cè)響起输硝,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎程梦,沒想到半個月后点把,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡屿附,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年郎逃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挺份。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡褒翰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匀泊,到底是詐尸還是另有隱情优训,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布各聘,位于F島的核電站揣非,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躲因。R本人自食惡果不足惜早敬,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望大脉。 院中可真熱鬧搞监,春花似錦、人聲如沸镰矿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衡怀。三九已至,卻和暖如春安疗,著一層夾襖步出監(jiān)牢的瞬間抛杨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工荐类, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怖现,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像屈嗤,于是被迫代替她去往敵國和親潘拨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容