这次参照老师上课给的代码,以及查阅资料,完成的作业。
# coding: utf-8
import os
import time
import urllib2
import urlparse
from bs4 import BeautifulSoup
def download(url,retry=2):#定义一个下载页面的函数
print"downloading: ",url
header = {
'User-agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}#可以自由设置,相当于网名
try:
request = urllib2.Request(url,headers=header)#相当于输入网址并输入自己的登录名
html = urllib2.urlopen(request).read()#抓取这个网页的html文件
except urllib2.URLError as e:#服务器不存在(例如链接打不开,url链接写错了)
print "download error: ", e.reason #输出异常原因
html = None#返回空值
if retry > 0:#还有重试次数,继续尝试爬取
if hasattr(e, 'code') and 500 <= e.code < 600:#错误码范围,只有在链接打不开的情况下才重新爬取,而链接写错了则不重新爬取。
print e.code
return download(url,retry -1)
time.sleep(0.1)#等待0.1s,避免对网站造成沉重负担,甚至对网站造成严重伤害或直接把网站拖垮
return html
def crawl_paper_tag(url_seed):
url_root = 'http://www.jianshu.com/'
paperlist = []#创建一个新的列表
i = 1
flag = True
while flag:
url=url_seed % i
i += 1
html = download(url)#调用函数
if html == None:
break
soup = BeautifulSoup(html, "html.parser") #格式化爬取的页面数据
lists = soup.find('ul',{'class':'note-list'}).find_all('li')
links = soup.find_all('a', {'class': 'title'})
if links.__len__() == 0: #爬取的页面中已无有效数据,终止爬取
flag = False
for papertag in lists:#开始采集数据
author = papertag.find('div',{'class': 'content'}).find('div',{'class': 'author'}).text#获取文章作者
title = papertag.find('div',{'class':'content'}).find('a',{'class':'title'}).text#获取文章标题
paperUrl = papertag.find('div',{'class':'content'}).find('a',{'class':'title'}).get('href')#获取文章链接
abstract = papertag.find('div',{'class':'content'}).find('p',{'class':'abstract'}).text#获取文章摘要
try:#这里有些没有缩略图,所以现寻找,防止报错
papertag.find('a',{'class':'wrap-img'})#获取缩略图
pic = papertag.find('a',{'class':'wrap-img'}).img.get('src')
except:
pic = 'Na'
metaRead = papertag.find('div',{'class':'content'}).find('div',{'class':'meta'}).find('i',{'class':'iconfont ic-list-read'}).parent.text#通过父代标签获取阅读数
metaComment = papertag.find('div',{'class':'content'}).find('div',{'class':'meta'}).find('i',{'class':'iconfont ic-list-comments'}).parent.text#获取评论数
metaLike = papertag.find('div',{'class':'content'}).find('div',{'class':'meta'}).find('i',{'class':'iconfont ic-list-like'}).parent.text#获取喜欢数
try:
papertag.find('div',{'class':'content'}).find('div',{'class':'meta'}).find('i',{'class':'iconfont ic-list-money'})#获取赞赏数
metaReward = papertag.find('div',{'class':'content'}).find('div',{'class':'meta'}).find('i',{'class':'iconfont ic-list-money'}).paient.text
except:
metaReward = 'Na'
#用字典保存
paperAttr = {
'author': author,
'title': title,
'paperUrl': urlparse.urljoin(url_root,paperUrl),
'abstract': abstract,
'pic': pic,
'metaRead': metaRead,
'metaComment': metaComment,
'metaLike': metaLike,
'metaReward': metaReward,
}
paperlist.append(paperAttr)
return paperlist
最后得到的结果中,存在了大量的转义字符。
存在问题:最后老师得到的结果中,数字是直接得到的结果,而我得到的是一个含转义字符的文本,不知是否有直接得到数值型数据的代码,我也没有查找到。