網站首頁 編程語言 正文
前段時間用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
小結
其實連接數據庫還是挺簡單的,至少代碼一看就懂,細心還是很重要的。當死活連不上,死活報錯的時候,反過來想,代碼肯定沒問題,應該是哪個數據庫的表或字段沒有和代碼上的一一對應,密碼有特殊符號但是沒轉義等等,除此之外剩下的就交給程序玄學了
原文鏈接:https://juejin.cn/post/7055884037327912967
相關推薦
- 2022-05-11 使用postman訪問k8s api
- 2024-01-09 idea如何設置自動換行
- 2022-07-02 Python?matplotlib繪圖時指定圖像大小及放大圖像詳解_python
- 2022-11-11 C#非托管泄漏中HEAP_ENTRY的Size對不上解析_C#教程
- 2024-03-15 docker安裝RabbitMq插件
- 2022-08-03 MongoDB數據庫條件查詢技巧總結_MongoDB
- 2023-07-10 如何使用MyBatis框架實現對數據庫的增刪查改?
- 2022-08-29 Oracle中日期的使用方法實例_oracle
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支