zoukankan      html  css  js  c++  java
  • 爬虫大作业

    爬取汽车之家网站信息:

    1、主题:爬取汽车之家当中新闻的的内容,对内容中的词语进行分析,生成词云

    网址:https://www.autohome.com.cn/news/?p=s#liststart

    2、具体步骤实现

    //获取Url页面中的时间、来源、名字和内容
    def getNewsDetail(Url): res = requests.get(Url) res.encoding = 'gb2312' Ssoup = BeautifulSoup(res.text, 'html.parser') news={} if len(Ssoup.select('.time'))>0: time = Ssoup.select('.time')[0].text.rstrip(' ').lstrip(' ') dt = datetime.strptime(time, '%Y年%m月%d日 %H:%M') else: dt='none' if len(Ssoup.select('.source'))>0: source = Ssoup.select('.source')[0].text.lstrip("来源:") else: source='none' if len(Ssoup.select('.name')) > 0: name = Ssoup.select('.name')[0].text.lstrip(' ').rstrip(' ') else: name='none' if len(Ssoup.select('.details')) > 0: content = Ssoup.select('.details')[0].text.strip() else: content = 'none' news['time'] = dt news['source'] = source news['name'] = name news['content'] = content writeContent(news['content']) print(dt,source,name,Url) return news

     由于是一个函数所以需要适应所有的页面而不是只是适合一个页面,所以需要判断是否存在时间、姓名、来源等,没有的页面给这些值赋予none

    //获取一个页面中有多少条新闻信息
    def getListPage(pageUrl): res = requests.get(pageUrl) res.encoding = 'gb2312' soup = BeautifulSoup(res.text, 'html.parser') newslist = [] for a in soup.select(".article-wrapper"): for b in a.select('li'): if len(b.select("a")) > 0: newsUrl = 'http:'+ b.select("a")[0].attrs['href'] newslist.append(getNewsDetail(newsUrl)) return(newslist)

     由于该页面中存在许多li,所以需要对li和a先进行便利

    //获取有多少页
    def getPageN(): res = requests.get(pageUrl) res.encoding = 'gb2312' soup = BeautifulSoup(res.text, 'html.parser') for a in soup.select('.page'): n = int(a.select('a')[10].text) return n

      

    pageUrl='https://www.autohome.com.cn/news/'
    newstotal = []
    newstotal.extend(getListPage(pageUrl))
    n = getPageN()
    for i in range(2,n):
        listPageUrl = 'https://www.autohome.com.cn/news/{}/#liststart'.format(i)
        newstotal.extend(getListPage(listPageUrl))
    # df = pandas.DataFrame(newstotal)
    # import openpyxl
    # df.to_excel('work.xlsx')

    由于该新闻网站的页面过多,在爬取过程胡出现连接错误,所以在后面的内容只是爬取到第161页的数据,大概2018年一整年的数据

    //将
    import jieba f = open('content.txt','r',encoding = 'utf-8') story=f.read() f.close() sep=''',。‘’“”:;()!?、《》 . < > / - 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y J a b c d e f g h i j k l m n o p q r s t u v w x y j''' exclude={' ',' ',' '} for c in sep: story = story.replace(c,'') tem=list(jieba.cut(story)) wordDict={} words=list(set(tem)-exclude) for w in range(0,len(words)): wordDict[words[w]]=story.count(str(words[w])) dictList = list(wordDict.items()) dictList.sort(key=lambda x:x[1],reverse=True) f = open('news.txt', 'a',encoding="utf-8") for i in range(150): f.write(dictList[i][0]+' ') f.close()

     读取刚刚爬取的content.txt中的内容,用jieba词库对内容进行分词,统计前150个祠是什么,然后存储到news.txt中 

    import wordcloud
    from PIL import Image,ImageSequence
    import numpy as np
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud,ImageColorGenerator
    import jieba
    f = open("news.txt","r",encoding='utf-8')
    str1 = f.read()
    stringList =list(jieba.cut(str1))
    delset = {",","。",":","“","”","?"," ",";","!","、"}
    stringset = set(stringList) - delset
    countdict = {}
    for i in stringset:
        countdict[i] = stringList.count(i)
    image= Image.open('G:WorkPython1\789.jpg')
    graph = np.array(image)
    font=r'C:WindowsFontssimhei.TTF'
    wc = WordCloud(font_path=font,background_color='White',max_words=100,mask=graph)
    wc.generate_from_frequencies(countdict)
    image_color = ImageColorGenerator(graph)
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
    

    读取news.txt中获取的前150个祠,生成词云

    3、结果

     4、遇到的问题(包括已经解决的和未解决的)

    问题一:

    在将newlist导入到Excel表中时候,出现了这样的错误,我尝试了一下只运行到第9页就可以导入到Excel当中,然后我看了一下网站页数

    在第9页的时候出现的出现额省略号,然后我查了很多办法,没办法解决问题,我觉得可能跟他自己的定义的div有关系,希望有大神解救。。。

    问题二:

    在生成newsUrl的时候,是没有加http这个超文本协议的,然后爬取网站的Url的时候是没办法直接在控制台进行访问的,但是复制网址到浏览器却可以进行访问,最后我发现浏览器会自动添加http

    问题三:

    在导入wordcloud的时候是不能直接导入的,需要从网上下载之后进行导入,刚开始我导入的是wordcloud-1.4.1-cp36-cp36m-win64.whl,但后面报错了,分析之后发现我安装的PyCharm是32位的

    问题四:

    上面也说到了,该网站有4000多页数据,刚开始我也想把全部数据爬取下来,但在爬取过程中总会出现错误,经过搜索发现,在爬取庞大的数据时,服务器会对极速访问的用户进行限制,所以我想通过time包,

    实现一秒一次进行访问,但是还是会出现该错误,所以最后我选择了前160页进行爬取,大概是2018年的数据。

     5、思想及结论

    爬虫爬取数据还是具有一定的实际意义,从汽车之家的新闻网站中可以获取到汽车新闻资讯的热门词汇,增长对汽车的了解。

    通过这次的爬虫大作业,加深我对爬取数据步骤等的了解和运用,在以后的工作生活中会起到一定作用。

  • 相关阅读:
    Zookeeper java API
    Zookeeper 安装与配置
    Zookeeper 架构
    HBase 优化
    HBase 与 MapReduce 整合
    Hbase protobuf Java API
    HBase数据库设计
    Fork/Join并发处理框架
    并发容器Map
    Redis缓存穿透、缓存击穿和雪崩
  • 原文地址:https://www.cnblogs.com/932zdb/p/8912019.html
Copyright © 2011-2022 走看看