Scrapy爬蟲框架新手入門教程

2020-10-16 小鋒學長

​Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。




目錄

安裝

測試

新建工程

創建spider文件(以豆瓣電影為例)

架構(綠線是數據流向)

運作流程(個人理解)

製作步驟

在item中指明爬取欄位

編寫spider/movie.py

數據存至資料庫

其他

最後


安裝

pip安裝,可能會報錯:

pip install Scrapy

anaconda安裝,推薦:

conda install -c conda-forge scrapy

測試

scrapy

新建工程

scrapy startproject <工程名>

scrapy startproject douban

創建的目錄結構

  • scrapy.cfg: 項目配置文件
  • douban/: 項目python模塊, 代碼將從這裡導入
  • douban/items.py: 項目items文件,存要爬取的欄位信息,可以插入資料庫、寫入txt等
  • douban/pipelines.py: 項目管道文件,將爬取的數據進行持久化存儲
  • douban/settings.py: 項目配置文件,可以配置資料庫等
  • douban/spiders/: 放置spider的目錄,也就是你要寫邏輯代碼的地方
  • douban/middlewares:中間件,請求和響應都將經過他,可以配置請求頭、代理、cookie、會話維持等


創建spider文件(以豆瓣電影為例)

scrapy genspider <項目名> <爬取域>

cd doubanscrapy genspider movie movie.douban.com

將在spiders文件夾下自動創建movie.py,並自動生成內容:

可以看出,要建立一個Spider, 你必須用scrapy.Spider類創建一個子類,並確定了三個強制的屬性 和 一個方法

  • name = "" :爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。
  • allow_domains = [] :是搜索的域名範圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。
  • start_urls = () :爬取的URL元祖/列表。爬蟲從這裡開始抓取數據,所以,第一次下載的數據將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。
  • parse(self, response) :解析的方法,每個初始URL完成下載後將被調用,調用的時候傳入從每一個URL傳回的Response對象來作為唯一參數,主要作用如下:負責解析返回的網頁數據(response.body),提取結構化數據(生成item);生成需要下一頁的URL請求。

架構(綠線是數據流向)


  • Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。
  • Scheduler(調度器): 它負責接受引擎發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。
  • Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,
  • Spider(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item欄位需要的數據,並將需要跟進的URL提交給引擎,再次進入Scheduler(調度器).
  • Item Pipeline(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、存儲等)的地方。
  • Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。
  • Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

運作流程(個人理解)

  • 用戶編寫spider並運行
  • 將第一個URL傳給引擎
  • 引擎將URL對應的request傳給調度器
  • 調度器將request排序入隊
  • 調度器將處理好的request返回到引擎
  • 引擎將request按照下載中間件的設置傳給下載器
  • 下載器執行request並獲得response(如果下載失敗,然後引擎告訴調度器,這個request下載失敗了,你記錄一下,待會兒再下載)
  • 下載器將response返回到引擎
  • 引擎將request返回到spider用戶這(默認交到def parse()這個函數處理)
  • spider處理完數據後,將需要跟進的URL和要保存的item傳給引擎
  • 引擎將item傳給管道進行處理保存,並將URL進入下一輪循環
  • 只有當調度器中不存在任何request了,整個程序才會停止,(也就是說,對於下載失敗的URL,Scrapy也會重新下載。)

製作步驟

  1. 新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
  2. 明確目標 (編寫items.py):明確你想要抓取的目標
  3. 製作爬蟲 (spiders/xxspider.py):製作爬蟲開始爬取網頁
  4. 存儲內容 (pipelines.py):設計管道存儲爬取內容

在item中指明爬取欄位

如「名稱」、「評分」、「簡介」

  • Item 定義結構化數據欄位,用來保存爬取到的數據,有點像 Python 中的 dict,但是提供了一些額外的保護減少錯誤。
  • 可以通過創建一個 scrapy.Item 類, 並且定義類型為 scrapy.Field 的類屬性來定義一個 Item(可以理解成類似於 ORM 的映射關係)。

在item.py中修改為:

class DoubanItem(scrapy.Item): name = scrapy.Field() rating_num = scrapy.Field() quote = scrapy.Field()

編寫spider/movie.py

1、選擇目標的xpath(也可以css等其他選擇器)

2、提取出公共部分


3、由於豆瓣有反爬驗證,因此需要加上header

def start_requests(self): url = 'http://movie.douban.com/top250/' yield scrapy.Request(url, headers=self.headers)

通過start_requests函數,對於運行後第一次訪問請求,就加上了請求頭。因此,start_urls其實也可以不加。


4、為了方便調試,新建spider/main.py,並寫入

from scrapy.cmdline import executeexecute(["scrapy", "crawl", "movie", "-o", "item.json"])


5、測試一下效果

class MovieSpider(scrapy.Spider): name = 'movie' allowed_domains = ['movie.douban.com/top250'] start_urls = ['http://movie.douban.com/top250/'] headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'} def start_requests(self): url = 'http://movie.douban.com/top250/' yield scrapy.Request(url, headers=self.headers) def parse(self, response): for each in response.xpath('//*[@id="content"]/div/div[1]/ol/li'): print(each.xpath('./div/div[2]/div[1]/a/span[1]').extract())

運行main.py

要提取中間的文字,則在xpath後面再添加「/text()」


6、類似地,完善parse()函數

from ..items import DoubanItem

def parse(self, response): # 將得到的數據封裝到一個DoubanItem對象,就是在items.py裡的 item = DoubanItem() for each in response.xpath('//*[@id="content"]/div/div[1]/ol/li'): name = each.xpath('./div/div[2]/div[1]/a/span[1]/text()').extract_first() rating_num = each.xpath('./div/div[2]/div[2]/div/span[2]/text()').extract_first() quote = each.xpath('./div/div[2]/div[2]/p[2]/span/text()').extract_first() item['name'] = name item['rating_num'] = rating_num item['quote'] = quote yield item


7、運行main.py後,在spider/item.json裡將看到爬取的數據,以Unicode字符形式。


8、還可以保存為其他形式,如csv、xml,只需將item.json改為item.csv等。


數據存至資料庫

1、建庫建表

mysql -uroot -p Enter password:create database scrapy;use scrapy;create table movie(id int auto_increment primary key, name varchar(255),rating varchar(10), quote varchar(255))default charset=utf8;


2、在setting.py中配置資料庫連接

mysql_movie = { 'host': "127.0.0.1", "port": 3306, "user": "root", "password": "pwd", "db": "scrapy"}


3、在setting.py中將以下內容取消注釋


4、在pipelines.py中連接資料庫存儲數據

pip install pymysql

# -*- coding: utf-8 -*-# Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.htmlfrom .settings import mysql_movieimport pymysqlclass DoubanPipeline: def __init__(self): self.host = mysql_movie["host"] self.port = mysql_movie["port"] self.user = mysql_movie["user"] self.password = mysql_movie["password"] self.db = mysql_movie["db"] self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, db=self.db, charset='utf8') self.cursor = self.conn.cursor() def process_item(self, item, spider): sql ='''insert into movie(name, rating, quote)values('%s','%s','%s')''' % (item["name"], item["rating_num"], item["quote"]) try: self.cursor.execute(sql) self.conn.commit() except: self.conn.rollback() return item


5、運行main.py後,查詢資料庫

select * from movie;


其他

URL跟進(翻頁);在parse函數最後,跟新以下URL,scrapy框架會自動發起下一次請求

def parse(self, response): # 將得到的數據封裝到一個DoubanItem對象 item = DoubanItem() for each in response.xpath('//*[@id="content"]/div/div[1]/ol/li'): name = each.xpath('./div/div[2]/div[1]/a/span[1]/text()').extract_first() rating_num = each.xpath('./div/div[2]/div[2]/div/span[2]/text()').extract_first() quote = each.xpath('./div/div[2]/div[2]/p[2]/span/text()').extract_first() item['name'] = name item['rating_num'] = rating_num item['quote'] = quote yield item next_url = response.xpath('//*[@id="content"]/div/div[1]/div[2]/span[3]/link/@href').extract() if next_url: next_url = 'https://movie.douban.com/top250' + next_url[0] print(next_url) yield scrapy.Request(next_url, headers=self.headers)

為了做一個乖爬蟲,且避免面向監獄編程,建議在setting.py至少開啟以下兩項:

最後

相信你跟我一樣,過完本文,對scrapy已經有了一個大致的了解。

相關焦點

  • 「小白學爬蟲連載(8)」——scrapy框架入門教程
    接下來將通過爬取scrapy官方提供的一個網站,演示如何利用scrapy爬取網頁信息。可能有的朋友有疑問,之前已經介紹過requests庫,為啥還要用scrapy呢?簡單來講就是requests庫適合小批量爬取網頁內容,如若需要高頻次、大批量爬取網頁還是scrapy比較好用,而且很多公司要求熟練掌握scrapy框架,所以技多不壓身嘛,接下來咱們就好好學學scrapy。
  • 進階爬蟲框架Scrapy,告別單一爬蟲
    這些都是進行一些單一的爬取,大規模的爬取的話會很麻煩,今天開始我同大家一起學習一個進階爬蟲框架scrapy,何為框架,就好比一個車,它有了輪子,有了很多設備,我們只需要做簡單的操作就可以啟動它,到達我們想要去的目的地。scrapy作為爬蟲進階部分的必會知識,在對Scrapy有了一定的熟悉後,也想通過這個教程幫助一些想要學習Scrapy的人,畢竟爬蟲還是很有意思的。
  • scrapy爬蟲框架的運用
    # scrapy# 爬蟲框架- 框架- 爬蟲框架- scrapy- pyspider- crawley- scrapy框架介紹- https://doc.scrapy.org/en/latest/- http://scrapy-chs.readthedocs.io
  • 使用Scrapy網絡爬蟲框架小試牛刀
    前言這次咱們來玩一個在Python中很牛叉的爬蟲框架——Scrapy。scrapy 介紹標準介紹Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高性能異步下載,隊列,分布式,解析,持久化等)的具有很強通用性的項目模板。
  • 「爬蟲教程」第六章:Scrapy框架(上)
    回顧一下寫一個爬蟲需要做的一些步驟,使用requests庫發送網絡請求、使用lxml等解析技術對數據進行解析、使用資料庫等方法進行存儲數據,另外還可以在請求網絡的時候進行更換IP、設置請求頭等。每次爬蟲都要幹這麼多活,如果每次都從零開始寫則比較浪費時間,所以我們需要一個框架,這個框架幫我們把一些基本的爬蟲前奏都準備好了,我們只需要「站在巨人的肩膀上」即可。
  • python 爬蟲框架Scrapy使用方法
    Python作為腳本語言,功能非常強大,這裡介紹一下爬蟲框架Scrapy有安裝及使用方法介紹。一、安裝篇python3在安裝scrapy時,需要twisted的支持,但安裝twisted會需要visual studio的支持,詳見本人的另一文章Python 3.5 安裝scrapy無法找到vcvarsall.bat解決方案.
  • 「爬蟲教程」第六章:Scrapy框架(下)
    CrawelSpider 繼承自Scrapy ,在scrapy基礎上加了新的功能。創建CrawelSpider 的步驟跟scrapy差不多:創建工程: scrapy startproject 項目名創建爬蟲:scrapy genspider -t crawl 爬蟲名 域名 (就這一步不同)運行爬蟲:scrapy crawl 爬蟲名了解CrawelSpider 主要了解下面兩個東西
  • 簡單使用scrapy爬蟲框架批量採集網站數據
    本篇文章就使用python爬蟲框架scrapy採集網站的一些數據。框架爬取數據的基本流程。 Scrapy的爬蟲項目的創建流程 1.創建一個爬蟲項目 在Pycharm中選擇 Terminal 在 Local 裡面輸入 scrapy startproject +(項目名字
  • Python 爬蟲框架Scrapy 簡單介紹
    Scrapy 簡介Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。Scrapy 使用了 Twisted 異步網絡框架來處理網絡通訊,結構清晰明了,並且包含了各種中間件接口,可以靈活的完成各種需求。
  • Scrapy爬蟲框架結構介紹(各部分組件功能,常用命令)
    Python之srcapy介紹Scrapy是一個健壯的爬蟲框架,可以從網站中提取需要的數據。是一個快速、簡單、並且可擴展的方法。Scrapy使用了異步網絡框架來處理網絡通訊,可以獲得較快的下載速度,因此,我們不需要去自己實現異步框架。並且,Scrapy包含了各種中間件接口,可以靈活的完成各種需求。
  • python爬蟲小白——scrapy的使用
    本文中的知識點:安裝scrapyscrapy的基礎教程scrapy使用代理安裝scrapy以下的演示是基於windows系統,windows與linux都可以用。安裝好後,確認scrapy是否安裝看下這裡的代碼,先導入scrapy,定義了一個BaiduSpider類,必須要繼承scrapy.Spider。這裡注意,裡面有3個必須的屬性(name,allowed_domains,start_urls)。name——爬蟲的名字,運行爬蟲的時候就看這個參數。allowed_domains——抓取的域名限制,這是我們剛才在命令行輸入的。
  • Scrapy 原理,新手必須跳的爬蟲坑
    Scrapy 初步使用,新手上車繼續scrapy這個友好框架,主要分三步來講解:代碼實例,原理講解,高級特性1.Scrapy 的代碼實例:大家看到上圖,用java寫一個爬蟲需要很多的代碼,同一個功能,它的代碼會繁雜得多。
  • Python程式語言:如何建立爬蟲框架
    建立爬蟲框架,首先學習scrapy爬蟲框架!這個爬蟲框架是一個快速且功能強大的網絡爬蟲框架!scrapy爬蟲框架安裝如下:在Windows平臺上,以管理員身份運行cmd,執行pip install scrapy 進行安裝這個框架,安裝好了之後,進行檢測一下,執行scrapy —h就好了!
  • Python爬蟲:Scrapy-redis分布式爬蟲講解
    Github地址:https://github.com/rmax/scrapy-redis安裝:pip install scrapy-redisscrapy_redis在scrapy的基礎上實現了更多,更強大的功能,具體體現在:
  • 「爬蟲教程」第六章:Scrapy框架(中)
    而實際我們一般也不會這麼幹,像這種網站一般都可以用域名+相對路徑來訪問到不同的頁面,糗事百科中可以找到 下一頁按鈕 的 a標籤中 的href 就是下一頁的url的相對路徑只需要改動qsbk_spider.py 的內容:import scrapyfrom qsbk.items import QsbkItemclass QsbkSpiderSpider(scrapy.Spider
  • 優化python爬蟲scrapy
    我以前重複同樣的項目配置,一個爬蟲下來得調試個一個多小時已經算快的了,畢竟框架好多地方需要修改。以爬取小說網站為例,不同地方在於提取標題、網址Url、內容的xpath不一樣,即只是spiders文件夾下爬蟲文件不一樣而已。
  • Python之初識Scrapy框架
    今天帶大家了解下 Scrapy 框架,先解答三個問題:什麼是 Scrapy 框架呢?它有什麼作用呢?為什麼需要使用它?Scrapy 是 Python 開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取 web 站點並從頁面中提取結構化的數據。
  • 如何使用Scrapy框架進行爬蟲呢?
    Scrapy框架介紹Scrapy是一個基於Twisted的異步處理框架,是純Python實現的爬蟲框架,其架構清晰,模塊之間耦合程度低,可擴展性極強,可以靈活完成各種需求。我們只需要定製開發幾個模塊就可以輕鬆實現一個爬蟲。
  • python爬蟲29 | 使用scrapy爬取糗事百科
    是時候給你說說爬蟲框架了使用框架來爬取數據會節省我們更多時間很快就能抓取到我們想要抓取的內容今天小帥b就跟你說說scrapy這個框架到底有多牛b在你想要存放的爬蟲文件目錄下使用命令來創建一個 scrapy 爬蟲項目比如在這裡我們要創建一個 qiushibaike 的爬蟲項目
  • python scrapy 爬蟲筆記匯總,如何寫 一個專業的scrapy爬蟲
    之前我們已經寫好了scrapy網絡爬蟲爬取極品笑話大全,但是不夠專業,要在items 中定義好模型。整個爬取數據的模型,我們這個比較簡單,只有一個內容,有的還要爬取title,這些,我們就要寫上title=scrapy.Field()Scrapy 爬蟲匯總:1.Response 是一個scrapy.http.response.html HtmlResponse 對像,可以執行』xpath』,』css』來提取數據2.提取出來的數據是一個『selector』或者