豆瓣源碼
❶ 如何用python爬取豆瓣讀書的數據
這兩天爬了豆瓣讀書的十萬條左右的書目信息,用時將近一天,現在趁著這個空閑把代碼總結一下,還是菜鳥,都是用的最簡單最笨的方法,還請路過的大神不吝賜教。
第一步,先看一下我們需要的庫:
import requests #用來請求網頁
from bs4 import BeautifulSoup #解析網頁
import time #設置延時時間,防止爬取過於頻繁被封IP號
import re #正則表達式庫
import pymysql #由於爬取的數據太多,我們要把他存入MySQL資料庫中,這個庫用於連接資料庫
import random #這個庫里用到了產生隨機數的randint函數,和上面的time搭配,使爬取間隔時間隨機
這個是豆瓣的網址:x-sorttags-all
我們要從這里獲取所有分類的標簽鏈接,進一步去爬取裡面的信息,代碼先貼上來:
import requests
from bs4 import BeautifulSoup #導入庫
url="httom/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路徑獲取方法,右鍵-檢查- selector,tags返回的是一個列表
for tag in tags:
tag=tag.get_text() #將列表中的每一個標簽信息提取出來
helf="hom/tag/"
#觀察一下豆瓣的網址,基本都是這部分加上標簽信息,所以我們要組裝網址,用於爬取標簽詳情頁
url=helf+str(tag)
print(url) #網址組裝完畢,輸出
以上我們便爬取了所有標簽下的網址,我們將這個文件命名為channel,並在channel中創建一個channel字元串,放上我們所有爬取的網址信息,等下爬取詳情頁的時候直接從這里提取鏈接就好了,如下:
channel='''
tag/程序
'''
現在,我們開始第二個程序。
QQ圖片20160915233329.png
標簽頁下每一個圖片的信息基本都是這樣的,我們可以直接從這里提取到標題,作者,出版社,出版時間,價格,評價人數,以及評分等信息(有些外國作品還會有譯者信息),提取方法與提取標簽類似,也是根據CSS路徑提取。
我們先用一個網址來實驗爬取:
url="htt/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 random
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
#這是上面的那個測試函數,我們把它放在主函數中
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:
continue
l.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()
這樣,一個程序就算完成了,豆瓣的書目信息就一條條地寫進了我們的資料庫中,當然,在爬取的過程中,也遇到了很多問題,比如標題返回的信息拆分後中會有空格,寫入資料庫中會出現錯誤,所以只截取了標題的第一部分,因而導致資料庫中的一些書名不完整,過往的大神如果有什麼辦法,還請指教一二。
等待爬取的過程是漫長而又欣喜的,看著電腦上一條條信息被刷出來,成就感就不知不覺湧上心頭;然而如果你吃飯時它在爬,你上廁所時它在爬,你都已經爬了個山回來了它還在爬時,便會有點崩潰了,擔心電腦隨時都會壞掉(還是窮學生換不起啊啊啊啊~)
所以,還是要好好學學設置斷點,多線程,以及正則,路漫漫其修遠兮,吾將上下而求索~共勉~
❷ 誰有豆瓣網的源碼啊
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
豆瓣
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="Sun, 6 Mar 2005 01:00:00 GMT" />
<meta content="提供圖書、電影、音樂唱片的推薦、評論和價格比較,以及城市獨特的文化生活。" name="description"/>
<meta name="google-site-verification" content="" />
<script type="text/javascript" src="http://t.douban.com/js/packed_jquery0.js"></script>
<link rel="shortcut icon" href="http://t.douban.com/favicon.ico" type="image/x-icon" />
<link href="http://img2.douban.com/css/packed_douban223.css" rel="stylesheet" type="text/css" />
<link href="http://img2.douban.com/css/separation/packed__all62.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="http://img2.douban.com/js/packed_douban73.js"></script>
<script type="text/javascript" src="http://img2.douban.com/js/separation/packed__all7.js"></script>
<style type="text/css">
.anony-nav { margin-bottom:20px; }
.anony-nav .hd a:link,
.anony-nav .hd a:visited,
.anony-nav .hd a:hover,
.anony-nav .hd a:active { background-color:transparent; }
.anony-nav .hd { height:74px; }
.anony-nav .hd,
.anony-nav .bd { clear:both;width:950px;margin:0 auto; }
#db-sidesrh { float:left;margin-bottom:20px; }
#db-sidesrh:after,
.anony-nav .hd:after,
.anony-nav .bd:after,
.anony-nav .login .item:after { content:'\0020';display:block;clear:both; }
.anony-nav .logo { float:left;margin-top:23px; }
.anony-nav .logo a { display:block;width:168px;height:34px;background:transparent;overflow:hidden;line-height:10em;background:url(http://t.douban.com/pics/nav/ui_nav_logo_4.png) no-repeat 0 -3px; }
.anony-nav .top-nav-items { float:right;margin:37px 0 0 0;}
.anony-nav .top-nav-items li { margin:0 0 0 44px; }
.anony-nav a.lnk-book:link,
.anony-nav a.lnk-book:visited,
.anony-nav a.lnk-book:hover,
.anony-nav a.lnk-book:active,
.anony-nav a.lnk-movie:link,
.anony-nav a.lnk-movie:visited,
.anony-nav a.lnk-movie:hover,
.anony-nav a.lnk-movie:active,
.anony-nav a.lnk-music:link,
.anony-nav a.lnk-music:visited,
.anony-nav a.lnk-music:hover,
.anony-nav a.lnk-music:active,
.anony-nav a.lnk-9:link,
.anony-nav a.lnk-9:visited,
.anony-nav a.lnk-9:hover,
.anony-nav a.lnk-9:active,
.anony-nav a.lnk-srh:link,
.anony-nav a.lnk-srh:visited,
.anony-nav a.lnk-srh:hover,
.anony-nav a.lnk-srh:active { display:-moz-inline-box;display:inline-block;*display:inline;zoom:1;width:100px;height:24px;overflow:hidden;line-height:10em;background:transparent url(http://t.douban.com/pics/nav/ui_nav_logo_4.png) no-repeat -177px 0;vertical-align:text-bottom; }
.anony-nav a.lnk-srh:link,
.anony-nav a.lnk-srh:visited,
.anony-nav a.lnk-srh:hover,
.anony-nav a.lnk-srh:active { width:14px;height:14px;margin-left:5px;background-position:0 -48px; }
.anony-nav a.lnk-movie:link,
.anony-nav a.lnk-movie:visited,
.anony-nav a.lnk-movie:hover,
.anony-nav a.lnk-movie:active { background-position: -283px 0; }
.anony-nav a.lnk-music:link,
.anony-nav a.lnk-music:visited,
.anony-nav a.lnk-music:hover,
.anony-nav a.lnk-music:active { background-position: -385px 0; }
.anony-nav a.lnk-9:link,
.anony-nav a.lnk-9:visited,
.anony-nav a.lnk-9:hover,
.anony-nav a.lnk-9:active { width:80px;background-position: -485px 0; }
.anony-nav fieldset { border:0;padding:0;margin:0; }
.anony-nav legend { display:none; }
.anony-nav .reg { float:left;position:relative;width:590px;height:134px;font-size:14px;color:#666;line-height:1.6;background:#e9eef2 url(http://t.douban.com/pics/nav/ui_b_2.png) no-repeat -12px 0; }
.anony-nav .reg div { padding:22px 0 18px 0; }
.anony-nav .reg strong { float:left;width:200px;height:80px;text-align:center;font-size:24px;padding-top:46px; }
.anony-nav .reg em { font-size:12px;font-style:normal;color:#666; }
.anony-nav .reg b { font-size:16px;font-weight:400;margin-right:5px; }
a.lnk-reg:link,
a.lnk-reg:visited,
a.lnk-reg:hover,
a.lnk-reg:active { display:-moz-inline-box;display:inline-block;*display:inline;zoom:1;font-size:12px;text-align:left;width:130px;height:27px;line-height:28px;color:#fff;background:url(http://t.douban.com/pics/nav/ui_nav_logo_4.png) no-repeat -120px -48px; }
.anony-nav .reg .lnk-reg strong { float:none;color:#fff;padding:0;font-size:16px;font-weight:400;margin:0 10px 0 16px; }
.anony-nav .login { float:right;width:356px;height:134px;font-size:14px;background:#e9eef2 url(http://t.douban.com/pics/nav/ui_b_2.png) no-repeat 348px 0; }
.anony-nav .login form { position:relative;padding:23px 0 0 20px;padding:16px 0 0 20px\9; }
.anony-nav .item label { float:left;width:4em; }
.anony-nav .item input { border:1px solid #ccc;width:200px;padding:3px 2px; }
.anony-nav .login .item { margin-bottom:10px; }
.anony-nav .login .item a { font-size:12px; }
.anony-nav .login .item1 { float:left;font-size:12px;margin:0 20px 10px 0;color:#666; }
.anony-nav .login .item1 label { display:-moz-inline-box;display:inline-block;display:inline\9;*zoom:1;margin-left:4.5em;margin-top:4px; }
.anony-nav .login .item1 label input { *float:left;margin-right:2px\9;_margin-right:-4px; }
.anony-nav .bn-submit { width:80px;height:28px;color:#FFF;font-size:14px;line-height:28px;padding-bottom:3px;padding:0\9;border:none;background:transparent url(http://t.douban.com/pics/nav/ui_nav_logo_4.png) no-repeat -23px -48px;cursor:pointer; }
#nav-vsrh-bn { position:absolute;width:29px;height:25px;overflow:hidden;line-height:10em;background:url(http://t.douban.com/pics/nav/ui_sl_bn.png) no-repeat;_background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://t.douban.com/pics/nav/ui_sl_bn.png', sizingMethod='scale'); }
#nav-vsrh { position:absolute;width:211px;height:50px; }
#nav-vsrh .bd { height:47px;color:#fff;background:url(http://t.douban.com/pics/nav/ui_sl_bbd_1.png) no-repeat; }
#nav-vsrh form { padding:5px 10px; }
#nav-vsrh .search-btn,
.anony-nav .vsrh { display:none; }
#nav-vsrh input { width:94%; }
#nav-vsrh .option input { width:auto; }
#nav-vsrh .x1 { position:absolute;left:209px;top:0;width:2px;height:47px;overflow:hidden;background:url(http://t.douban.com/pics/nav/ui_sl_br_1.png) no-repeat;_background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://t.douban.com/pics/nav/ui_sl_br_1.png', sizingMethod='scale');}
#nav-vsrh .x2 { position:absolute;top:47px;left:0;width:211px;height:3px;overflow:hidden;background:url(http://t.douban.com/pics/nav/ui_sl_bb.png) no-repeat;_background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://t.douban.com/pics/nav/ui_sl_bb.png', sizingMethod='scale');}
#nav-vsrh .wrapinp { padding:12px 10px;}
.wrapinp input{ padding:2px; }
#page_focus { width:220px;}
.intro1 { padding:8px 2px 0 8px;line-height:1.4; }
.movie_headerline ul.menu li,
.movie_headerline ul.menu li div,
.movie_headerline ul.menu li .on { height:54px;*height:50px !important;_height:42px !important; }
.movie_headerline .content .title:after { content:'\0020';display:block;clear:both;zoom:1;margin-bottom:5px; }
.movie_headerline .content .headerline_img { width:140px; }
.movie_headerline .content .headerline_img img { width:130px; }
.movie_headerline .content .headerline_content { width:250px; }
.anony-nav .nav-tip { position:relative;width:960px;margin:0 auto; }
.movie_headerline .content .headerline_img { height:185px; }
.movie_headerline .content { height:190px;*height:180px; }
.movie_headerline ul.menu { height:218px;*height:203px;*overflow:hidden; }
#db-sidesrh { width:100%; }
#db-sidesrh form { float:right;width:100%; }
#db-sidesrh input { float:left; }
#db-sidesrh .inp input { width:246px;padding:0 2px;vertical-align:baseline; }
#db-sidesrh input { height:24px;line-height:24px;border:1px solid #c3c3c3; }
#db-sidesrh .bn-srh { width:50px;height:26px;margin:0 0 0 2px;*margin:0;padding-bottom:2px;padding-bottom:0\9;letter-spacing:3px;padding-left:1px;cursor:pointer;border:none;background:transparent url(http://t.douban.com/pics/nav/ui_ns_sbg3.png) no-repeat -360px -100px;}
#db-sidesrh .submenu .menu { width:60px; }
#db-sidesrh .submenu .selected span { background-image:url(http://t.douban.com/pics/nav/ui_ns_sbg3.png);background-position:-450px -124px; }
#db-sidesrh .submenu .open span { background-position:-450px -100px; }
#db-sidesrh .submenu .line { height:1px;font-size:0;line-height:0;margin-bottom:1px;overflow:hidden;border-bottom:1px solid #c3c3c3; }
#db-sidesrh .submenu,#db-sidesrh .submenu .selected,#db-sidesrh .submenu .menu { border-color:#c3c3c3; }
❸ 求豆瓣fm 安卓3.2.5版的源碼,或者類似這樣的抽屜效果源碼
可以到「源碼天堂」Android源碼頻道下載,那個網站的Android源碼比較多一點。
❹ 求《JVMG1源碼分析和調優豆瓣》全文免費下載百度網盤資源,謝謝~
《JVM G1源碼分析和調優豆瓣》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1i8sXLpI7Ey-07u7mGCq2WA
簡介:G1作為JVM中成熟的垃圾回收器,已經廣泛應用在眾多公司的生產環境中。本書詳細介紹G1涉及的基本概念和運行原理,以及調優方法。
❺ 豆瓣網站源碼裡面的after是怎麼用
進入設置效果點擊:>>控制面板>>個人首頁維護>>自定義空白面板>>新增空白面板,命名『豆瓣』,勾選源代碼,把以下代碼粘貼到獨立合適的位置,保存。第二步,進行定製首頁模塊:>>控制面板>>定製首頁的內容模塊>>添加,勾選「豆瓣」,點擊下方的選取按鈕,保存定製首頁模塊。完成。如果豆瓣提供的調用,那就需要做一個頁,然後採用iframe嵌入。也可以前面再加一些,不過這樣要快速一次完成。
❻ 哪有仿豆瓣源碼下載
自己去 www.webmagik.cn 去下載,現在已經免費了。 查看原帖>>
❼ 有沒有類似豆瓣網的源代碼,php的,有那個社區和個人主頁就行
ThinkSAAS開源小組 仿豆瓣小組
網路搜索以上關鍵字即可。 貼網址上不來。。。。
❽ 為什麼豆瓣的照片在平板上沒法保存
可能是你保存的格式不對,或者是你沒有給許可權。
豆瓣照片保存辦法:
1.用Java獲取頁面,然後用Jsoup來得到自己想要的數據,再保存到資料庫(我用了Hibernate的框架),最後用自己的網站顯示這些數據。
2.豆瓣本身貌似提供了給開發者使用的介面,但是我不想去注冊賬號(我還沒有豆瓣賬號),,,就想自己通過網頁源碼分析,然後拿到自己想要的數據。
3.在看豆瓣的網頁源碼的時候,通過用Chrome的F12分析工具中的NetWork網路分析,發現了豆瓣一個請求的介面,其返回值是Json數組,數組包含電影評分,名字,圖片的url,導演等數據。
4.用QQ的截屏工具貌似還很好用(Ctrl+Alt+A) 通過這個介面可以獲取豆瓣的電影(評分由高到低,每次請求只會返回20個數據,但通過更改url里的start的數值(從這位置開始,向後獲得20個數據),可以獲取更多的數據。