爬取前的准备:

  • BeautifulSoup的导入:pip install BeautifulSoup4
  • requests的导入:pip install requests
  • 下载jupyter notebook:pip install jupyter notebook
  • 下载python,配置环境(可使用anocanda,里面提供了很多python模块)

json

  • 定义 :是一种格式,用于数据交换。

Javascript 对象

  • 定义 : 一种javascript的引用类型

中文格式除了‘ utf-8 ’还有‘ GBK ’、‘ GB2312 ’ 、‘ ISO-8859-1 ’、‘ GBK ‘’等

用requests可获取网页信息

用BeautifulSoup可以将网页信息转换为可操作物块

 soup = BeautifulSoup(res.text,'html.parser')
# 将requests获取的网页信息转换为BeautifulSoup的物件存于soup中,并指明其剖析器为'html.parser',否则会出现警告。

用beautifulSoup中的select方法可以获取相应的元素,且获取的元素为list形式,可以用for循环将其逐个解析出来

 alink = soup.select('h1')

 for link in alink:
print(link.text)

获取html标签值后,可以用[‘href’]获取‘href’属性的值,如

 for link in soup.select('a'):
 print(link['href'])

获取新闻编号:

* .strip()可以去除前后空白格,括号内加入字符串可以去除指定字符串,rstrip()可以去除右边的,lstrip()可以去除左边的;

*  split('/')根据指定的字符对字符串进行切割

re正则表达式的使用:

 import re

 m = re.search(' doc-i(.*).shtml ',newsurl)  # 返回在newsurl中匹配到的字符串
print(m.group(1))  # group(0)可以取得所有匹配到的部分,group(1)只可以取得括号内的部分

使用for循环获取新闻的多页链接

 url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1501000415111'

 for i in rannge(0,10):
  print( url.format( i ) )
# format可以将url里面的大括号(要修改的部分我们把它删去并换成大括号)换为我们要加入的值(如上面代码中的 i)

获取新闻发布的时间:

  获取的信息可能会有包含的成分,即会获取到如出版社的其他我们不需要的元素,可以用contents将里面的元素分离成list形式,用contents[0]即可获取相应元素

 # 获取出版时间
from datetime import datetime res = requests.get('http://news.sina.com.cn/c/nd/2017-07-22/doc-ifyihrmf3191202.shtml')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')
timesource = soup.select('.time-source')
print(timesource[0].contents[0])

  时间字符串转换 

 # 字符串转时间:-strptime
dt = datetime.strptime(timesource,'%Y年%m月%d日%H:%M ’) # 时间转换字符串:-strftime
dt.strftime('%Y-%m-%d‘)

获取新闻内文:

  检查其所属类后按照上面的 select 获取新闻内文,获取的内容为list形式,可用for循环将内容去除标签后加入到自己创建的的list中(如article = [])

  * 其中可以用 ‘ \n ’.join( article ) 将article列表中的每一项用换行符‘ \n ’分隔开;

 # 获取单篇新闻内容
article = []
for p in soup.select('.article p'):
article.append(p.text.strip())
print('\n'.join(article))

  上面获取单篇新闻的代码可用一行完成:

 # 一行完成上面获取新闻内容的代码
print('\n'.join([p.text.strip() for p in soup.select('.article p')]))

获取评论数量:(在获取评论数量时会发现评论是用js的形式发送给浏览器的,所以要先把获取的内容转化为json格式读取python字典

 # 取得评论数的数量
import requests
import json
comment = requests.get('http://comment5.news.sina.com.cn/page/info?version=1&format=js&c\
hannel=gn&newsid=comos-fyihrmf3218511&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20')  # 从评论地址获取相关内容
comment.encoding = 'utf-8'
jd = json.loads(comment.text.strip('var data='))
jd['result']['count']['total']

完整代码(以获取新浪新闻为例)

 # 获取新闻的标题,内容,时间和评论数
import requests
from bs4 import BeautifulSoup
from datetime import datetime
import re
import json
import pandas def getNewsdetial(newsurl):
res = requests.get(newsurl)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')
newsTitle = soup.select('.page-header h1')[0].text.strip()
nt = datetime.strptime(soup.select('.time-source')[0].contents[0].strip(),'%Y年%m月%d日%H:%M')
newsTime = datetime.strftime(nt,'%Y-%m-%d %H:%M')
newsArticle = getnewsArticle(soup.select('.article p'))
newsAuthor = newsArticle[-1]
return newsTitle,newsTime,newsArticle,newsAuthor
def getnewsArticle(news):
newsArticle = []
for p in news:
newsArticle.append(p.text.strip())
return newsArticle # 获取评论数量 def getCommentCount(newsurl):
m = re.search('doc-i(.+).shtml',newsurl)
newsid = m.group(1)
commenturl = 'http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20'
comment = requests.get(commenturl.format(newsid)) #将要修改的地方换成大括号,并用format将newsid放入大括号的位置
jd = json.loads(comment.text.lstrip('var data='))
return jd['result']['count']['total'] def getNewsLinkUrl():
# 得到异步载入的新闻地址(即获得所有分页新闻地址)
urlFormat = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1501000415111'
url = []
for i in range(1,10):
res = requests.get(urlFormat.format(i))
jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');'))
url.extend(getUrl(jd)) #entend和append的区别
return url def getUrl(jd):
# 获取每一分页的新闻地址
url = []
for i in jd['result']['data']:
url.append(i['url'])
return url # 取得新闻时间,编辑,内容,标题,评论数量并整合在total_2中
def getNewsDetial():
title_all = []
author_all = []
commentCount_all = []
article_all = []
time_all = []
url_all = getNewsLinkUrl()
for url in url_all:
title_all.append(getNewsdetial(url)[0])
time_all.append(getNewsdetial(url)[1])
article_all.append(getNewsdetial(url)[2])
author_all.append(getNewsdetial(url)[3])
commentCount_all.append(getCommentCount(url))
total_2 = {'a_title':title_all,'b_article':article_all,'c_commentCount':commentCount_all,'d_time':time_all,'e_editor':author_all}
return total_2 # ( 运行起始点 )用pandas模块处理数据并转化为excel文档 df = pandas.DataFrame(getNewsDetial())
df.to_excel('news2.xlsx')

存储的excel文档如下:

TIPS:

问题:在jupyter notebook导入pandas时可能会出现导入错误

解决:不要用命令行打开jupyter notebook,直接找到软件打开或者在Anocanda Navigator中打开

2017-07-29  21:49:37

Python_网络爬虫(新浪新闻抓取)的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  3. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

    通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...

  4. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

    这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. ...

  5. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  6. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup

    开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...

  7. java网络爬虫实现信息的抓取

    转载请注明出处:http://blog.csdn.NET/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点 ...

  8. python网络爬虫 新浪博客篇

    上次写了一个爬世纪佳缘的爬虫之后,今天再接再厉又写了一个新浪博客的爬虫.写完之后,我想了一会儿,要不要在博客园里面写个帖子记录一下,因为我觉得这份代码的含金量确实太低,有点炒冷饭的嫌疑,就是把上次的代 ...

  9. 网络爬虫-使用Python抓取网页数据

    搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...

随机推荐

  1. webpack实用配置

    前面的话 上文介绍了webpack入门,本文将详细介绍webpack实用配置 版本号 以entry.js打包为bundle.js为例,出口的filename可以设置为[id].[name].[hash ...

  2. python 算法 -- 冒泡排序

    python 排序算法 -- 冒泡排序 原理 从数组的底部开始, 两两比较大小, 小的在下,大的在上, 依次类推直到顶部. 当整个数组比较完毕, 则最上面的一定是最大值(此即冒泡的由来); 当第一轮比 ...

  3. ionic 项目中创建侧边栏的具体流程分4步简单学会

    这是在学习ionic时,当时遇到的一些问题,觉得很难,就记笔记下来了,现在觉得如果可以拿来分享,有可能会帮助到遇到同样问题的人 ionic slidemenu 项目流程: cd pretices(自己 ...

  4. Go - concurrency

    并发 vs 并行 首先,我们先来搞清楚概念以及并发和并行的区别. 并发 - 利用时间片切换来实现“同时”运行的. 并行 - 利用CPU的多核来实现通过多线程来实现同时运行. Go 语言的设计理念就是通 ...

  5. linux下vim 查找命令

    在命令模式下输入/word 这个是查找文件中“word”这个单词,是从文件上面到下面查找?word 这个是查找文件中“word”这个单词,是从文件下上面到面查找

  6. Swift数组的存取与修改

    对数组的存取与修改可以通过数组的方法和属性来进行,或者使用数组的下标语法. 要知道数组中元素的数量,可以查看它的只读属性count: println("The shopping list c ...

  7. 【Android Developers Training】 7. 添加Action Buttons

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 29. 从Activity获得结果

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 21. 创建一个可变动的UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  10. [转]浅谈C++指针直接调用类成员函数

    找了一番之后发现这篇文章讲的很清楚. 传送门