使用Scrapy創(chuàng)建爬蟲和常用命令

本文主要記錄Scrapy的常用命令,用于備忘辕宏。適用于Windows平臺畜晰。
例如,我們要爬取這個網(wǎng)站:https://www.tudinet.com/market-252-0-0-0/ 重慶地區(qū)的土地轉(zhuǎn)讓信息瑞筐。

整體流程如下:

1凄鼻、使用scrapy startproject cq_land命令創(chuàng)建項目
2、修改settings.py聚假,使爬蟲生效(ITEM_PIPELINES块蚌、 USER_AGENT 等)
3、修改items.py魔策,用于存儲爬取回來的數(shù)據(jù)
4匈子、使用scrapy genspider tudinet tudinet.com 命令河胎,創(chuàng)建爬蟲文件闯袒,用于爬取網(wǎng)頁內(nèi)容
5、編寫上一步生成的tudinet.py爬蟲文件,完成網(wǎng)頁內(nèi)容解析
6政敢、修改pipelines.py文件其徙,對獲取到的信息進(jìn)行整理,完成存儲
1喷户、萬事第一步:創(chuàng)建工程

首先在cmd或powershell窗口唾那,CD到想要創(chuàng)建項目的目錄,然后輸入以下命令褪尝,創(chuàng)建了一個名為cq_land的項目闹获。

scrapy startproject cq_land
PS C:\WINDOWS\system32> e:
PS E:\> cd E:\web_data
PS E:\web_data> scrapy startproject cq_land
New Scrapy project 'cq_land', using template directory 'c:\\programdata\\anaconda3\\lib\\site-packages\\scrapy\\templates\\project', created in:
    E:\web_data\cq_land

You can start your first spider with:
    cd cq_land
    scrapy genspider example example.com
PS E:\web_data>

這樣就生成了一個cq_land的文件目錄(完成后先不要關(guān)閉終端窗口,后面第4步還會用到)河哑。接下來避诽,我們主要針對items.py、settings.py璃谨、pipelines.py和spiders文件夾進(jìn)行修改沙庐。

2、修改settings.py佳吞,使爬蟲生效

將settings.py中拱雏,ITEM_PIPELINES 附近的注釋去掉,修改為:

修改前:
#ITEM_PIPELINES = {
#    'cq_land.pipelines.CqLandPipeline': 300,
#}

修改后:
ITEM_PIPELINES = {
    'cq_land.pipelines.CqLandPipeline': 300,
}

有些網(wǎng)站可能需要設(shè)置USER_AGENT底扳,所以铸抑,加上USER_AGENT防止一般的網(wǎng)站反爬。

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
3花盐、修改items.py羡滑,用于存儲爬取回來的數(shù)據(jù)
土地出讓信息

觀察數(shù)據(jù)結(jié)構(gòu)丰辣,主要信息有很多字段垛叨,以獲取標(biāo)題和推出時間為例涎显,定義兩個item項目(items里面定義的內(nèi)容井仰,可以理解為定義了一個命名為item的字典识窿,每個定義的項目最為鍵值對存儲在item字典中——鍵值對存儲的內(nèi)容可以是任何Python對象[常用的字符串渗稍、列表等])曼尊,修改items.py文件內(nèi)容如下:

class CqLandItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field() # 出讓地標(biāo)題
    list_time = scrapy.Field() # 推出時間
4蚁鳖、創(chuàng)建爬蟲文件届囚,用于爬取網(wǎng)頁內(nèi)容

這時候返回到cmd或powershell終端有梆,cd進(jìn)入cq_land目錄,然后創(chuàng)建名為tudinet的爬蟲文件意系,用于爬取土流網(wǎng)的數(shù)據(jù)泥耀。

PS E:\web_data> cd cq_land
PS E:\web_data\cq_land> scrapy genspider tudinet tudinet.com
Created spider 'tudinet' using template 'basic' in module:
  cq_land.spiders.tudinet
PS E:\web_data\cq_land>

完成后,將在spider文件夾下產(chǎn)生一個叫tudinet.py的文件蛔添。這個文件就是定義爬蟲怎么解析網(wǎng)頁的文件痰催,解析的內(nèi)容怎么存儲到剛才定義好的item中兜辞。

5、編寫tudinet.py文件夸溶,完成網(wǎng)頁內(nèi)容解析

首先需要將剛才定義好的item內(nèi)容import進(jìn)來逸吵,然后修改start_urls為我們要爬取的網(wǎng)頁(這里我們只爬取一個網(wǎng)頁作為示例)。然后在parse函數(shù)中定義處理過程缝裁,并返回結(jié)果扫皱,代碼如下:

import scrapy
from cq_land.items import CqLandItem

class TudinetSpider(scrapy.Spider):
    name = 'tudinet'
    allowed_domains = ['tudinet.com']
    start_urls = ['https://www.tudinet.com/market-252-0-0-0']

    def parse(self, response):
        item=CqLandItem()
        item['title']=response.xpath("http://div[@class='land-l-bt']/text()").extract()
        item['list_time']=response.xpath("http://div[@class='land-l-cont']/dl/dd/p[1]/text()").extract()
        
        return item

以上是針對單個網(wǎng)頁,但實際上我們爬蟲多半是需要針對整個網(wǎng)站的所有土地轉(zhuǎn)讓信息進(jìn)行爬取的捷绑,因此韩脑,我們根據(jù)網(wǎng)站翻頁的變化,一共有100頁可以供我們爬取粹污。因此扰才,我們可以在開頭對start_urls進(jìn)行重新定義,用以爬取這100個頁面厕怜。

這里有2種處理方式衩匣,第一種處理方式,就是直接把這100個url作為列表放到start_urls 中粥航。其他的就不用改動了琅捏。

第二種處理方式,就是重新定義start_requests函數(shù)递雀。實際上定義這個函數(shù)就是把start_urls列表里面的地址用函數(shù)生成柄延,然后再通過callback參數(shù)設(shè)置回調(diào)函數(shù),讓parse函數(shù)來處理Request產(chǎn)生的結(jié)果缀程。

import scrapy
from cq_land.items import CqLandItem
from scrapy.http import Request

class TudinetSpider(scrapy.Spider):
    name = 'tudinet'
    allowed_domains = ['tudinet.com']
    # start_urls = ['https://www.tudinet.com/market-252-0-0-0']
    
    def start_requests(self):
        init_url='https://www.tudinet.com/market-252-0-0-0/list-pg'
        for i in range(1,101):
            yield Request("".join([init_url,str(i),'.html']),callback=self.parse)

    def parse(self, response):
        item=CqLandItem()
        item['title']=response.xpath("http://div[@class='land-l-bt']/text()").extract()
        item['list_time']=response.xpath("http://div[@class='land-l-cont']/dl/dd/p[1]/text()").extract()
        
        return item

實際上搜吧,對于有多個層次的網(wǎng)頁,例如某些論壇杨凑,有很多文章列表滤奈。我們首先需要訪問首頁獲取頁面總數(shù),然后遍歷所有頁面獲取每個帖子的url撩满,最后通過訪問每個帖子的地址獲取文章的詳細(xì)信息蜒程。那么我們的爬蟲文件結(jié)構(gòu)如基本如下:

class abc_Spider(scrapy.Spider):
    name='abc'
    allowed+domains=['abc.com']
    start_urls=['論壇的首頁']
    # 獲取總頁數(shù)
    def parse(self,response):
        pages=response.xpath("http://xxxx//").extract()
        # 這里省略了將pages由字符轉(zhuǎn)數(shù)字的過程
        for i in range(1,int(pages)):
            yield Request("".join(['xx.abc.com',str(i),"xxx"]),callback=self.get_detail_urls)
    # 獲取所有文章詳情頁的頁面url
    def get_detail_urls(self,response):
        detail_urls=response.xpath("http://xxxx//").extract()
        for url in detail_urls:
            yield Request(url,callback=self.parse_content)
    # 對詳情頁內(nèi)容進(jìn)行解析,并返回結(jié)果
    def parse_content(self,response):
        item=abcitem()
        item['xx']=response.xpath("http://xxxx//").extract()
        return item
6伺帘、修改pipelines.py昭躺,對獲取到的信息進(jìn)行整理,完成存儲

將pipelines.py修改為如下內(nèi)容伪嫁,爬取的內(nèi)容將會存儲到cq_land.csv文件中领炫。

import pandas as pd

class CqLandPipeline(object):        
    def process_item(self, item, spider):
        title=item['title']
        list_time=item['list_time']
        data=pd.DataFrame([title,list_time],index=['標(biāo)題','推出時間']).T
        data.to_csv('cq_land.csv',index=False,encoding='gb2312')
        return item

需要注意的是,上述存儲方式適用于單個網(wǎng)頁的爬取张咳。如果是多個網(wǎng)頁帝洪,需要在data.to_csv中添加參數(shù)针史,mode='a',表示以追加的方式添加數(shù)據(jù)碟狞,同時應(yīng)注意數(shù)據(jù)的列標(biāo)題問題。另外婚陪,也可以使用數(shù)據(jù)庫等方式在這里將數(shù)據(jù)直接存儲到數(shù)據(jù)庫族沃。

7、使用scrapy crawl tudinet 運(yùn)行爬蟲

完成上述文件編輯后泌参,返回cmd或powershell終端脆淹,運(yùn)行:scrapy crawl tudinet

PS E:\web_data\cq_land> scrapy crawl tudinet
2019-04-15 19:35:34 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: cq_land)
2019-04-15 19:35:34 [scrapy.utils.log] INFO: Versions:
……
……

沒有意外的話,上述代碼會產(chǎn)生一個cq_land.csv文件沽一,打開文件如果內(nèi)容正確就說明爬蟲編寫成功了盖溺。
當(dāng)然,scrapy crawl tudinet還可以帶參數(shù)铣缠,用于顯示日志的級別:

CRITICAL - 嚴(yán)重錯誤(critical)
ERROR - 一般錯誤(regular errors)
WARNING - 警告信息(warning messages)
INFO - 一般信息(informational messages)
DEBUG - 調(diào)試信息(debugging messages)

可以使用以下方法按需要顯示日志
# 完全不輸出日志
scrapy crawl tudinet --nolog
# 按默認(rèn)輸入日志
scrapy crawl tudinet -L DEBUG

以上就是scrapy爬蟲的基本形式烘嘱。
通常情況下,對于不熟悉scrapy的情形下蝗蛙,可能對scrapy產(chǎn)生的內(nèi)容不了解蝇庭,不知道哪里出了問題,這里可能需要用到scrapy的另一命令捡硅,scrapy shell url哮内。這個命令會直接爬取url的內(nèi)容,然后在終端中壮韭,通過ipython終端的方式產(chǎn)生交互北发,用戶可以使用response.xpath() 等方法測試返回結(jié)果。如response.url就是請求的url喷屋。

PS E:\web_data\cq_land> scrapy shell https://www.tudinet.com/market-252-0-0-0
2019-04-15 20:21:03 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: cq_land)
2019-04-15 20:21:03 [scrapy.utils.log] INFO: Versions: lxml 4.2.1.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.1, w3lib 1.19.0, Twisted 18.9.0, Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 18.0.0 (OpenSSL 1.0.2o  27 Mar 2018), cryptography 2.2.2, Platform Windows-10-10.0.17763-SP0
……
……
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x000001DAF8807358>
[s]   item       {}
[s]   request    <GET https://www.tudinet.com/market-252-0-0-0>
[s]   response   <200 https://www.tudinet.com/market-252-0-0-0>
[s]   settings   <scrapy.settings.Settings object at 0x000001DAF9B70898>
[s]   spider     <TudinetSpider 'tudinet' at 0x1daf9532f28>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
In [1]:
附:scrapy的命令列表
全局的命令有:

startproject :創(chuàng)建項目(常用必須)
genspider :創(chuàng)建爬蟲(常用必須)
settings :獲取當(dāng)前的配置信息琳拨,通過scrapy settings -h可以獲取這個命令的所有幫助信息
runspider :未創(chuàng)建項目的情況下,運(yùn)行一個編寫在Python文件中的spider
shell : 在終端窗口請求一個網(wǎng)址屯曹,可用于探索爬取獲得的內(nèi)容(常用)
fetch :過scrapy downloader 講網(wǎng)頁的源代碼下載下來并顯示出來
view :將網(wǎng)頁document內(nèi)容下載下來从绘,并且在瀏覽器顯示出來
version :查看版本信息,并查看依賴庫的信息

項目命令有:

crawl :運(yùn)行爬蟲(常用必須)
check : 檢查代碼是否有錯誤
list :列出所有可用爬蟲
edit :edit 在命令行下編輯spider ### 不建議運(yùn)行
parse 
bench
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是牢,一起剝皮案震驚了整個濱河市僵井,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驳棱,老刑警劉巖批什,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異社搅,居然都是意外死亡驻债,警方通過查閱死者的電腦和手機(jī)乳规,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來合呐,“玉大人暮的,你說我怎么就攤上這事√适担” “怎么了冻辩?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拆祈。 經(jīng)常有香客問我恨闪,道長,這世上最難降的妖魔是什么放坏? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任咙咽,我火速辦了婚禮,結(jié)果婚禮上淤年,老公的妹妹穿的比我還像新娘钧敞。我一直安慰自己,他們只是感情好麸粮,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布犁享。 她就那樣靜靜地躺著,像睡著了一般豹休。 火紅的嫁衣襯著肌膚如雪炊昆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天威根,我揣著相機(jī)與錄音凤巨,去河邊找鬼。 笑死洛搀,一個胖子當(dāng)著我的面吹牛敢茁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播留美,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼彰檬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谎砾?” 一聲冷哼從身側(cè)響起逢倍,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎景图,沒想到半個月后较雕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年亮蒋,在試婚紗的時候發(fā)現(xiàn)自己被綠了扣典。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡慎玖,死狀恐怖贮尖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趁怔,我是刑警寧澤湿硝,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站痕钢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏序六。R本人自食惡果不足惜任连,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望例诀。 院中可真熱鬧随抠,春花似錦、人聲如沸繁涂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扔罪。三九已至秉沼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矿酵,已是汗流浹背唬复。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留全肮,地道東北人敞咧。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像辜腺,于是被迫代替她去往敵國和親休建。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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