1. 程式人生 > >scrapy框架爬取資料入庫(附詳細介紹)

scrapy框架爬取資料入庫(附詳細介紹)

在論壇上看過很多的scrapy資料入庫(mysql)的例子,但是我嘗試之後總是出現一些莫名其妙的錯誤,搞得自己走了很多彎路,於是我將我認為是最簡單易懂的方法和程式碼展示給大家,歡迎大家吐槽

1.建立scrapy專案(安裝scrapy框架和mysql資料庫就不在這討論了,論壇上也有很多),在這裡我建立的專案名稱是“testmysql”,命令(cmd)是“scrapy startproject testmysql”,最好是在你想要建立專案的目錄裡面建立,建立好後,會看到如下檔案


2.建立spider檔案,CD命令到testmysql資料夾(上圖的第一個testmysql資料夾)下,輸入命令(scrapy genspider yingyeyuan cs.58.com/yingyeyuan/

)(這裡你也可以手動增加該檔案),然後就會看到有一個yinyeyuan.py的檔案生成,好了,之後就在這裡面寫爬蟲程式碼吧!

3.開始編寫spider ,我爬的是58同城上的營業員相關的職業,所以第二步要在程式碼裡面寫 “cs.58.com/yingyeyuan/”,然後將頁面的標題,工資,福利,公司名稱,程式碼如下:

# -*- coding: utf-8 -*-
import scrapy


class YinyeyuanSpider(scrapy.Spider):
    name = 'yingyeyuan'
    # allowed_domains = ['http://cs.58.com/yingyeyuan/']
    start_urls = ['http://cs.58.com/yingyeyuan/']

    def parse(self, response):
        # 獲取標題
        title = response.xpath(".//*[@id='list_con']/li/div[1]/div[1]/a/span[2]/text()").extract()
        # 獲取公司名稱
        comname = response.xpath(".//*[@id='list_con']/li/div[2]/div/a/text()").extract()
        # 獲取工資
        money = response.xpath(".//*[@id='list_con']/li/div[1]/p/text()").extract()
        # 獲取福利
        getfree = response.xpath(".//*[@id='list_con']/li/div[1]/div[2]/span[1]/text()").extract()

4.將得到的資料儲存到items中去,所以要講items.py匯入到此檔案中來(比上面多了幾行程式碼而已),注意,最下面的yield語句一定要有,這個地方害我走了很多彎路,就這一句程式碼,哭

# -*- coding: utf-8 -*-
import scrapy
from ..items import TestmysqlItem


class YinyeyuanSpider(scrapy.Spider):
    name = 'yingyeyuan'
    # allowed_domains = ['http://cs.58.com/yingyeyuan/']
    start_urls = ['http://cs.58.com/yingyeyuan/']

    def parse(self, response):
        # 獲取標題
        title = response.xpath(".//*[@id='list_con']/li/div[1]/div[1]/a/span[2]/text()").extract()
        # 獲取公司名稱
        comname = response.xpath(".//*[@id='list_con']/li/div[2]/div/a/text()").extract()
        # 獲取工資
        money = response.xpath(".//*[@id='list_con']/li/div[1]/p/text()").extract()
        # 獲取福利
        getfree = response.xpath(".//*[@id='list_con']/li/div[1]/div[2]/span[1]/text()").extract()
        # 例項化TongchengItem類
        tongcheng = TestmysqlItem()
        # 存入items
        tongcheng["title"] = title
        tongcheng["comname"] = comname
        tongcheng["money"] = money
        tongcheng["getfree"] = getfree
        yield tongcheng

5.到了這步,就可以開始編寫入庫程式碼了,找到專案目錄下的pipelines.py檔案:

輸入如下程式碼,我是存入mysql資料庫,具體根據你的資料庫來(解釋:__init__函式裡面初始化時就連線資料庫,這樣會方便很多,畢竟增刪改查都要用到這些程式碼,同時輸出下,確保程式執行到這裡。process_items函式就是入庫的操作,items由於是所有的資料的集合,所以要迴圈執行,try 語句確保入庫成功,不成功就返回錯誤原因):

import pymysql


class TestmysqlPipeline(object):
    def __init__(self):
        # connection database
        self.connect = pymysql.connect('localhost','root','root','tongcheng',use_unicode=True,charset='utf8')
        # get cursor
        self.cursor = self.connect.cursor()
        print("connecting mysql success!")

    def process_item(self, item, spider):
        print("start writing datas...")
        try:
            for i in range(0,len(item['title'])):
                # insert data
                sqlstr = "insert into zhaoping(title,companyname,getfree,money) VALUES('%s','%s','%s','%s')"%(item['title'][i],item['comname'][i],item['getfree'][i],item['money'][i])
                self.cursor.execute(sqlstr)
                self.connect.commit()
            self.connect.close()
        except Exception as error:
            # print error
            print(error)
        return item

6.修改settings.py檔案,如果不修改,程式就不會知道你要執行哪個操作,預設情況下,它被註釋了,去掉註釋就好(300其實就是個執行順序,越小執行越優先):

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'testmysql.pipelines.TestmysqlPipeline': 300,
}
7.試試看,輸入命令“scarpy crawl yingyeyuan”,再去看看資料庫,是不是很神奇啊?(大神勿噴)