赞
踩
我的另一篇博客,Python 爬虫豆瓣电影top250
有了上次的经验,这次爬豆瓣读书中评分9分以上榜单,链接豆瓣读书评分9分以上榜单 。
打开链接,查看网页源代码,查找我们需要的信息的字段标签,本次以书名、评分、评价人数、图片、出版社、出版日期、ISBN编号为目标,分别进行处理、获取并保存。(当然最根本的前提依然是通过url获取到网页的源代码)
本实例完整代码请移步 github: https://github.com/selfcon/douban_book_scraper
推荐正则表达式在线检测工具: http://tool.oschina.net/regex/
# 将 url 转换为 HTML 源码
def getHtml(url):
try:
page = urllib.request.urlopen(url)
html = page.read()
except:
print("failed to geturl")
return ''
else:
return html
和上篇文章相比,增加了对 url 异常的处理(因为有时候我们爬出来的链接可能是无效的)。建议以后都要这么写,增加程序的健壮性。
# 通过正则表达式获取该网页下每本书的 title(换行符没去掉)
def getTitle(html):
nameList = re.findall(r'<a href="https.*?".*?target="_blank">(.*?)</a>',html,re.S)
newNameList = [];
global topnum
for index,item in enumerate(nameList):
if item.find("img") == -1: # 通过检测 img,只保留中文标题
#item.replace('\n','')
#item.strip()
#item.splitlines()
#re.sub('\r|\n', '', item)
if topnum % 26 != 0:
#newNameList.append("Top " + str(topnum) + " " + item);
newNameList.append(item);
topnum += 1;
return newNameList
通过观察爬取的结果,发现每一页都会多出一个内容(虽然符合正则表达式的规则,但并不是我们需要的数据,所以需要通过简单的处理将其剔除掉)。这项有个小瑕疵:爬取的标题前后带着换行符,试了几种方法还是没去掉!!!心塞(欢迎告知)
# 通过正则表达式获取该网页下每本书的图片链接
def getImg(html):
imgList = re.findall(r'img.*?width=.*?src="(http.*?)"',html,re.S)
newImgList = []
for index,item in enumerate(imgList):
if item.find("js") == -1 and item.find("css") == -1 and item.find("dale") == -1 and item.find("icon") == -1 and item.find("png") == -1:
newImgList.append(item);
return newImgList;
因为页面中符合条件的数据种类繁多,所以需要将其中不是我们需要的剔除掉 (判断条件有点暴力,暂时没想到更好的办法)
# 实现翻页,每页 25 个
for page in range(0,450,25):
url = "https://www.douban.com/doulist/1264675/?start={}".format(page)
html = getHtml(url).decode("UTF-8");
if html == '':
namesUrl.extend('none');
imgsUrl.extend('none')
scoresUrl.extend('none')
commentsUrl.extend('none')
introductionsUrl.extend('none')
else:
namesUrl.extend(getTitle(html))
imgsUrl.extend(getImg(html))
scoresUrl.extend(getScore(html))
commentsUrl.extend(getComment(html))
introductionsUrl.extend(getDetail(html))
针对网页异常的做了处理
# 进入书的详情页,获取出版社、isbn 等信息
for index,item in enumerate(introductionsUrl):
print(item)
if getHtml(item) == '': # 排除链接不存在的情况
newPresssUrl.append("该链接不存在")
publishYearsUrl.append("该链接不存在")
isbnsUrl.append("该链接不存在")
else:
html_detail = getHtml(item).decode("UTF-8")
#print(getIntroduction(html_detail))
newPresssUrl.append(getPress(html_detail))
publishYearsUrl.append(getPublishYear(html_detail))
isbnsUrl.append(getIsbn(html_detail))
time.sleep(random.randint(1,2))
实现了页面跳转,再进行爬取数据的功能。因为很多网站都有反爬虫机制,所以加上下面这句代码会是不错的选择哦!
time.sleep(random.randint(1,2))
默认保存在 D 盘,格式为 .csv 格式的,当然可以按需进行存储
def saveInfo(infoList):
with open('D:/book_scraper.csv','w+',newline='',encoding='gb18030') as fp:
a = csv.writer(fp,delimiter = ',') #delimiter的意思是插入到csv文件中的一行记录以它分隔开
a.writerow(['书 名','评 分','评价人数','图片链接','出 版社','出版年份',' ISBN '])
a.writerows(infoList)
print('保存完毕')
共428条数据。
------至所有正在努力奋斗的程序猿们!加油!!
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁
——乐于分享,共同进步,欢迎补充
——Treat Warnings As Errors
——Any comments greatly appreciated
——Talking is cheap, show me the code
——诚心欢迎各位交流讨论!QQ:1138517609
——CSDN:https://blog.csdn.net/u011489043
——GitHub:https://github.com/selfconzrr
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。