简书python_python爬虫(以简书为例)

1.主题:

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

2.实现过程:

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

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

1022979-20180429200348910-1436120284.jpg

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

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

1022979-20180429201112975-1826606403.jpg

1022979-20180429201138317-1993006380.jpg

1022979-20180429201148588-1598225089.jpg

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

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

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

1022979-20180429201718832-668037571.jpg

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

1022979-20180429202056874-2075406432.jpg

1022979-20180429202105190-677844094.jpg

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

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

获取方法

1022979-20180429202838450-374369521.jpg

接着,编写代码

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'}

defgetPageN():

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

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

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

1022979-20180429203530428-1954558420.jpg

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

defgetListPage(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.把数据保存成文本:

defwriteNewsDetail(content):

f= open('content.txt','a',encoding='utf-8')

f.write(content)

f.close()

1022979-20180429204217126-59766020.jpg

以及生成excel表格

importpandas

df=pandas.DataFrame(newstotal)

df.to_excel('简书数据.xlsx')

1022979-20180429204419919-1937334422.jpg

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')

生成的词云图片:

1022979-20180429204713557-1487354620.jpg

1022979-20180429204740508-1570143550.jpg

5.遇到的问题:

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

2、安装词云遇到的问题

1022979-20180429205321705-1037175602.jpg

解决办法:

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

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

1022979-20180429205539461-1038055136.jpg

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

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

1022979-20180429210239623-935087353.jpg

6.完整代码:

importreimportrequestsimportpandasfrom bs4 importBeautifulSoupfrom datetime importdatetimeimportjiebaimportmatplotlib.pyplot as pltfrom wordcloud importWordCloud, STOPWORDS, ImageColorGeneratorimportcodecsimportnumpy as npfrom PIL importImage

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'}defwriteNewsDetail(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)defgetListPage(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)defgetPageN():

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

returnpage

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.数据分析与结论:

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值