Python爬蟲(chóng)獲取數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中的超詳細(xì)教程(一看就會(huì))
1.簡(jiǎn)介介紹
-網(wǎng)絡(luò)爬蟲(chóng)(又稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動(dòng)索引、模擬程序或者蠕蟲(chóng)。
-一般在瀏覽器上可以獲取到的,通過(guò)爬蟲(chóng)也可以獲取到,常見(jiàn)的爬蟲(chóng)語(yǔ)言有PHP,JAVA,C#,C++,Python,為啥我們經(jīng)常聽(tīng)到說(shuō)的都是Python爬蟲(chóng),這是因?yàn)閜ython爬蟲(chóng)比較簡(jiǎn)單,功能比較齊全。
2.Xpath獲取頁(yè)面信息
通過(guò)Xpath進(jìn)行爬蟲(chóng)就是獲取到頁(yè)面html后通過(guò)路徑的表達(dá)式來(lái)選取標(biāo)簽節(jié)點(diǎn),沿著路徑選取需要爬取的數(shù)據(jù)。
Xpath常用表達(dá)式:
| 表達(dá)式 | 描述 |
|---|---|
| / | 從根節(jié)點(diǎn)選取(取子節(jié)點(diǎn)) |
| // | 選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn) |
| . | 選取當(dāng)前節(jié)點(diǎn)。 |
| … | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。 |
| @ | 選取屬性 |
| * | 表示任意內(nèi)容(通配符) |
| | | 運(yùn)算符可以選取多個(gè)路徑 |
Xpath常用函數(shù):
| 函數(shù) | 用法 | 解釋 |
|---|---|---|
| startswith() | xpath(‘//div[starts-with(@id,”celent”)]‘) | #選取id值以celent開(kāi)頭的div節(jié)點(diǎn) |
| contains() | xpath(‘//div[contains(@id,”celent”)]‘) | #選取id值包含celent的div節(jié)點(diǎn) |
| and() | xpath(‘//div[contains(@id,”celent”) and contains(@id,”in”)]‘) | #選取id值包含celent的div節(jié)點(diǎn) |
| text() | _.xpath(’./div/div[4]/a/em/text()’) | #選取em標(biāo)簽下文本內(nèi)容 |
Xpath實(shí)操解析:
# 案例1
# //為從當(dāng)前html中選取節(jié)點(diǎn);[@class="c1text1"]為獲取所有的class為c1text1的節(jié)點(diǎn);/h1[1]為選取的節(jié)點(diǎn)下的第一個(gè)h1節(jié)點(diǎn),如果沒(méi)有[1]則是獲取所有的,可以通過(guò)循環(huán)進(jìn)行獲取數(shù)據(jù)
etreeHtml.xpath('//*[@class="c1text1"]/h1[1]/text()')
# 案例2
#//為從當(dāng)前html中選取節(jié)點(diǎn);[@class="c1text1"]為獲取所有的class為c1text1的節(jié)點(diǎn);/a為獲取當(dāng)前節(jié)點(diǎn)下的所有a標(biāo)簽節(jié)點(diǎn),得到一個(gè)ObjectList;通過(guò)for循環(huán)獲取里面每個(gè)標(biāo)簽數(shù)據(jù),./@src為獲取當(dāng)前節(jié)點(diǎn)的src屬性值
etreeHtml2 = etreeHtml.xpath('//*[@class="c1text1"]/a')
for _ in etreeHtml2:
etreeHtml.xpath(./@src)
3.通過(guò)Xpath爬蟲(chóng)實(shí)操
本次實(shí)例以爬取我的CSDN文章列表信息保存到數(shù)據(jù)庫(kù)為案列
3-1.獲取xpath
通過(guò)F12打開(kāi)開(kāi)發(fā)者模式,點(diǎn)擊左上角圖標(biāo)可參考下圖,選擇需要爬取數(shù)據(jù)的容器,在右邊選擇復(fù)制選擇xpath就可以得到xpath路徑了(//*[@id=“userSkin”]/div[2]/div/div[2]/div[1]/div[2]/div/div);

完整代碼展示:
# 導(dǎo)入需要的庫(kù)
import requests
from lxml import etree
import pymysql
# 文章詳情信息類
class articleData():
def __init__(self, title, abstract, path,date):
self.title = title #文章名稱
self.abstract = abstract #文章摘要
self.path = path #文章路徑
self.date = date #發(fā)布時(shí)間
def to_string(self):
print("文章名稱:"+self.title
+";文章摘要:"+self.abstract
+";文章路徑:"+self.path
+";發(fā)布時(shí)間:"+self.date)
#保存狗狗詳情數(shù)據(jù)
#保存數(shù)據(jù)
def saveData(DataObject):
count = pymysql.connect(
host='xx.xx.xx.xx', # 數(shù)據(jù)庫(kù)地址
port=3306, # 數(shù)據(jù)庫(kù)端口
user='xxxxx', # 數(shù)據(jù)庫(kù)賬號(hào)
password='xxxxxx', # 數(shù)據(jù)庫(kù)密碼
db='xxxxxxx' # 數(shù)據(jù)庫(kù)名
)
# 創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象
db = count.cursor()
# 寫(xiě)入sql
# print("寫(xiě)入數(shù)據(jù):"+DataObject.to_string())
sql = f"insert into article_detail(title,abstract,alias,path,date) " \
f"values ('{DataObject.title}','{DataObject.abstract}','{DataObject.path}','{DataObject.date}')"
# 執(zhí)行sql
print(sql)
db.execute(sql)
# 保存修改內(nèi)容
count.commit()
db.close()
# 爬取數(shù)據(jù)的方向
def getWebData():
# 網(wǎng)站頁(yè)面路徑
url = "https://blog.csdn.net/BadBoyxiaolin?spm=1000.2115.3001.5343"
# 請(qǐng)求頭,模擬瀏覽器請(qǐng)求
header = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
}
# 獲取頁(yè)面所有節(jié)點(diǎn)代碼
html = requests.get(url=url, headers=header)
# 打印頁(yè)面代碼查看
# print(html.text)
# 如果亂碼可以設(shè)置編碼格式
# html.encoding = 'gb2312'
# 通過(guò)xpath獲取數(shù)據(jù)對(duì)應(yīng)節(jié)點(diǎn)
etreeHtml = etree.HTML(html.text)
dataHtml = etreeHtml.xpath('//*[@class="mainContent"]/div/div/div')
# 循環(huán)獲取數(shù)據(jù)
for _ in dataHtml:
# ''.join()是將內(nèi)容轉(zhuǎn)換為字符串可以后面接replace數(shù)據(jù)進(jìn)行處理
title = ''.join(_.xpath('./article/a/div[1]/h4/text()'))#文章標(biāo)題
abstract = ''.join(_.xpath('./article/a/div[2]/text()'))#文章摘要
path = ''.join(_.xpath('./article/a/@href'))#文章路徑
date = ''.join(_.xpath('./article/a/div[3]/div/div[2]/text()')).replace(' ','').replace('·','').replace('發(fā)布博客','')#發(fā)布時(shí)間
#初始化文章類數(shù)據(jù)
article_data = articleData(title,abstract,path,date)
article_data.to_string() #打印數(shù)據(jù)看看是否對(duì)
#保存數(shù)據(jù)到數(shù)據(jù)庫(kù)
# saveData(article_data)
if __name__ == "__main__":
getWebData()
總結(jié)
到此這篇關(guān)于Python爬蟲(chóng)獲取數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中的文章就介紹到這了,更多相關(guān)Python爬蟲(chóng)數(shù)據(jù)保存到數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)學(xué)建模庫(kù)StatsModels統(tǒng)計(jì)回歸簡(jiǎn)介初識(shí)
這篇文章主要為大家介紹了Python數(shù)學(xué)建模庫(kù)StatsModels統(tǒng)計(jì)回歸的基本概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝打擊多多進(jìn)步2021-10-10
NCCL深度學(xué)習(xí)Bootstrap網(wǎng)絡(luò)連接建立源碼解析
這篇文章主要為大家介紹了NCCL深度學(xué)習(xí)Bootstrap網(wǎng)絡(luò)連接建立源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
python使用 multiprocessing 多進(jìn)程處理批量數(shù)據(jù)的示例代碼
這篇文章主要介紹了使用 multiprocessing 多進(jìn)程處理批量數(shù)據(jù)的示例代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
pandas實(shí)現(xiàn)數(shù)據(jù)讀取&清洗&分析的項(xiàng)目實(shí)踐
近期因工作需要,需對(duì)幾十萬(wàn)條商品和訂單數(shù)據(jù)進(jìn)行初步的數(shù)據(jù)分析,本文主要pandas實(shí)現(xiàn)數(shù)據(jù)讀取&清洗&分析的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2022-05-05
Python制作旋轉(zhuǎn)花燈祝大家元宵節(jié)快樂(lè)(實(shí)例代碼)
一年一度的元宵節(jié)來(lái)臨,小編在這里祝大家2022元宵節(jié)快樂(lè),今天小編給大家分享一篇教程關(guān)于Python制作旋轉(zhuǎn)花燈祝大家元宵節(jié)快樂(lè),代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-02-02

