本文主要記錄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