scrapy爬蟲框架學習之路 3 25

2021-10-04 10:04:55 字數 4482 閱讀 6191

上回我們說到,如何使用python的requests請求庫爬取豆瓣高分電影榜,本次就說一說如何使用scrapy這個python爬蟲框架去實現爬蟲功能。

首先,使用scrapy的框架需要經歷一下步驟:

建立工程專案

scrapy的工程建立在命令列中完成的。首先在命令列中輸入,就可以建立乙個名字叫做cnblogspider專案。
scrapy startproject cnblogspidr

建立好專案後,我們的專案檔案結構如下:

cnblogspidr/

crapy.cfg

cnblogspidr/

__init__.py

items.py

middlewares.py

pipelines.py

settings.py

spiders/

__init__.py

這些檔案的作用分別如下:

scrapy.cfg:專案部署檔案

cnblogspider/:該項目的python模組,之後可以再次加入**。

cnblogspider/items.py:專案中的item檔案。

cnblogspider/popelines.py:專案中的pipelines檔案

cnblogspider/setting.py:專案配置檔案。

cnblogspider/spider/:放置spider**的目錄。

以上就完成了第一步,也就是scrapy專案的建立。按照爬取流程,我們需要建立乙個請求,在requests中直接是使用get()方法就行了,而在scrapy中我們需要做的就是編寫乙個spider.py檔案。在上述的專案spider目錄下建立乙個名稱為cnblog_spider.py的檔案,在這個檔案中編寫**。**如下:

import scrapy

import json

import sys

from cnblogspider import items

class dbspider(scrapy.spider):

name="dbspider"

#       allowed_domains=["douban.com"]

# start_urls=[""]

def start_requests(self):

header=

url=""

return [scrapy.request(url,callback=self.parse)]

def parse(self,response):

pass

class dbspider(scrapy.spider):#繼承spider類
這個scrapy.spider類有一些重要的屬性和方法,

name:是專案的名字,必須唯一。

parse()方法:用於處理在請求start_url後,之後的方法,這個方法是獲取每個初始url響應後返回的respone物件,將作為唯一引數傳給該方法。對網頁的解析,與提取(生成item)以及生成需要進一步處理的url的request物件。

start_request:該方法返回乙個可迭代物件,該物件包好了spider用於爬取的第乙個request。

上述**中parse方法留空了,而且沒有用到allowed_domains,和start_urls這兩個屬性。是因為我在這裡重寫了staet_request方法。這樣可以自定義request請求相關的資料,如請求頭之類的,也可以定製user-agent引數用於反爬蟲(建立ua池用於反爬蟲的方法在文章末)。當然,如果不適用start_request重寫也可以,示例如下:

import scrapy

class cnblogsspider(scrapy.spider):

name='cnblogs'#爬蟲的名稱

allowed_domains=['cnblogs.com']#允許的網域名稱

start_urls=['']

​ def parse(self,reponse):

#實現網頁的解析

pass

我們在start_request中重寫,目的是為了將自定義一些和請求有關的請求頭。在請求頭中新增user-agent的方式如下。

def start_requests(self):

header=

url=""

return [scrapy.request(url,headers=header,callback=self.parse)]

以上乙個包含請求頭的start_request方法就建立好了,該方法只執行一次,對給定的url發起請求,並返回乙個響應。而我們請求的檔案是乙個json檔案。在parse中就不會用太多的方式去解析。有關scrapy的解析方式此鏈結(官方文件)

現在需要的做的事是編寫item。這在檔案目錄的cnblogspider下的items.py檔案。這個檔案的作用是建立用於儲存資料的字段。

import scrapy

class cnblogspideritem(scrapy.item):

movie_url=scrapy.field()

title=scrapy.field()

rate=scrapy.field()

其中的title=scrapy.field()就是建立了乙個欄位為title。因為只爬取了豆瓣電影title,url,rate三種資料,所以這裡就建立這三種字段。

建立好item後,就可以在cnblog_spider.py中呼叫了,接下來編寫parse(),用於解析資料和儲存資料。需要注意的是,items.pycnblog_spider.py的上層目錄,如果想要呼叫它,就得新增路徑如下:

import scrapy

import json

import sys

from cnblogspider import items

def parse(self,response):

j=json.loads(response.body)['subjects']

for i in j:

title=i['title']

rate=i['rate']

movie_url=i['url']

item=items.cnblogspideritem(title=title,movie_url=movie_url,rate=rate)

yield item

從response中提取到title,rate,url等資料。如何新增到剛才建立的item中呢?

item=items.cnblogspideritem(title=title,movie_url=movie_url,rate=rate)
這樣就將title,movie_url,rate等資料通過引數的方法建立了乙個item物件,最後用yield返回。那麼資料就能儲存到item對應的字段中了。

import json

from scrapy.exceptions import dropitem#用於測試異常

​class cnblogspiderpipeline(object):

def __init__(self):

self.file=open('douban.json','w')

def process_item(self, item, spider):

if item['title']:

line=json.dumps(dict(item))

self.file.write(line)

return item

else:

raise dropitem('missing title in %s'% item)

return item

這就是將資料儲存到檔案douban.json的檔案中了。但是建立了pipelines後還需要將其啟用,不然不能使用。在settings.py檔案中建立乙個item_pipelines欄位,將剛才的pipelines寫進入去,如下,最後的300可以理解為優先順序的意思,scrapy中可以使用0-1000。

item_pipelines =
以上就完成了所有的乙個完整的scrapy專案的**編寫。還差最後一步執行爬蟲。在終端中輸入下列**:

scrapy crawl dbspider
dbspider就是在cnblog_spider.py中的name屬性。如果執行沒錯就會在cnblog_spider資料夾下生成乙個douban.json的檔案。最好的學習scrapy的方式就是去啃官方文件

之前使用的ua是硬編碼進去的,如何建立乙個ua池,並在request時隨機的從這個ua池挑選乙個user-agent呢?請聽下次分解。

Scrapy框架爬蟲學習 3

繼上一節課爬取到了資料之後,這一節將資料入庫。因為python自帶了sqlite seklait 資料庫,直接用就可以。1.新建 sqlite 資料庫 在pycharm下進入terml,然後進入ipython模式,之後 import sqlite3 zufang sqlite3.connect zu...

Scrapy爬蟲框架學習

目錄 五大模組 spider itempipeline schedule engine 四個配置引數 三個物件 常用屬性 常用方法 response 常用屬性 常用方法 item 兩類中介軟體 middleware spidermiddleware 解析html,產生爬取請求和資料 流水線處理資料,...

爬蟲scrapy框架學習(三)

3.示例2redisspider a.使用方法 它與示例1只有乙個地方不同,就是將start url存入redis中,如下 b.總結 該示例很簡單,只是將start url存入redis key中,就可實現分布式爬蟲,多台電腦共同完成乙個爬蟲,資料不會重複 4.示例3rediscrawlspider...