豆瓣源码
❶ 如何用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个数据),可以获取更多的数据。