python爬蟲之scrapy 入門案例

1.創(chuàng)建爬蟲項(xiàng)目

scrapy startproject jobboleproject

2.新建爬蟲文件

scrapy genspider jobbole jobbole.com

3.item.py文件

class JobboleItem(scrapy.Item):
# define the fields for your item here like:
#標(biāo)題
title = scrapy.Field()
#創(chuàng)建時(shí)間
create_date = scrapy.Field()
#文章地址
url = scrapy.Field()
#id
url_object_id = scrapy.Field()
#文章圖片
front_image_url = scrapy.Field()
#文章圖片地址
front_image_path = scrapy.Field()
# 點(diǎn)贊數(shù)
praise_nums = scrapy.Field()
#收藏?cái)?shù)
bookmark_nums = scrapy.Field()
# 評論數(shù)
comment_nums = scrapy.Field()
#文章內(nèi)容
content = scrapy.Field()
#標(biāo)簽
tags = scrapy.Field()

4.打開 jobboleproject/spider目錄里的 jobbole.py,默認(rèn)增加了下列代碼:

# -*- coding: utf-8 -*-
import scrapy
class JobboleSpider(scrapy.Spider):

name = 'jobbole'
allowed_domains = ['jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']

def parse(self, response):
pass

5.將start_urls(設(shè)置起始url)的值修改為需要爬取的第一個(gè)url

start_urls = ("http://blog.jobbole.com/all-posts/",)

在parse方法中做數(shù)據(jù)的提取

from jobboleproject.items import JobboleprojectItem

6.獲取圖片和文章詳情的鏈接

def parse(self, response):

# css選擇器獲取當(dāng)前列表頁面的所有的節(jié)點(diǎn)
post_nodes = response.css("#archive .floated-thumb .post-thumb a")

# 如果不是完整的域名 需要拼接完整 response.url + post_url
# 獲取到的URL可能不是一個(gè)域名,也可能是具體的文章需要使用parse函數(shù)from urllib import parse
for post_node in post_nodes:
    image_url = post_node.css("img::attr(src)").extract_first("")
    post_url = post_node.css("::attr(href)").extract_first("")
    full_url = response.urljoin(post_url)
    #meta參數(shù)對應(yīng)的是一個(gè)字典,用來傳遞數(shù)據(jù)
    yield scrapy.Request(url=full_url, meta={"front_image_url": image_url},
    callback=self.parse_detail)

7.然后將我們得到的數(shù)據(jù)封裝到一個(gè) JobboleItem 對象中骂束,可以保存每個(gè)文章的屬性:

def parse_detail(self,response):
# print(response)
# 使用xpath語法或者css語法提取網(wǎng)頁的相關(guān)信息
# extract() 串行化并將匹配到的節(jié)點(diǎn)返回一個(gè)unicode字符串列表

item = JobboleprojectItem()
#標(biāo)題
item['title'] = response.xpath('//div[@class="entry-header"]/h1/text()').extract_frist("")

#發(fā)布日期
item['create_date'] = response.xpath("http://p[@class='entry-meta-hide-on-mobile']/text()").extract_first("").strip().replace("·","").strip()

#文章地址詳情地址
item['url'] = response.url
# http://blog.jobbole.com/113949/

#文章的id
item['url_object_id'] = re.match(".*?(\d+).*", url).group(1)

# 文章圖片
item['front_image_url'] = response.meta.get("front_image_url","")

# 點(diǎn)贊數(shù)
item['praise_nums'] = response.xpath("http://span[contains(@class,'vote-post-up')]/h10/text()").extract_first("")

# 收藏?cái)?shù)
bookmark_nums = response.xpath("http://span[contains(@class,'bookmark-btn')]/text()").extract_first("")
match_bookmark_nums = re.match(".*?(\d+).*",bookmark_nums)
if match_bookmark_nums:
    item['bookmark_nums'] = int(match_bookmark_nums.group(1))
else:
    item['bookmark_nums'] = 0

# 評論數(shù)
comment_nums = response.xpath("http://a[@href='#article-comment']/span/text()").extract_first("")
match_comment_nums = re.match(".*?(\d+).*",comment_nums)
if match_comment_nums:
    item['comment_nums'] = int(match_comment_nums.group(1))
else:
    item['comment_nums'] = 0

# 文章內(nèi)容
item['content'] = response.xpath("http://div[@class='entry']").extract_first("")

# 過濾評論標(biāo)簽
tag_list = response.xpath("http://p[@class='entry-meta-hide-on-mobile']//a/text()").extract()
tag_list = [element for element in tag_list if not element.strip().endswith("評論")]
 # 標(biāo)簽
item['tags'] = ",".join(tag_list)

print(item)

# return返回?cái)?shù)據(jù),不經(jīng)過pipelines
# return item

# yield將獲取的數(shù)據(jù)交給pipelines
# yield item

8. jobbole.py文件

name = "" :這個(gè)爬蟲的識別名稱,必須是唯一的顶考,在不同的爬蟲必須定義不同的名字。
allow_domains = [] 是搜索的域名范圍妖泄,也就是爬蟲的約束區(qū)域驹沿,規(guī)定爬蟲只爬取這個(gè)域名下的網(wǎng)頁,不存在的URL會(huì)被忽略蹈胡。
start_urls = () :爬取的URL元祖/列表渊季。爬蟲從這里開始抓取數(shù)據(jù),所以罚渐,第一次下載的數(shù)據(jù)將會(huì)從這些urls開始却汉。其他子URL將會(huì)從這些起始URL中繼承性生成。
parse(self, response) :解析的方法搅轿,每個(gè)初始URL完成下載后將被調(diào)用病涨,調(diào)用的時(shí)候傳入從每一個(gè)URL傳回的Response對象來作為唯一參數(shù),主要作用如下:
負(fù)責(zé)解析返回的網(wǎng)頁數(shù)據(jù)(response.body)璧坟,提取結(jié)構(gòu)化數(shù)據(jù)(生成item)
生成需要下一頁的URL請求既穆。

9.根據(jù)目標(biāo)網(wǎng)站分析需要提取的數(shù)據(jù),在item.py文件中添加字段

打開jobboleproject文件下的item.py文件
Item 定義結(jié)構(gòu)化數(shù)據(jù)字段雀鹃,用來保存爬取到的數(shù)據(jù)幻工,有點(diǎn)像Python中的dict,但是提供了一些額外的保護(hù)減少錯(cuò)誤黎茎。
可以通過創(chuàng)建一個(gè) scrapy.Item 類囊颅, 并且定義類型為 scrapy.Field的類屬性來定義一個(gè)Item(可以理解成類似于ORM的映射關(guān)系)。
接下來傅瞻,創(chuàng)建一個(gè)JobboleprojectItem 類踢代,和構(gòu)建item模型(model)。

10.關(guān)于yeild函數(shù)介紹:

簡單地講嗅骄,yield 的作用就是把一個(gè)函數(shù)變成一個(gè) generator(生成器)胳挎,帶有 yield 的函數(shù)不再是一個(gè)普通函數(shù),Python 解釋器會(huì)將其視為一個(gè) generator溺森,帶有yeild的函數(shù)遇到y(tǒng)eild的時(shí)候就返回一個(gè)迭代值慕爬,下次迭代時(shí)窑眯, 代碼從 yield 的下一條語句繼續(xù)執(zhí)行,而函數(shù)的本地變量看起來和上次中斷執(zhí)行前是完全一樣的医窿,于是函數(shù)繼續(xù)執(zhí)行磅甩, 直到再次遇到 yield。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姥卢,一起剝皮案震驚了整個(gè)濱河市卷要,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隔显,老刑警劉巖却妨,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異括眠,居然都是意外死亡彪标,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門掷豺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捞烟,“玉大人,你說我怎么就攤上這事当船√饣” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵德频,是天一觀的道長苍息。 經(jīng)常有香客問我,道長壹置,這世上最難降的妖魔是什么竞思? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮钞护,結(jié)果婚禮上盖喷,老公的妹妹穿的比我還像新娘。我一直安慰自己难咕,他們只是感情好课梳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著余佃,像睡著了一般暮刃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爆土,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天椭懊,我揣著相機(jī)與錄音,去河邊找鬼雾消。 笑死灾搏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的立润。 我是一名探鬼主播狂窑,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桑腮!你這毒婦竟也來了泉哈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤破讨,失蹤者是張志新(化名)和其女友劉穎丛晦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體提陶,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烫沙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隙笆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌蓄。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撑柔,靈堂內(nèi)的尸體忽然破棺而出瘸爽,到底是詐尸還是另有隱情,我是刑警寧澤铅忿,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布剪决,位于F島的核電站,受9級特大地震影響檀训,放射性物質(zhì)發(fā)生泄漏柑潦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一肢扯、第九天 我趴在偏房一處隱蔽的房頂上張望妒茬。 院中可真熱鬧,春花似錦蔚晨、人聲如沸乍钻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽银择。三九已至,卻和暖如春累舷,著一層夾襖步出監(jiān)牢的瞬間浩考,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工被盈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留析孽,地道東北人搭伤。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像袜瞬,于是被迫代替她去往敵國和親怜俐。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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

  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 12,702評論 4 46
  • scrapy框架的流程圖2018-11-01框架流程圖 1邓尤、scrapy框架主要為個(gè)塊??????(1)Scrap...
    dream_seeker閱讀 1,003評論 0 1
  • 寫作這件事大部分人覺得有些難拍鲤,甚至認(rèn)為寫作應(yīng)該是作家們的事。自己寫作能力不敢恭維汞扎,就不瞎賣弄了季稳。起初我也多多少少會(huì)...
    小杰holy閱讀 147評論 0 0
  • 關(guān)鍵詞:共識、教練澈魄、專家 原則:共識決定一切基石假設(shè)1:所有優(yōu)秀的答案都在腦袋當(dāng)中景鼠,相信每個(gè)人基石假設(shè)2:群體智慧...
    拼圖區(qū)塊鏈閱讀 565評論 0 0
  • 我155的身高,九十幾斤的體重一忱,覺得自己腿好粗莲蜘,肚子圓鼓鼓,大臉胖乎乎帘营,我覺得自己很胖票渠,我覺得只有瘦下來才會(huì)變美。...
    譯家人閱讀 385評論 6 0