日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python爬虫——爬取豆瓣VIP书籍信息并存入数据库

發布時間:2023/12/16 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬虫——爬取豆瓣VIP书籍信息并存入数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天爬了豆瓣讀書的十萬條左右的書目信息,用時將近一天,現在趁著這個空閑把代碼總結一下,還是菜鳥,都是用的最簡單最笨的方法,還請路過的大神不吝賜教。
第一步,先看一下我們需要的庫:

import requests #用來請求網頁 from bs4 import BeautifulSoup #解析網頁 import time #設置延時時間,防止爬取過于頻繁被封IP號 import re #正則表達式庫 import pymysql #由于爬取的數據太多,我們要把他存入MySQL數據庫中,這個庫用于連接數據庫 import random #這個庫里用到了產生隨機數的randint函數,和上面的time搭配,使爬取間隔時間隨機

我們要從這里獲取所有分類的標簽鏈接,進一步去爬取里面的信息,代碼先貼上來:python入門到實戰學習路線以及視頻教程請加q群

import requests from bs4 import BeautifulSoup #導入庫url="https://book.douban.com/tag/?icn=index-nav" wb_data=requests.get(url) #請求網址 soup=BeautifulSoup(wb_data.text,"lxml") #解析網頁信息 tags=soup.select("#content > div > div.article > div > div > table > tbody > tr > td > a")#根據CSS路徑查找標簽信息,CSS路徑獲取方法,右鍵-檢查-copy selector,tags返回的是一個列表 for tag in tags: tag=tag.get_text() #將列表中的每一個標簽信息提取出來helf="https://book.douban.com/tag/" #觀察一下豆瓣的網址,基本都是這部分加上標簽信息,所以我們要組裝網址,用于爬取標簽詳情頁url=helf+str(tag) print(url) #網址組裝完畢,輸出

以上我們便爬取了所有標簽下的網址,我們將這個文件命名為channel,并在channel中創建一個channel字符串,放上我們所有爬取的網址信息,等下爬取詳情頁的時候直接從這里提取鏈接就好了,如下:219539519 歡迎加入

channel=''' https://book.douban.com/tag/小說 https://book.douban.com/tag/外國文學 https://book.douban.com/tag/文學 https://book.douban.com/tag/隨筆 https://book.douban.com/tag/中國文學 https://book.douban.com/tag/經典 https://book.douban.com/tag/日本文學 https://book.douban.com/tag/散文 https://book.douban.com/tag/村上春樹 https://book.douban.com/tag/詩歌 https://book.douban.com/tag/童話 https://book.douban.com/tag/雜文 https://book.douban.com/tag/王小波 https://book.douban.com/tag/兒童文學 https://book.douban.com/tag/古典文學 https://book.douban.com/tag/張愛玲 https://book.douban.com/tag/名著 https://book.douban.com/tag/余華 https://book.douban.com/tag/當代文學 https://book.douban.com/tag/錢鐘書 https://book.douban.com/tag/魯迅 https://book.douban.com/tag/外國名著 https://book.douban.com/tag/詩詞 https://book.douban.com/tag/茨威格 https://book.douban.com/tag/米蘭·昆德拉 https://book.douban.com/tag/杜拉斯 https://book.douban.com/tag/港臺 https://book.douban.com/tag/漫畫 https://book.douban.com/tag/繪本 https://book.douban.com/tag/推理 https://book.douban.com/tag/青春 https://book.douban.com/tag/言情 https://book.douban.com/tag/科幻 https://book.douban.com/tag/東野圭吾 https://book.douban.com/tag/懸疑 https://book.douban.com/tag/武俠 https://book.douban.com/tag/奇幻 https://book.douban.com/tag/韓寒 https://book.douban.com/tag/日本漫畫 https://book.douban.com/tag/耽美 https://book.douban.com/tag/亦舒 https://book.douban.com/tag/三毛 https://book.douban.com/tag/安妮寶貝 https://book.douban.com/tag/網絡小說 https://book.douban.com/tag/推理小說 https://book.douban.com/tag/郭敬明 https://book.douban.com/tag/穿越 https://book.douban.com/tag/金庸 https://book.douban.com/tag/輕小說 https://book.douban.com/tag/阿加莎·克里斯蒂 https://book.douban.com/tag/幾米 https://book.douban.com/tag/魔幻 https://book.douban.com/tag/張小嫻 https://book.douban.com/tag/幾米 https://book.douban.com/tag/青春文學 https://book.douban.com/tag/科幻小說 https://book.douban.com/tag/J.K.羅琳 https://book.douban.com/tag/高木直子 https://book.douban.com/tag/古龍 https://book.douban.com/tag/滄月 https://book.douban.com/tag/落落 https://book.douban.com/tag/張悅然 https://book.douban.com/tag/蔡康永 https://book.douban.com/tag/歷史 https://book.douban.com/tag/心理學 https://book.douban.com/tag/哲學 https://book.douban.com/tag/傳記 https://book.douban.com/tag/文化 https://book.douban.com/tag/社會學 https://book.douban.com/tag/藝術 https://book.douban.com/tag/設計 https://book.douban.com/tag/政治 https://book.douban.com/tag/社會 https://book.douban.com/tag/建筑 https://book.douban.com/tag/宗教 https://book.douban.com/tag/電影 https://book.douban.com/tag/數學 https://book.douban.com/tag/政治學 https://book.douban.com/tag/回憶錄 https://book.douban.com/tag/思想 https://book.douban.com/tag/中國歷史 https://book.douban.com/tag/國學 https://book.douban.com/tag/音樂 https://book.douban.com/tag/人文 https://book.douban.com/tag/人物傳記 https://book.douban.com/tag/戲劇 https://book.douban.com/tag/生活 https://book.douban.com/tag/成長 https://book.douban.com/tag/勵志 https://book.douban.com/tag/心理 https://book.douban.com/tag/攝影 https://book.douban.com/tag/女性 https://book.douban.com/tag/職場 https://book.douban.com/tag/美食 https://book.douban.com/tag/教育 https://book.douban.com/tag/游記 https://book.douban.com/tag/靈修 https://book.douban.com/tag/健康 https://book.douban.com/tag/情感 https://book.douban.com/tag/手工 https://book.douban.com/tag/養生 https://book.douban.com/tag/兩性 https://book.douban.com/tag/人際關系 https://book.douban.com/tag/家居 https://book.douban.com/tag/自助游 https://book.douban.com/tag/經濟學 https://book.douban.com/tag/管理 https://book.douban.com/tag/經濟 https://book.douban.com/tag/商業 https://book.douban.com/tag/金融 https://book.douban.com/tag/投資 https://book.douban.com/tag/營銷 https://book.douban.com/tag/創業 https://book.douban.com/tag/理財 https://book.douban.com/tag/廣告 https://book.douban.com/tag/股票 https://book.douban.com/tag/企業史 https://book.douban.com/tag/策劃 https://book.douban.com/tag/科普 https://book.douban.com/tag/互聯網 https://book.douban.com/tag/編程 https://book.douban.com/tag/科學 https://book.douban.com/tag/交互設計 https://book.douban.com/tag/用戶體驗 https://book.douban.com/tag/算法 https://book.douban.com/tag/web https://book.douban.com/tag/科技 https://book.douban.com/tag/UE https://book.douban.com/tag/通信 https://book.douban.com/tag/交互 https://book.douban.com/tag/UCD https://book.douban.com/tag/神經網絡 https://book.douban.com/tag/程序 '''

現在,我們開始第二個程序。

標簽頁下每一個圖片的信息基本都是這樣的,我們可以直接從這里提取到標題,作者,出版社,出版時間,價格,評價人數,以及評分等信息(有些外國作品還會有譯者信息),提取方法與提取標簽類似,也是根據CSS路徑提取。
我們先用一個網址來實驗爬取:

url="https://book.douban.com/tag/科技" wb_data = requests.get(url) soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml") tag=url.split("?")[0].split("/")[-1] #從鏈接里面提取標簽信息,方便存儲 detils=soup.select("#subject_list > ul > li > div.info > div.pub") #抓取作者,出版社信息,稍后我們用spite()函數再將他們分離出來 scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums") #抓取評分信息 persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl") #評價人數 titles=soup.select("#subject_list > ul > li > div.info > h2 > a") #書名 #以上抓取的都是我們需要的html語言標簽信息,我們還需要將他們一一分離出來 for detil,scor,person,title in zip(detils,scors,persons,titles): #用一個zip()函數實現一次遍歷 #因為一些標簽中有譯者信息,一些標簽中沒有,為避免錯誤,所以我們要用一個try來把他們分開執行 try: author=detil.get_text().split("/",4)[0].split()[0] #這是含有譯者信息的提取辦法,根據“/” 把標簽分為五部分,然后依次提取出來yizhe= detil.get_text().split("/", 4)[1] publish=detil.get_text().split("/", 4)[2] time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0] #時間我們只提取了出版年份 price=ceshi_priceone(detil) #因為價格的單位不統一,我們用一個函數把他們換算為“元”scoe=scor.get_text() if True else "" #有些書目是沒有評分的,為避免錯誤,我們把沒有評分的信息設置為空 person=ceshi_person(person) #有些書目的評價人數顯示少于十人,爬取過程中會出現錯誤,用一個函數來處理title=title.get_text().split()[0] #當沒有譯者信息時,會顯示IndexError,我們分開處理except IndexError: try: author=detil.get_text().split("/", 3)[0].split()[0] yizhe="" #將detil信息劃分為4部分提取,譯者信息直接設置為空,其他與上面一樣 publish=detil.get_text().split("/", 3)[1] time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0] price=ceshi_pricetwo(detil) scoe=scor.get_text() if True else "" person=ceshi_person(person) title=title.get_text().split()[0] except (IndexError,TypeError): continue #出現其他錯誤信息,忽略,繼續執行(有些書目信息下會沒有出版社或者出版年份,但是數量很少,不影響我們大規模爬取,所以直接忽略)except TypeError: continue#提取評價人數的函數,如果評價人數少于十人,按十人處理 def ceshi_person(person): try: person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4]) except ValueError: person = int(10) return person#分情況提取價格的函數,用正則表達式找到含有特殊字符的信息,并換算為“元” def ceshi_priceone(price): price = detil.get_text().split("/", 4)[4].split() if re.match("USD", price[0]): price = float(price[1]) * 6 elif re.match("CNY", price[0]): price = price[1] elif re.match("\A$", price[0]): price = float(price[1:len(price)]) * 6 else: price = price[0] return price def ceshi_pricetwo(price): price = detil.get_text().split("/", 3)[3].split() if re.match("USD", price[0]): price = float(price[1]) * 6 elif re.match("CNY", price[0]): price = price[1] elif re.match("\A$", price[0]): price = float(price[1:len(price)]) * 6 else: price = price[0] return price

實驗成功后,我們就可以爬取數據并導入到數據庫中了,以下為全部源碼,特殊情況會用注釋一一說明。

import requests from bs4 import BeautifulSoup import time import re import pymysql from channel import channel #這是我們第一個程序爬取的鏈接信息 import randomdef ceshi_person(person): try: person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4]) except ValueError: person = int(10) return persondef ceshi_priceone(price): price = detil.get_text().split("/", 4)[4].split() if re.match("USD", price[0]): price = float(price[1]) * 6 elif re.match("CNY", price[0]): price = price[1] elif re.match("\A$", price[0]): price = float(price[1:len(price)]) * 6 else: price = price[0] return pricedef ceshi_pricetwo(price): price = detil.get_text().split("/", 3)[3].split() if re.match("USD", price[0]): price = float(price[1]) * 6 elif re.match("CNY", price[0]): price = price[1] elif re.match("\A$", price[0]): price = float(price[1:len(price)]) * 6 else: price = price[0] return price#這是上面的那個測試函數,我們把它放在主函數中 def mains(url):wb_data = requests.get(url)soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")tag=url.split("?")[0].split("/")[-1] detils=soup.select("#subject_list > ul > li > div.info > div.pub") scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums") persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl") titles=soup.select("#subject_list > ul > li > div.info > h2 > a") for detil,scor,person,title in zip(detils,scors,persons,titles):l = [] #建一個列表,用于存放數據try: author=detil.get_text().split("/",4)[0].split()[0] yizhe= detil.get_text().split("/", 4)[1] publish=detil.get_text().split("/", 4)[2] time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0] price=ceshi_priceone(detil) scoe=scor.get_text() if True else "" person=ceshi_person(person) title=title.get_text().split()[0] except IndexError: try: author=detil.get_text().split("/", 3)[0].split()[0] yizhe="" publish=detil.get_text().split("/", 3)[1] time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0] price=ceshi_pricetwo(detil) scoe=scor.get_text() if True else "" person=ceshi_person(person) title=title.get_text().split()[0] except (IndexError,TypeError): continue except TypeError: continuel.append([title,scoe,author,price,time,publish,person,yizhe,tag])#將爬取的數據依次填入列表中sql="INSERT INTO allbooks values(%s,%s,%s,%s,%s,%s,%s,%s,%s)" #這是一條sql插入語句cur.executemany(sql,l) #執行sql語句,并用executemary()函數批量插入數據庫中conn.commit()#主函數到此結束# 將Python連接到MySQL中的python數據庫中 conn = pymysql.connect( user="root",password="123123",database="python",charset='utf8') cur = conn.cursor()cur.execute('DROP TABLE IF EXISTS allbooks') #如果數據庫中有allbooks的數據庫則刪除 sql = """CREATE TABLE allbooks( title CHAR(255) NOT NULL, scor CHAR(255), author CHAR(255), price CHAR(255), time CHAR(255), publish CHAR(255), person CHAR(255), yizhe CHAR(255), tag CHAR(255) )""" cur.execute(sql) #執行sql語句,新建一個allbooks的數據庫start = time.clock() #設置一個時鐘,這樣我們就能知道我們爬取了多長時間了 for urls in channel.split(): urlss=[urls+"?start={}&type=T".format(str(i)) for i in range(0,980,20)] #從channel中提取url信息,并組裝成每一頁的鏈接for url in urlss: mains(url) #執行主函數,開始爬取print(url) #輸出要爬取的鏈接,這樣我們就能知道爬到哪了,發生錯誤也好處理time.sleep(int(format(random.randint(0,9)))) #設置一個隨機數時間,每爬一個網頁可以隨機的停一段時間,防止IP被封 end = time.clock() print('Time Usage:', end - start) #爬取結束,輸出爬取時間 count = cur.execute('select * from allbooks') print('has %s record' % count) #輸出爬取的總數目條數# 釋放數據連接 if cur: cur.close() if conn: conn.close()

這樣,一個程序就算完成了,豆瓣的書目信息就一條條地寫進了我們的數據庫中,當然,在爬取的過程中,也遇到了很多問題,比如標題返回的信息拆分后中會有空格,寫入數據庫中會出現錯誤,所以只截取了標題的第一部分,因而導致數據庫中的一些書名不完整,過往的大神如果有什么辦法,還請指教一二。

等待爬取的過程是漫長而又欣喜的,看著電腦上一條條信息被刷出來,成就感就不知不覺涌上心頭;然而如果你吃飯時它在爬,你上廁所時它在爬,你都已經爬了個山回來了它還在爬時,便會有點崩潰了,擔心電腦隨時都會壞掉(還是窮學生換不起啊啊啊啊~)

所以,還是要好好學學設置斷點,多線程,以及正則,路漫漫其修遠兮,吾將上下而求索共勉

總結

以上是生活随笔為你收集整理的Python爬虫——爬取豆瓣VIP书籍信息并存入数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。