寫在前面
本期內(nèi)容:基于scrapy+mysql爬取博客信息并保存到數(shù)據(jù)庫中
實(shí)驗(yàn)需求
- anaconda丨pycharm
- python3.11.4
- scrapy
- mysql
項(xiàng)目下載地址:https://download.csdn.net/download/m0_68111267/88740730
實(shí)驗(yàn)描述
本次實(shí)驗(yàn)實(shí)現(xiàn)了:使用Scrapy框架爬取博客專欄的目錄信息并保存到MySQL數(shù)據(jù)庫中,實(shí)驗(yàn)主要涉及到Python的爬蟲技術(shù)以及MySQL的基本操作,需要有一定的基礎(chǔ)。
實(shí)驗(yàn)框架
- Scrapy
實(shí)驗(yàn)需求
- Scrapy: Scrapy是一個(gè)基于Python的開源網(wǎng)絡(luò)爬蟲框架,用于快速、高效地獲取網(wǎng)頁數(shù)據(jù)。它具有強(qiáng)大的抓取能力,支持多線程和分布式爬蟲,能夠并行爬取多個(gè)網(wǎng)頁。Scrapy提供了方便的API和豐富的功能,可以自定義爬蟲規(guī)則和處理流程,支持?jǐn)?shù)據(jù)的持久化存儲(chǔ)和導(dǎo)出。它還提供了可視化的調(diào)試工具和強(qiáng)大的反爬蟲策略,可以幫助開發(fā)者更輕松地構(gòu)建和管理網(wǎng)絡(luò)爬蟲。Scrapy是一個(gè)成熟、穩(wěn)定和廣泛應(yīng)用的爬蟲框架,被廣泛用于數(shù)據(jù)抓取、搜索引擎和大數(shù)據(jù)分析等領(lǐng)域。
- MySQL: MySQL是一個(gè)開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由Oracle Corporation開發(fā)和維護(hù)。它具有高性能、可靠性和穩(wěn)定性,能夠在各種不同規(guī)模的應(yīng)用中存儲(chǔ)和管理大量的數(shù)據(jù)。MySQL使用SQL語言進(jìn)行數(shù)據(jù)操作和查詢,支持多用戶并發(fā)操作和事務(wù)處理,提供了豐富的功能和靈活的配置選項(xiàng)。它可以在多種操作系統(tǒng)上運(yùn)行,并且與多種編程語言和開發(fā)工具兼容。MySQL被廣泛應(yīng)用于Web應(yīng)用、企業(yè)級(jí)應(yīng)用和大數(shù)據(jù)分析等領(lǐng)域。
實(shí)驗(yàn)內(nèi)容
1.安裝依賴庫
本次實(shí)驗(yàn)需要安裝scrapy庫,如果沒有scrapy庫的話可以運(yùn)行下面的命令進(jìn)行安裝哦~
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy
2.創(chuàng)建Scrapy項(xiàng)目
- 在終端輸入以下命令可以創(chuàng)建一個(gè)scrapy項(xiàng)目:
scrapy startproject myblog
- 項(xiàng)目框架如下:(此時(shí)你們應(yīng)該沒有"db.py"和"sp_blogs.py"文件)
- spiders:spiders 文件夾是 Scrapy 框架中存放爬蟲代碼的目錄。在 spiders 文件夾中,會(huì)包含一個(gè)或多個(gè) Python 文件,每個(gè) Python 文件代表一個(gè)獨(dú)立的爬蟲。每個(gè)爬蟲文件都需要繼承自 Scrapy 的 Spider 類,并定義爬蟲的名稱、起始 URL、解析頁面的方法等。在爬蟲文件中,還可以定義一些其他的屬性和方法,來實(shí)現(xiàn)對(duì)網(wǎng)頁的抓取和解析。Scrapy 框架通過讀取 spiders 文件夾中的爬蟲文件來識(shí)別和啟動(dòng)爬蟲。在運(yùn)行爬蟲時(shí),可以指定要運(yùn)行的爬蟲名稱,Scrapy 將會(huì)找到對(duì)應(yīng)的爬蟲文件并執(zhí)行相應(yīng)的代碼。spiders 文件夾是 Scrapy 爬蟲的核心部分,開發(fā)者可以根據(jù)需要在該文件夾下創(chuàng)建多個(gè)爬蟲文件,以支持同時(shí)抓取和解析多個(gè)網(wǎng)站。
- items.py:items.py文件是Scrapy框架中用于定義數(shù)據(jù)模型的文件,用于指定爬取的數(shù)據(jù)結(jié)構(gòu)。它定義了爬蟲需要爬取和保存的數(shù)據(jù)字段,類似于數(shù)據(jù)庫表的結(jié)構(gòu),方便數(shù)據(jù)的提取和存儲(chǔ)。在items.py文件中,使用Python的類來定義數(shù)據(jù)模型,每個(gè)類的屬性對(duì)應(yīng)一個(gè)需要爬取和保存的字段。
- middlewares.py:middlewares.py文件是Scrapy框架中用于處理請(qǐng)求和響應(yīng)的中間件文件。中間件是Scrapy框架的一個(gè)重要組成部分,用于對(duì)請(qǐng)求進(jìn)行預(yù)處理、對(duì)響應(yīng)進(jìn)行處理或者是處理異常情況。middlewares.py文件中定義了多個(gè)中間件類,每個(gè)中間件類都有特定的功能,例如設(shè)置請(qǐng)求頭、代理設(shè)置、處理重定向等。通過在settings.py中配置中間件的順序,Scrapy框架會(huì)按照順序依次使用不同的中間件對(duì)請(qǐng)求和響應(yīng)進(jìn)行處理。
- pipelines.py:pipelines.py文件是Scrapy框架中用于處理數(shù)據(jù)的管道文件。在Scrapy中,管道是一個(gè)用于處理爬取到的數(shù)據(jù)的組件,可以對(duì)數(shù)據(jù)進(jìn)行清洗、驗(yàn)證、存儲(chǔ)或者是發(fā)送到其他系統(tǒng)。pipelines.py文件中定義了多個(gè)管道類,每個(gè)管道類都有特定的功能,例如將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫、寫入文件、發(fā)送郵件等。通過在settings.py中配置管道的優(yōu)先級(jí),Scrapy框架會(huì)按照優(yōu)先級(jí)順序依次使用不同的管道對(duì)爬取到的數(shù)據(jù)進(jìn)行處理。
- settings.py:settings.py 文件是 Scrapy 框架中的配置文件,用于管理和配置爬蟲的各種設(shè)置選項(xiàng)。在 settings.py 文件中,可以設(shè)置爬蟲的名稱、啟用或禁用的中間件、管道、下載器、并發(fā)請(qǐng)求數(shù)、延遲、日志級(jí)別等。settings.py 文件包含了許多可配置的選項(xiàng),可以根據(jù)實(shí)際需求進(jìn)行調(diào)整。通過修改 settings.py 文件,可以改變爬蟲的行為,并對(duì)其進(jìn)行個(gè)性化定制。此外,settings.py 文件還提供了一些默認(rèn)的全局配置選項(xiàng),這些選項(xiàng)可以決定爬蟲的運(yùn)行方式和輸出結(jié)果。
- 在終端輸入以下命令創(chuàng)建爬蟲文件
scrapy genspider sp_blogs "https://want595.blog.csdn.net/category_12039968_1.html"
該命令將使用Scrapy生成一個(gè)名為"sp_blogs"的爬蟲,并將爬蟲的起始URL設(shè)置為"https://want595.blog.csdn.net/category_12039968_1.html"。(本次實(shí)驗(yàn)需要爬取的就是這個(gè)專欄的目錄)
輸入完這個(gè)命令后,在spiders的目錄下就會(huì)出現(xiàn)"sp_blogs.py"這個(gè)文件啦~
3.配置系統(tǒng)設(shè)置
打開"settings.py"文件,配置系統(tǒng)設(shè)置:
4.配置管道文件
"pipelines.py"文件,主要用于編寫代碼處理爬取的數(shù)據(jù),例如存放到文件中,數(shù)據(jù)庫中等等
# 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.html
# useful for handling different item types with a single interface
import pymysql
from twisted.enterprise import adbapi
class MyblogPipeline:
def __init__(self, dbpool):
self.dbpool = dbpool
@classmethod
def from_settings(cls, settings):
dbparams = dict(
host=settings['MYSQL_HOST'], # 讀取settings中的配置
db=settings['MYSQL_DBNAME'],
user=settings['MYSQL_USER'],
passwd=settings['MYSQL_PASSWD'],
charset='utf8', # 編碼要加上,否則可能出現(xiàn)中文亂碼問題
cursorclass=pymysql.cursors.DictCursor,
use_unicode=False,
)
dbpool = adbapi.ConnectionPool('pymysql', **dbparams) # **表示將字典擴(kuò)展為關(guān)鍵字參數(shù),相當(dāng)于host=xxx,db=yyy....
return cls(dbpool) # 相當(dāng)于dbpool付給了這個(gè)類,self中可以得到
# pipeline默認(rèn)調(diào)用
def process_item(self, item, spider):
query = self.dbpool.runInteraction(self.insert, item) # 調(diào)用插入的方法
query.addErrback(self.error, item, spider) # 調(diào)用異常處理方法
return item
# 寫入數(shù)據(jù)庫中
def insert(self, db, item):
# print item['name']
sql = "insert ignore into blogs(title,url) values(%s,%s)"
params = (item["name"], item["url"])
db.execute(sql, params)
# 錯(cuò)誤處理方法
def error(self, failue, item, spider):
print(failue)
該代碼是一個(gè)Twisted框架下的MySQL數(shù)據(jù)庫存儲(chǔ)的Pipeline。Twisted是一個(gè)事件驅(qū)動(dòng)的網(wǎng)絡(luò)框架,使用異步的方式處理網(wǎng)絡(luò)請(qǐng)求。
該代碼中的MyblogPipeline
類繼承自object
類,并且實(shí)現(xiàn)了__init__
、from_settings
、process_item
、insert
和error
方法。
-
__init__
方法初始化了一個(gè)數(shù)據(jù)庫連接池dbpool
,并將其賦值給self.dbpool
。 -
from_settings
方法從配置文件中讀取數(shù)據(jù)庫的相關(guān)配置信息,并利用這些信息創(chuàng)建一個(gè)數(shù)據(jù)庫連接池dbpool
。 -
process_item
方法是Pipeline默認(rèn)調(diào)用的方法,用于處理item并存儲(chǔ)到數(shù)據(jù)庫中。在該方法中,首先調(diào)用self.dbpool.runInteraction()
方法創(chuàng)建一個(gè)操作數(shù)據(jù)庫的事務(wù),并調(diào)用self.insert
方法將item插入到數(shù)據(jù)庫中。然后,通過addErrback
方法添加了一個(gè)異常處理方法self.error
。 -
insert
方法接收兩個(gè)參數(shù),一個(gè)是數(shù)據(jù)庫連接對(duì)象db
,一個(gè)是item。在該方法中,定義了一個(gè)SQL語句和參數(shù),并通過db.execute()
方法執(zhí)行了數(shù)據(jù)庫插入操作。 -
error
方法用于處理插入數(shù)據(jù)庫時(shí)的異常情況,將異常信息打印出來。
總體而言,該代碼實(shí)現(xiàn)了將爬取的數(shù)據(jù)存儲(chǔ)到MySQL數(shù)據(jù)庫中的功能。
5.連接數(shù)據(jù)庫
新建一個(gè)"db.py"文件,輸入以下代碼連接到本地?cái)?shù)據(jù)庫,運(yùn)行后創(chuàng)建一個(gè)表,用于保存等會(huì)爬取的數(shù)據(jù)。
import pymysql
from scrapy.utils.project import get_project_settings # 導(dǎo)入seetings配置
class DBHelper:
def __init__(self):
self.settings = get_project_settings() # 獲取settings配置,設(shè)置需要的信息
self.host = self.settings['MYSQL_HOST']
self.port = self.settings['MYSQL_PORT']
self.user = self.settings['MYSQL_USER']
self.passwd = self.settings['MYSQL_PASSWD']
self.db = self.settings['MYSQL_DBNAME']
# 連接到具體的數(shù)據(jù)庫(settings中設(shè)置的MYSQL_DBNAME)
def connectDatabase(self):
conn = pymysql.connect(host=self.host,
port=self.port,
user=self.user,
passwd=self.passwd,
db=self.db,
charset='utf8') # 要指定編碼,否則中文可能亂碼
return conn
# 創(chuàng)建表
def createTable(self, sql):
conn = self.connectDatabase()
cur = conn.cursor()
try:
cur.execute(sql)
cur.close()
conn.close()
print("創(chuàng)建表成功!")
except:
print("創(chuàng)建表失??!")
pass
# 插入數(shù)據(jù)
def insert(self, sql, *params): # 注意這里params要加*,因?yàn)閭鬟f過來的是元組,*表示參數(shù)個(gè)數(shù)不定
conn = self.connectDatabase()
cur = conn.cursor();
cur.execute(sql, params)
conn.commit() # 注意要commit
cur.close()
conn.close()
if __name__ == "__main__":
dbHelper = DBHelper()
sql = "create table pictures(id int primary key auto_increment,name varchar(50) unique,url varchar(200))"
dbHelper.createTable(sql)
這段代碼是一個(gè)用于操作MySQL數(shù)據(jù)庫的助手類。它使用了Scrapy框架的get_project_settings
函數(shù)來獲取配置信息,然后根據(jù)配置信息連接到數(shù)據(jù)庫。
在初始化方法中,它獲取到了MySQL數(shù)據(jù)庫的主機(jī)地址、端口號(hào)、用戶名、密碼和數(shù)據(jù)庫名,并保存在實(shí)例變量中。
-
connectDatabase
方法用于連接到具體的數(shù)據(jù)庫,并返回一個(gè)數(shù)據(jù)庫連接對(duì)象。 -
createTable
方法用于創(chuàng)建表,它接受一個(gè)SQL語句作為參數(shù),使用數(shù)據(jù)庫連接對(duì)象執(zhí)行SQL語句來創(chuàng)建表。 -
insert
方法用于插入數(shù)據(jù),它接受一個(gè)SQL語句和參數(shù)作為參數(shù),使用數(shù)據(jù)庫連接對(duì)象執(zhí)行SQL語句來插入數(shù)據(jù)。
最后在主函數(shù)中,創(chuàng)建了一個(gè)DBHelper
對(duì)象,并調(diào)用createTable
方法來創(chuàng)建一個(gè)名為pictures
的表。
6.分析要爬取的內(nèi)容
本實(shí)驗(yàn)要爬取的是博客專欄的目錄信息:
7.編寫爬蟲文件
編寫"spiders"目錄下的"sp_blogs.py"文件,實(shí)現(xiàn)博客信息的爬取:
import scrapy
from scrapy import Selector, cmdline
class MyblogItem(scrapy.Item):
name = scrapy.Field()
url = scrapy.Field()
class SpBlogsSpider(scrapy.Spider):
name = "sp_blogs"
allowed_domains = ["want595.blog.csdn.net"]
……請(qǐng)下載后查看完整代碼哦
這段代碼是一個(gè)基于Scrapy框架的爬蟲,用于爬取一個(gè)博客網(wǎng)站的文章標(biāo)題和鏈接。
首先定義了一個(gè)MyblogItem
類,它繼承自scrapy.Item
,并定義了兩個(gè)字段name
和url
,用于保存文章的標(biāo)題和鏈接。
然后定義了一個(gè)SpBlogsSpider
類,它繼承自scrapy.Spider
,表示一個(gè)具體的爬蟲。在SpBlogsSpider
類中,指定了爬蟲的名字為sp_blogs
,指定了允許爬取的域名為want595.blog.csdn.net
,并指定了要爬取的起始URL。起始URL使用了一個(gè)循環(huán)生成器,生成了多個(gè)URL,用于爬取多頁的數(shù)據(jù)。
parse
方法是默認(rèn)的回調(diào)方法,在爬取網(wǎng)頁的響應(yīng)返回后自動(dòng)被調(diào)用。在parse
方法中,使用Selector
對(duì)象對(duì)響應(yīng)進(jìn)行了解析,提取出了文章的標(biāo)題和鏈接,并將它們保存到MyblogItem
對(duì)象中,然后通過yield
返回給引擎。
最后,通過調(diào)用cmdline.execute
函數(shù)來執(zhí)行爬蟲。執(zhí)行時(shí)會(huì)根據(jù)給定的參數(shù)調(diào)用對(duì)應(yīng)的爬蟲。在這里,使用'scrapy crawl sp_blogs'
參數(shù)來執(zhí)行sp_blogs
爬蟲。(也可以在終端項(xiàng)目的根目錄下運(yùn)行scrapy crawl sp_blogs
命令來執(zhí)行爬蟲。)
運(yùn)行結(jié)果
爬取的博客信息如下:
寫在后面
我是一只有趣的兔子,感謝你的喜歡!文章來源:http://www.zghlxwxcb.cn/news/detail-841265.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-841265.html
到了這里,關(guān)于網(wǎng)絡(luò)爬蟲丨基于scrapy+mysql爬取博客信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!