Stories

Detail Return Return

scrapy 框架中用ssh連接遠程服務器 - Stories Detail

前段時間用scrapy嘗試抓取一些數據, 寫的時候真的很酸爽,眼睛要花掉了 但是!我沒有存到數據庫中,也就是説我只是確認了爬蟲的代碼沒問題(草)

為什麼我要用服務器的mysql,本地的不好嗎? 其實是我沒有在本地裝MySQL,但是我有服務器,再加上有phpmyadmin這麼友好的web-base數據庫管理工具,幹嘛還折騰本地裝軟件

挖坑

其實剛開始寫的時候,我是把數據庫這模塊的代碼拋開的,鏈接數據庫?不是很簡單的事情嗎,有啥好寫的,首先打開搜索引擎,輸入“ 如何用python連接遠程mysql ”不就好了嘛!

然後我發現我看不懂, 肯定是我打開的方式不對

填坑

後來經過了一路子的折騰,終於寫好了,也連上了!

這裏説一點不同的,在純python上鍊接遠程MySQL的代碼,搬到scrapy上,是行不通的,雖然原理差不多,但還是得改

肯定是我搜索的姿勢不正確,我找不到相關完整的scrapy鏈接遠程mysql的參考,純python的參考為居多。當時我另寫了一個純python測試鏈接,成功之後搬到scrapy的piplines.py上,Error警告啊

好了好了,不説廢話了,迴歸正題

開搞

這裏用到兩個庫,pymysql和sshtunnel

sshtunnel

它是讓你通過ssh安全通道訪問遠程服務器的python庫

pymysql

pymysql是在python3.5以上版本,用於鏈接MySQL的一個庫,如果你是python3.4就裝mysqldb這個庫,(因為有很多參考上用的是mysqldb庫)所以根據你的版本,不要裝錯了,不然就吃紅條(錯誤)吧

代碼

放置在piplines.py中

import pymysql
import sshtunnel

class SpiderPipeline(object):

    server = sshtunnel.SSHTunnelForwarder(
            ('**.***.**.**', 22),  #寫你服務器的ip地址
            ssh_username='**',     #連接服務器的用户名
            ssh_password='**',     #連接服務器的密碼
            remote_bind_address=('**.***.**.**', 3306), #服務器ip
            local_bind_address=('127.0.0.1', 3306)
        )
    server.start()   #連接開啓
    print('SSH連接成功')

    def __init__(self):
            self.connect = pymysql.connect(
                host='127.0.0.1',
                port=3306,
                user='***',      # 數據庫的用户名
                database='***',  # 數據庫的庫名
                password='***',  # 數據庫密碼
                charset='utf8'
            )
            print('mysql數據庫連接成功')
            self.cursor = self.connect.cursor()
            print('遊標獲取成功')

    def process_item(self, item, spider):
        #我這裏寫的是插入數據的sql語句
        sql = """INSERT INTO charpter(CharterName,NovelName) VALUES ('%s','%s')""" % (item['charter_name'],item['book_name'])
        #執行sql
        self.cursor.execute(sql)
        #提交數據
        self.connect.commit()
        print('數據插入成功')
        return item

    def close_spider(self,spider):
        self.cursor.close()    #關閉遊標
        self.connect.close()   #關閉數據庫鏈接
        # server.stop()        #關閉ssh鏈接

這裏就不多説廢話了,看代碼裏面的註釋基本能看懂了

我這種方式是同步存儲,存儲的速度相對慢一點,異步存儲方式我還沒去研究,這裏給自己挖個坑,研究完異步存儲我就另寫一篇文哈哈哈

Mysql相關問題

如果發現代碼無誤的情況下,還是無法鏈接成功,這個時候就要看看你服務器的MySQL是否允許外來接入

mysql開放3306端口

要讓MySQL允許鏈接,就要開放3306端口

  • 查看端口是否打開
netstat -an|grep 3306
  • 打開MySQL配置文件

文件路徑:/etc/mysql/my.cnf

將裏面的bin-address = 127.0.0.1 註釋掉

  • 重啓MySQL
service mysqld restart

防火牆開放3306端口

  • 查看firewalld狀態
systemctl status firewalld
  • 開放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
  • 重載
firewalld-cmd --reload

小結

其實連接數據庫還是挺簡單的,至少代碼一看就懂,細心還是很重要的。當死活連不上,死活報錯的時候,反過來想,代碼肯定沒問題,應該是哪個數據庫的表或字段沒有和代碼上的一一對應,密碼有特殊符號但是沒轉義等等,除此之外剩下的就交給程序玄學了

Add a new Comments

Some HTML is okay.