python爬虫(以简书为例)

1.主题:

简单爬取简书中的专题‘’@IT·互联网“中的文章,爬取信息之后通过jieba分词生成词云并且进行分析;

2.实现过程:

   第一步:打开简书并进入到@IT-互联网专题

网页链接:https://www.jianshu.com/c/V2CqjW?utm_medium=index-collections&utm_source=desktop

通过观察,我们可以发现网页中的文章并没有分页,而是通过下拉滚动条js生成下一页

我们可以进入开发者工具观察得知,每次拉到网页的最后都会多一条请求,仔细观察它们之间是存在着一定的规律的

它们都是https://www.jianshu.com/c/V2CqjW?order_by=added_at&page={}这样的格式,改变的值只是page中的数字,是否这就是我们所需要的页码呢,可以通过访问途中链接验证。

现在我们已经取得所需要的链接,便可写出循环的代码,

但是我们并不知道具体有多少页,这时,我们通过观察网页以及网页源码,可以发现

在专题下面有收录了多少篇文章的字样,即我们只需要获取到共有多少篇文章再除以每页多少篇文章即可得出总页数。分析源码可以轻松找到

然后我们就可以写出以下代码来获取它的页数

注意,由于网页的安全性问题,直接使用requests,get(url)是无法获取到简书网页的源码的,所以我们要加上浏览器信息

获取方法

接着,编写代码

headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36‘
    }
def getPageN():
    url = ‘https://www.jianshu.com/c/V2CqjW?utm_medium=index-collections&utm_source=desktop‘
    resp = requests.get(url, headers=headers)
    html_content = resp.text  # 得到网页内容
    soup = BeautifulSoup(html_content, ‘lxml‘)  # 开始解析
    info = soup.select(‘.info‘)[0].text
    pagenumber=int(info[info.find(‘收录了‘):].split()[0].lstrip(‘收录了‘).rstrip(‘篇文章‘))
    a = len(soup.find_all(‘a‘, class_=‘title‘))
    page = pagenumber//a+1
    return page

第二步:取出一个文章列表页的全部文章

观察网页源码可知道每篇文章的具体链接是

最后通过循环获得所有文章的链接

def getListPage(pageUrl):
    res = requests.get(pageUrl,headers=headers)
    html_content = res.text
    soup = BeautifulSoup(html_content, ‘lxml‘)

    newslist = []
    for i in range(len(soup.find_all(‘a‘, class_=‘title‘))):
        Url = soup.find_all(‘a‘, class_=‘title‘)[i].attrs[‘href‘]
        newsUrl = "https://www.jianshu.com" + Url
        newslist.append(getNewsDetail(newsUrl))

    return(newslist)

  第三步:获得一篇文章的全部内容,并进行分析

def getNewsDetail(newsUrl):   #一篇文章的全部内容
    resd = requests.get(newsUrl,headers=headers)
    html_content = resd.text
    soupd = BeautifulSoup(html_content, ‘lxml‘)

    news = {}
    news[‘标题‘] = soupd.select(‘.title‘)[0].text
    news[‘作者‘] = soupd.select(‘.name‘)[0].text
    news[‘时间‘] = datetime.strptime(soupd.select(‘.publish-time‘)[0].text.rstrip(‘*‘), ‘%Y.%m.%d %H:%M‘)
    news[‘字数‘] = soupd.select(‘.wordage‘)[0].text.lstrip(‘字数 ‘)
    # news[‘内容‘] = soupd.select(‘.show-content-free‘)[0].text.strip()
    news[‘链接‘] = newsUrl
    content= soupd.select(‘.show-content-free‘)[0].text.strip()
    writeNewsDetail(content)
    return(news)

到这里,基本的爬取工作已经完成了

3.把数据保存成文本:

def writeNewsDetail(content):
    f = open(‘content.txt‘,‘a‘,encoding=‘utf-8‘)
    f.write(content)
    f.close()

以及生成excel表格

import pandas
df = pandas.DataFrame(newstotal)
df.to_excel(‘简书数据.xlsx‘)

4.生成词云:

file = codecs.open(‘content.txt‘, ‘r‘, ‘utf-8‘)
image=np.array(Image.open(‘ditu.jpg‘))
font=r‘C:\Windows\Fonts\AdobeHeitiStd-Regular.otf‘
word=file.read()
#去掉英文,保留中文
resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\‘\:\;\‘\,\[\]\.\<\>\/\?\~\!\@\#\\\&\*\%]", "",word)
wordlist_after_jieba = jieba.cut(resultword, cut_all = True)

wl_space_split = " ".join(wordlist_after_jieba)

# 设置停用词
stopwords = set(STOPWORDS)
stopwords.add("一个")
my_wordcloud = WordCloud(font_path=font,mask=image,stopwords=stopwords,background_color=‘white‘,max_words = 2000,max_font_size = 100,random_state=50).generate(wl_space_split)
#根据图片生成词云
iamge_colors = ImageColorGenerator(image)
#my_wordcloud.recolor(color_func = iamge_colors)
#显示生成的词云
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
#保存生成的图片,当关闭图片时才会生效,中断程序不会保存
my_wordcloud.to_file(‘result.jpg‘)

生成的词云图片:

5.遇到的问题:

1、文章总页数只能爬取到200页,再继续爬取下去出现的只是重复的数据,没有找到解决办法,但是对于练习而言,两百页的数据也足够了。

2、安装词云遇到的问题

 解决办法:

 通过阅读其他博客寻找到的解决办法

在https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 中下载对应python版本和window 32/64位版本

因为我电脑的python版本是3.6,32位系统,所以下载 wordcloud?1.4.1?cp36?cp36m?win32.whl文件并把文件放在D盘

cmd命令行进入对应wordcloud安装路径,我是放在F盘,所以进入D:输入 pip install  wordcloud?1.4.1?cp36?cp36m?win32.whl  即可成功导入

最后,手动为pycharm添加lib,手动找到wordCloud安装路径,复制到C:\User\  -  \PycharmProjects\**\verv\lib 中即可,(**表示自己创建的项目名字)

6.完整代码:

import re
import requests
import pandas
from bs4 import BeautifulSoup
from datetime import datetime
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import codecs
import numpy as np
from PIL import Image

headers = {
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36‘
    }

def writeNewsDetail(content):
    f = open(‘content.txt‘,‘a‘,encoding=‘utf-8‘)
    f.write(content)
    f.close()

def getNewsDetail(newsUrl):   #一篇文章的全部内容
    resd = requests.get(newsUrl,headers=headers)
    html_content = resd.text
    soupd = BeautifulSoup(html_content, ‘lxml‘)

    news = {}
    news[‘标题‘] = soupd.select(‘.title‘)[0].text
    news[‘作者‘] = soupd.select(‘.name‘)[0].text
    news[‘时间‘] = datetime.strptime(soupd.select(‘.publish-time‘)[0].text.rstrip(‘*‘), ‘%Y.%m.%d %H:%M‘)
    news[‘字数‘] = soupd.select(‘.wordage‘)[0].text.lstrip(‘字数 ‘)
    # news[‘内容‘] = soupd.select(‘.show-content-free‘)[0].text.strip()
    news[‘链接‘] = newsUrl
    content= soupd.select(‘.show-content-free‘)[0].text.strip()
    writeNewsDetail(content)
    return(news)

def getListPage(pageUrl):
    res = requests.get(pageUrl,headers=headers)
    html_content = res.text
    soup = BeautifulSoup(html_content, ‘lxml‘)

    newslist = []
    for i in range(len(soup.find_all(‘a‘, class_=‘title‘))):
        Url = soup.find_all(‘a‘, class_=‘title‘)[i].attrs[‘href‘]
        newsUrl = "https://www.jianshu.com" + Url
        newslist.append(getNewsDetail(newsUrl))

    return(newslist)

def getPageN():
    url = ‘https://www.jianshu.com/c/V2CqjW?utm_medium=index-collections&utm_source=desktop‘
    resp = requests.get(url, headers=headers)
    html_content = resp.text  # 得到网页内容
    soup = BeautifulSoup(html_content, ‘lxml‘)  # 开始解析
    info = soup.select(‘.info‘)[0].text
    pagenumber=int(info[info.find(‘收录了‘):].split()[0].lstrip(‘收录了‘).rstrip(‘篇文章‘))
    a = len(soup.find_all(‘a‘, class_=‘title‘))
    page = pagenumber//a+1
    return page

newstotal = []
firstPageUrl=‘https://www.jianshu.com/c/V2CqjW?utm_medium=index-collections&utm_source=desktop‘
newstotal.extend(getListPage(firstPageUrl))
for i in range(2,201):
    listPageUrl=‘https://www.jianshu.com/c/V2CqjW?order_by=added_at&page={}‘.format(i)
    newstotal.extend(getListPage(listPageUrl))

df = pandas.DataFrame(newstotal)
df.to_excel(‘简书数据.xlsx‘)

file = codecs.open(‘content.txt‘, ‘r‘, ‘utf-8‘)
image=np.array(Image.open(‘ditu.jpg‘))
font=r‘C:\Windows\Fonts\AdobeHeitiStd-Regular.otf‘
word=file.read()
#去掉英文,保留中文
resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\‘\:\;\‘\,\[\]\.\<\>\/\?\~\!\@\#\\\&\*\%]", "",word)
wordlist_after_jieba = jieba.cut(resultword, cut_all = True)

wl_space_split = " ".join(wordlist_after_jieba)

# 设置停用词
stopwords = set(STOPWORDS)
stopwords.add("一个")
my_wordcloud = WordCloud(font_path=font,mask=image,stopwords=stopwords,background_color=‘white‘,max_words = 2000,max_font_size = 100,random_state=50).generate(wl_space_split)
#根据图片生成词云
iamge_colors = ImageColorGenerator(image)
#my_wordcloud.recolor(color_func = iamge_colors)
#显示生成的词云
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
#保存生成的图片,当关闭图片时才会生效,中断程序不会保存
my_wordcloud.to_file(‘result.jpg‘)

7.数据分析与结论

通过对爬取的数据分析可以发现:产品、用户、数据、信息、分析、平台、市场、服务、应用、价值、内容等关键词尤为重要。

这些关键词也是互联网行业中值得注意的,例如通过数据信息等分析人们的需求等,是当今互联网行业中重要的一环,

所以通过爬虫获取信息进行有效分析也显得尤为重要。

原文地址:https://www.cnblogs.com/h228/p/8971986.html

时间: 2024-08-13 19:25:42

python爬虫(以简书为例)的相关文章

[译] 12步轻松搞定python装饰器 - 简书

body { font-family: Microsoft YaHei UI,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bo

Python抓取简书的热门文章

原理和上章获取段子一样,只不过是换了解析的内容. 代码: #-*- coding: utf-8 -*- import urllib2 import re def GetPageContent(page_url,heads): try: req = urllib2.Request(page_url,headers=heads) resp = urllib2.urlopen(req) return resp.read().decode('utf8') except Exception, e: pri

Python 2.7_发送简书关注的专题作者最新一篇文章及连接到邮件_20161218

最近看简书文章关注了几个专题作者,写的文章都不错,对爬虫和数据分析都写的挺好,因此想到能不能获取最新的文章推送到Ipad网易邮箱大师.邮件发送代码封装成一个函数,从廖雪峰大神那里学的  http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000 网页源码获取和解析获取文章标题和url依然是用

简谈-Python爬虫破解JS加密的Cookie

通过Fiddler抓包比较,基本可以确定是JavaScript生成加密Cookie导致原来的请求返回521. 发现问题: 打开Fiddler软件,用浏览器打开目标站点(http://www.kuaidaili.com/proxylist/2/) .可以发现浏览器对这个页面加载了两次,第一次返回521,第二次才正常返回数据.很多没有写过网站或是爬虫经验不足的童鞋,可能就会觉得奇怪为什么会这样?为什么浏览器可能正常返回数据而代码却不行? 仔细观察两次返回的结果可以发现: 1.第二次请求比第一次请求的

Python 2.7_多进程获取简书专题数据(一)

学python几个月了正好练练手,发现问题不断提高,先从专题入手,爬取些数据,一开始对简书网站结构不熟悉,抓取推荐,热门,城市3个导航栏,交流发现推荐和热门是排序不同,url会重复,以及每个专题详情页三个类目最新评论,最新收录, 热门也会重复 做了下调整,代码执行完毕会返回所有专题的urls元组对象,以便下一步进入每个专题页面解析获取其他数据.注:变量focus关注数,和打开专题后最上面显示的专题关注人数会有差异,例如有的专题关注了10175人,在专题列表页会显示成"10.07k",因

SuperSpider(简书爬虫JAVA版)

* 建站数据SuperSpider(简书)* 本项目目的:* 为练习web开发提供相关的数据:* 主要数据包括:* 简书热门专题模块信息.对应模块下的热门文章.* 文章的详细信息.作者信息.* 评论区详细信息.评论者信息等...* 最后存储mysql数据库. 想学习爬虫的同学也可以瞧瞧 整个项目跑完花了近十个小时, 足见数据之多, 个人web开发练习用来充当建站数据也是绰绰有余的(手动嘚瑟) 代码注释写的挺详细的,我就直接上代码了. 主要代码: 1 ? 2 3 /** 4 * 此类对简书文章内容

【Python爬虫】听说你又闹书荒了?豆瓣读书9.0分书籍陪你过五一

说明 五一将至,又到了学习的季节.目前流行的各大书单主打的都是豆瓣8.0评分书籍,却很少有人来聊聊这9.0评分的书籍长什么样子.刚好最近学了学python爬虫,那就拿豆瓣读书来练练手. 爬虫 本来思路是直接爬豆瓣的书籍目录,将评分9.0以上的书筛选出来,一打开发现事情并不简单,几千万本书可不好爬 = =,于是转化一下思路,看有没有类似的书单. 一搜还真有,找到一个9.0评分的榜单,大大减少了工作量,这样就不用先爬一下整站书籍来筛选了.看了看榜单,应该是某位好心的书友手工整理的,更新时间为2018

jsoup爬虫简书首页数据做个小Demo

昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固,比如java反射注解,知道一点就是说不出来,很尴尬- 生命不止,学习不止啊 之前那个项目 QNews 用的是的第三方的数据平台,所以访问次数会有限制,这就很无奈... 我的博客地址 每天只能请求100次-.但是LZ这个穷屌丝也买不起服务器,所以就上网查,有什么别的方法可以获取数据,意外之间发现了jsoup这个强大的框架,就花了上午时间学习了一下,然后下午做了一个小Demo,功能比较单一,请见谅

【凯子哥带你学Android】Andriod性能优化之列表卡顿——以“简书”APP为例

这几天闲得无聊,就打开手机上的开发者模式里面的"GPU过度绘制"功能,看看别家的App做的咋样,然后很偶然的打开了"简书",然后就被它的过度绘制惊呆了,于是写了这篇性能分析的文章,从一个只有APK文件的角度,说下如何寻找布局中可能存在的性能问题,以及解决方案.本文章以简书Android最新版本1.9.1进行分析. GPU过度绘制 Hierarchy View SysTrace TraceView 总结 分析资源下载 GPU过度绘制 首先打开下面两个功能开关 开发者模