Python爬虫——爬取豆瓣VIP书籍信息并存入数据库
這兩天爬了豆瓣讀書的十萬條左右的書目信息,用時將近一天,現在趁著這個空閑把代碼總結一下,還是菜鳥,都是用的最簡單最笨的方法,還請路過的大神不吝賜教。
第一步,先看一下我們需要的庫:
我們要從這里獲取所有分類的標簽鏈接,進一步去爬取里面的信息,代碼先貼上來: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路徑提取。
我們先用一個網址來實驗爬取:
實驗成功后,我們就可以爬取數據并導入到數據庫中了,以下為全部源碼,特殊情況會用注釋一一說明。
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书籍信息并存入数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的第一篇博客——开篇
- 下一篇: websocket python爬虫_p