Scrapy筆記-完整實例
這篇文章通過一個比較完整的例子來指導使用scrapy,我選擇抓取外星人源碼網(wǎng)的帖子列表。
?這里我們主要需要完成以下幾個步驟:
- 創(chuàng)建一個新的scrapy工程
- 定義你所需要抽取的Item對象
- 編寫一個Spider來爬取某個網(wǎng)站并提取出所有的Item對象
- 編寫一個Item Pipline來存儲提取出來的Item對象
?Scrapy使用python語言編寫,需要有python語言基礎。
創(chuàng)建一個Scrapy工程
在任意一個你喜歡的目錄執(zhí)行以下命令即可創(chuàng)建一個新的工程:
scrapy startproject eenotScrapy
將會創(chuàng)建eenot文件夾,其目錄結構如下:

目錄結構
,scrapy項目創(chuàng)建完成。
定義我們的Item
?我們通過創(chuàng)建一個scrapy.item類,并定義的它的類型為scrapt.Field的屬性,我們準備將外星人源碼論壇帖子的標題,日期和簡介爬取下來。
import scrapy
class EenotItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
posts_title = scrapy.Field()
posts_date = scrapy.Field()
posts_des = scrapy.Field()
編寫一個Spider
?這個部分主要是自定義的一些類,Scrapy使用它們來從一個domain爬取信息,在spider中定義了一個初始化的URL下載列表,以及怎樣來跟蹤鏈接,如何解析頁面來提取Item。
?定義一個Spider,需要繼承scrapy.spider類并定一些屬性:
- name:Spider的名稱,必須是唯一的
- start_urls:初始化下載鏈接URL
- parse():用來解析下載后的Response獨享,該對象也是這個方法的唯一參數(shù)。
?我們使用以下命令新建一個eenotSpider腳本:
scrapy genspider eenotSpider eenot.com
?初始化腳本完成后在腳本中填入以下內容:
# -*- coding: utf-8 -*-
import scrapy
from eenot.items import EenotItem
import logging
class EenotspiderSpider(scrapy.Spider):
name = "eenotSpider"
allowed_domains = ["eenot.com"]
start_urls = ['https://www.eenot.com/portal.php?order=dateline&page=1']
def parse(self, response):
page_num = 5
if response.status == 200:
item = EenotItem()
item['posts_title'] = response.xpath("http://h1[@class='post_title']//a/text()").extract()
item['posts_date'] = response.xpath("http://div[@class='post_date']/text()").extract()
item['posts_des'] = response.xpath("http://p[@class='post_brief']/text()").extract()
yield item
for i in range(2, page_num + 1):
next_page_url = "https://www.eenot.com/portal.php?order=dateline&page="+str(i)+""
yield scrapy.Request(next_page_url,callback=self.parse)
?xpath抓取語法相關資料請看xpath教程
運行爬蟲
?在根目錄下執(zhí)行以下命令,其中eenotSpider是自己定義的腳本的名字:
scrapy crawl eenotSpider
?如果一切正常,應該可以打印出每個帖子的標題,日期和簡述
處理連接
?待更新
導出抓取結果
最簡單的保存抓取數(shù)據(jù)的方式就是使用jsin格式的文件保存在本地,想下面這樣運行:
scrapy crawl eenotScrapy -o abc.json
這里足矣,后續(xù)還需要自己編寫Item Pipeline。
保存數(shù)據(jù)到數(shù)據(jù)庫
?數(shù)據(jù)庫待安裝