摘要:本篇內(nèi)容為網(wǎng)絡(luò)爬蟲(chóng)初級(jí)操作的簡(jiǎn)單介紹,內(nèi)容主要有以下部分解析網(wǎng)頁(yè)數(shù)據(jù)庫(kù)解析網(wǎng)頁(yè)一般來(lái)說(shuō),解析網(wǎng)頁(yè)有三種方式正則表達(dá)式。關(guān)于,我們最后再來(lái)看一個(gè)實(shí)戰(zhàn)項(xiàng)目爬取北京二手房?jī)r(jià)格。代碼如下第頁(yè)這樣就成功爬取了安居客上前頁(yè)的北京二手房?jī)r(jià)格。
本篇內(nèi)容為 python 網(wǎng)絡(luò)爬蟲(chóng)初級(jí)操作的簡(jiǎn)單介紹,內(nèi)容主要有以下 2 部分:
解析網(wǎng)頁(yè)
數(shù)據(jù)庫(kù)
一般來(lái)說(shuō),解析網(wǎng)頁(yè)有三種方式:正則表達(dá)式、BeautifulSoup、lxml。其中正則表達(dá)式較難,BeautifulSoup 適合初學(xué)者,可以快速掌握提取網(wǎng)頁(yè)中數(shù)據(jù)的方法。
正則表達(dá)式常見(jiàn)的正則字符和含義如下:
. 匹配任意字符,除了換行符 * 匹配前一個(gè)字符 0 次或多次 + 匹配前一個(gè)字符 1 次或多次 ? 匹配前一個(gè)字符 0 次或 1 次 ^ 匹配字符串開(kāi)頭 $ 匹配字符串末尾 () 匹配括號(hào)內(nèi)表示式,也表示一個(gè)組 s 匹配空白字符 S 匹配任何非空白字符 d 匹配數(shù)字,等價(jià)于[0-9] D 匹配任何非數(shù)字,等價(jià)于[^0-9] w 匹配字母數(shù)字,等價(jià)于[A-Za-z0-9] W 匹配非字母數(shù)字,等價(jià)于[^A-Za-z0-9] [] 用來(lái)表示一組字符
Python 正則表達(dá)式有以下 3 種方法:
re.match 方法:從字符串起始位置匹配一個(gè)模式,如果從起始位置匹配了,match()就返回none。
語(yǔ)法 re.match(pattern, string, flags=0)
pattern:正則表達(dá)式
string:要匹配的字符串
flags:控制正則表達(dá)式的匹配方式,如 是否區(qū)分大小寫(xiě)、多行匹配等
re.search方法:只能從字符串的起始位置進(jìn)行匹配。
find_all方法:可以找到所有的匹配。
BeautifulSoupBeautifulSoup 從 HTML 或 XML 文件中提取數(shù)據(jù)。首先需要使用命令行來(lái)進(jìn)行安裝:
pip install bs4
在使用的時(shí)候需要導(dǎo)入:
from bs4 import BeautifulSoup
例如使用 BeautifulSoup 獲取博客主頁(yè)文章的標(biāo)題,代碼和注釋如下:
import requests from bs4 import BeautifulSoup link = "http://www.santostang.com/" headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"} r = requests.get(link, headers=headers) # 將網(wǎng)頁(yè)響應(yīng)體的字符串轉(zhuǎn)換為soup對(duì)象 soup = BeautifulSoup(r.text, "html.parser") first_title = soup.find("h1", class_="post-title").a.text.strip() print("第一篇文章的標(biāo)題是:", first_title) title_list = soup.find_all("h1", class_="post-title") for i in range(len(title_list)): title = title_list[i].a.text.strip() print("第 %s 篇文章的標(biāo)題是: %s" % (i+1, title))
運(yùn)行得到結(jié)果:
成功抓取到所需內(nèi)容。
關(guān)于 BeautifulSoup, 我們最后再來(lái)看一個(gè)實(shí)戰(zhàn)項(xiàng)目:爬取北京二手房?jī)r(jià)格。代碼如下:
import requests from bs4 import BeautifulSoup import time headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"} for i in range(1,11): link = "https://beijing.anjuke.com/sale/" r = requests.get(link, headers=headers) print("第", i, "頁(yè)") soup = BeautifulSoup(r.text, "lxml") house_list = soup.find_all("li", class_="list-item") for house in house_list: name = house.find("div", class_="house-title").a.text.strip() price = house.find("span", class_="price-det").text.strip() price_area = house.find("span", class_="unit-price").text.strip() no_room = house.find("div", class_="details-item").span.text area = house.find("div", class_="details-item").contents[3].text floor = house.find("div", class_="details-item").contents[5].text year = house.find("div", class_="details-item").contents[7].text broker = house.find("span", class_="brokername").text broker = broker[1:] address = house.find("span", class_="comm-address").text.strip() address = address.replace("xa0xa0 ", " ") tag_list = house.find_all("span", class_="item-tags") tags = [i.text for i in tag_list] print(name, price, price_area, no_room, area, floor, year, broker, address, tags) time.sleep(5)
這樣就成功爬取了安居客上前 10 頁(yè)的北京二手房?jī)r(jià)格。
數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)分為兩種,存儲(chǔ)在文件(TXT和CSV)中和存儲(chǔ)在數(shù)據(jù)庫(kù)(MySQL關(guān)系數(shù)據(jù)庫(kù)和MongoDB數(shù)據(jù)庫(kù))中。
CSV (Comma-Separated Values)是逗號(hào)分隔值的文件格式,其文件以純文本的形式存儲(chǔ)表格數(shù)據(jù)(數(shù)字和文本)。
CSV 文件的每一行都用換行符分隔,列與列之間用逗號(hào)分隔。
MySQL是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),所使用的是SQL語(yǔ)言,是訪問(wèn)數(shù)據(jù)庫(kù)最常用的標(biāo)準(zhǔn)化語(yǔ)言。關(guān)系數(shù)據(jù)庫(kù)(建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫(kù))將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了寫(xiě)入和提取的速度,數(shù)據(jù)的存儲(chǔ)也比較靈活。
關(guān)于存儲(chǔ)在文件的方法這里不再贅述,下面首先介紹如何存儲(chǔ)至MySQL數(shù)據(jù)庫(kù)。
你需要先到官網(wǎng)下載并安裝 MySQL數(shù)據(jù)庫(kù),博主用的是 macOS Sierra 系統(tǒng),在安裝完成后,打開(kāi)系統(tǒng)偏好設(shè)置,如下圖:
最下方出現(xiàn) MySQL的圖標(biāo),打開(kāi)并連接,如下圖所示:
打開(kāi)終端,在終端中輸入添加MySQL路徑的命令:
PATH="$PATH":/usr/local/mysql/bin
繼續(xù)輸入登錄到MySQL的命令:mysql -u root -p,然后輸入密碼即可成功登錄。成功登錄界面如下:
接下來(lái)介紹MySQL的基本操作:
創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表必須指明每一列數(shù)據(jù)的名稱(chēng)(column_name)和類(lèi)別(column_type)。
在上圖中,創(chuàng)建了 4 個(gè)變量:id, url, content, created_time。其中id的類(lèi)別是整數(shù)INT,屬性為自己增加(AUTO_INCREMENT)。新添加數(shù)據(jù)的數(shù)值會(huì)自動(dòng)加 1。PRIMARY KEY的關(guān)鍵字用于將id定義為主鍵。
url和content的類(lèi)別是可變長(zhǎng)度的字符串VARCHAR,括號(hào)中的數(shù)字代表長(zhǎng)度的最大值,NOT NULL表示url和content不能為空。created_time為該數(shù)據(jù)添加時(shí)間,不需要設(shè)置,因?yàn)橛袝r(shí)間戳,它會(huì)自動(dòng)根據(jù)當(dāng)時(shí)的時(shí)間填入。
創(chuàng)建數(shù)據(jù)表后,可查看數(shù)據(jù)表的結(jié)構(gòu):
在數(shù)據(jù)表中插入數(shù)據(jù)
這里插入了url和content兩個(gè)屬性,id是自動(dòng)遞增的,created_time是數(shù)據(jù)加入的時(shí)間戳,這兩個(gè)變量會(huì)自動(dòng)填入。
從數(shù)據(jù)表中提取數(shù)據(jù)
由上圖,我們可以看到提取數(shù)據(jù)有 3 種方法:
(1)將id等于 1 的數(shù)據(jù)行提取出來(lái);
(2)提取只看部分字段的數(shù)據(jù);
(3)提取包含部分內(nèi)容的數(shù)據(jù)。
刪除數(shù)據(jù)
??注意,如果沒(méi)有指定 WHERE 子句,用DELETE FROM urls將會(huì)導(dǎo)致MySQL表中的所有記錄被刪除,即誤刪除整張表。
修改數(shù)據(jù)
由于id和created_time是數(shù)據(jù)庫(kù)自動(dòng)填入的,因此這一行數(shù)據(jù)的id為 2。
更多操作可參考菜鳥(niǎo)教程。
下面介紹使用Python操作MySQL數(shù)據(jù)庫(kù),依次使用下令命令安裝mysqlclient:
brew install mysql export PATH=$PATH:/usr/local/mysql/bin pip install MySQL-Python pip3 install mysqlclient
出現(xiàn)下列文字即安裝成功:
用Python操作MySQL數(shù)據(jù)庫(kù),我們以在博客爬取標(biāo)題和 url 地址為例,具體代碼和解釋如下:
#coding=UTF-8 import MySQLdb import requests from bs4 import BeautifulSoup # connect() 方法用于創(chuàng)建數(shù)據(jù)庫(kù)的連接,里面可以指定參數(shù):用戶名,密碼,主機(jī)等信息 #這只是連接到了數(shù)據(jù)庫(kù),要想操作數(shù)據(jù)庫(kù)需要?jiǎng)?chuàng)建游標(biāo) conn = MySQLdb.connect(host="localhost", user="root", passwd="your_password", db="MyScraping", charset="utf8") # 通過(guò)獲取到的數(shù)據(jù)庫(kù)連接conn下的cursor()方法來(lái)創(chuàng)建游標(biāo)。 cur=conn.cursor() link = "http://www.santostang.com/" headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"} r = requests.get(link, headers=headers) soup = BeautifulSoup(r.text, "html.parser") title_list = soup.find_all("h1", class_="post-title") for eachone in title_list: url = eachone.a["href"] title = eachone.a.text.strip() # 創(chuàng)建數(shù)據(jù)表,通過(guò)游標(biāo)cur 操作execute()方法可以寫(xiě)入純sql語(yǔ)句。通過(guò)execute()方法中寫(xiě)如sql語(yǔ)句來(lái)對(duì)數(shù)據(jù)進(jìn)行操作 cur.execute("INSERT INTO urls (url, content) VALUES (%s, %s)", (url, title)) cur.close() conn.commit() conn.close()
最后,我們來(lái)介紹如何存儲(chǔ)至MongoDB數(shù)據(jù)庫(kù)。
首先要知道NoSQL泛指非關(guān)系型數(shù)據(jù)庫(kù),數(shù)據(jù)之間無(wú)關(guān)系,具有非常高的讀寫(xiě)性能,而MongoDB是其中非常流行的一種數(shù)據(jù)庫(kù)。它是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),所使用的是SQL語(yǔ)言,是訪問(wèn)數(shù)據(jù)庫(kù)最常用的標(biāo)準(zhǔn)化語(yǔ)言。
下面仍以上述的在博客爬取標(biāo)題和 url 地址為例。
第一步連接 MongoDB客戶端,然后連接數(shù)據(jù)庫(kù)blog_database,再選擇該數(shù)據(jù)的集合blog。如果它們不存在,就會(huì)自動(dòng)創(chuàng)建一個(gè),代碼示例如下:
from pymongo import MongoClient client = MongoClient("localhost", 27017) db = client.blog_database collection = db.blog
第二步爬取博客主頁(yè)的所有文章標(biāo)題存儲(chǔ)至MongoDB數(shù)據(jù)庫(kù),代碼如下:
import requests import datetime from bs4 import BeautifulSoup from pymongo import MongoClient client = MongoClient("localhost", 27017) db = client.blog_database collection = db.blog link = "http://www.santostang.com/" headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"} r = requests.get(link, headers=headers) soup = BeautifulSoup(r.text, "html.parser") title_list = soup.find_all("h1", class_="post-title") for eachone in title_list: url = eachone.a["href"] title = eachone.a.text.strip() post = {"url": url, "title": title, "date": datetime.datetime.utcnow() } collection.insert_one(post)
重點(diǎn)在最后一部分的代碼,首先將爬蟲(chóng)獲取的數(shù)據(jù)存入post的字典中,然后使用insert_one加入集合collection中。
最后,啟動(dòng)MongoDB查看結(jié)果。
打開(kāi)終端輸入:
sudo mongod --config /usr/local/etc/mongod.conf
確認(rèn)權(quán)限后,保持當(dāng)前終端不關(guān),新建終端依次輸入:
mongod mongo
出現(xiàn)以下文字表示連接成功:
然后,輸入:
use blog_database db.blog.find().pretty()
就查詢(xún)到數(shù)據(jù)集合的數(shù)據(jù)了,如下圖所示:
同時(shí)注意到,它是JSON格式的。
更多使用 Python 來(lái)操作 MongoDB 數(shù)據(jù)庫(kù)的知識(shí),可以參考 PyMongo官網(wǎng)。
本文為崔慶才博客和唐松的《Python網(wǎng)絡(luò)爬蟲(chóng)從入門(mén)到實(shí)踐》學(xué)習(xí)記錄與總結(jié),具體內(nèi)容可參考二者。博主在學(xué)習(xí)過(guò)程中的練習(xí)代碼也已上傳至 GitHub。
不足之處,歡迎指正。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41994.html
摘要:本篇內(nèi)容為網(wǎng)絡(luò)爬蟲(chóng)初級(jí)操作的簡(jiǎn)單介紹,內(nèi)容主要有以下部分解析網(wǎng)頁(yè)數(shù)據(jù)庫(kù)解析網(wǎng)頁(yè)一般來(lái)說(shuō),解析網(wǎng)頁(yè)有三種方式正則表達(dá)式。關(guān)于,我們最后再來(lái)看一個(gè)實(shí)戰(zhàn)項(xiàng)目爬取北京二手房?jī)r(jià)格。代碼如下第頁(yè)這樣就成功爬取了安居客上前頁(yè)的北京二手房?jī)r(jià)格。 本篇內(nèi)容為 python 網(wǎng)絡(luò)爬蟲(chóng)初級(jí)操作的簡(jiǎn)單介紹,內(nèi)容主要有以下 2 部分: 解析網(wǎng)頁(yè) 數(shù)據(jù)庫(kù) 解析網(wǎng)頁(yè) 一般來(lái)說(shuō),解析網(wǎng)頁(yè)有三種方式:正則表達(dá)式、...
摘要:同源策略是什么同源策略是瀏覽器的一個(gè)安全功能,不同源的數(shù)據(jù)禁止訪問(wèn)?;蛟S你可以說(shuō)驗(yàn)證,在瀏覽器沒(méi)有同源策略的情況下這些都可以繞過(guò)去。總結(jié)同源策略是蠻好的,防御了大部分的攻擊。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門(mén)技術(shù)就算入門(mén),但也僅僅是入門(mén),現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的中心思...
摘要:按照同樣的方式扒取所有的自己的用戶。但是為了尊重人家隱私權(quán),好吧,就這樣吧,我也不能做啥。 這幾天我很焦慮,受不了那些先f(wàn)ollow我,等我follow回去后又unfollow的人,因?yàn)槭撬麄兿萬(wàn)ollow我的,我出于人道主義想著互粉一下的,結(jié)果這么對(duì)我,太不厚道了。github又不像微博那樣有互粉標(biāo)志,這真的整得我很心煩,于是想著寫(xiě)一個(gè)爬蟲(chóng),把這些壞人揪出來(lái)~第一步,當(dāng)然是放出代碼啦...
摘要:以上示例代表當(dāng)發(fā)現(xiàn)條或條以上的級(jí)別的時(shí),自動(dòng)停止當(dāng)前任務(wù),如果當(dāng)前時(shí)間在郵件工作時(shí)間內(nèi),則同時(shí)發(fā)送通知郵件。 showImg(https://segmentfault.com/img/remote/1460000018052810); 一、需求分析 初級(jí)用戶: 只有一臺(tái)開(kāi)發(fā)主機(jī) 能夠通過(guò) Scrapyd-client 打包和部署 Scrapy 爬蟲(chóng)項(xiàng)目,以及通過(guò) Scrapyd JS...
閱讀 2523·2021-09-26 10:18
閱讀 3398·2021-09-22 10:02
閱讀 3206·2019-08-30 15:44
閱讀 3335·2019-08-30 15:44
閱讀 1841·2019-08-29 15:25
閱讀 2585·2019-08-26 14:04
閱讀 2050·2019-08-26 12:15
閱讀 2447·2019-08-26 11:43