编程技术类解密大数据

爬虫04作业

2017-08-04  本文已影响29人  汤尧

这次参照老师上课给的代码,以及查阅资料,完成的作业。

# 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
部分返回结果值

最后得到的结果中,存在了大量的转义字符。

存在问题:最后老师得到的结果中,数字是直接得到的结果,而我得到的是一个含转义字符的文本,不知是否有直接得到数值型数据的代码,我也没有查找到。

上一篇下一篇

猜你喜欢

热点阅读