Python_网络爬虫(新浪新闻抓取)
爬取前的准备:
- 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_网络爬虫(新浪新闻抓取)的更多相关文章
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据
网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格
通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码
这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. ...
- iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据
网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup
开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...
- java网络爬虫实现信息的抓取
转载请注明出处:http://blog.csdn.NET/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点 ...
- python网络爬虫 新浪博客篇
上次写了一个爬世纪佳缘的爬虫之后,今天再接再厉又写了一个新浪博客的爬虫.写完之后,我想了一会儿,要不要在博客园里面写个帖子记录一下,因为我觉得这份代码的含金量确实太低,有点炒冷饭的嫌疑,就是把上次的代 ...
- 网络爬虫-使用Python抓取网页数据
搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...
随机推荐
- webpack实用配置
前面的话 上文介绍了webpack入门,本文将详细介绍webpack实用配置 版本号 以entry.js打包为bundle.js为例,出口的filename可以设置为[id].[name].[hash ...
- python 算法 -- 冒泡排序
python 排序算法 -- 冒泡排序 原理 从数组的底部开始, 两两比较大小, 小的在下,大的在上, 依次类推直到顶部. 当整个数组比较完毕, 则最上面的一定是最大值(此即冒泡的由来); 当第一轮比 ...
- ionic 项目中创建侧边栏的具体流程分4步简单学会
这是在学习ionic时,当时遇到的一些问题,觉得很难,就记笔记下来了,现在觉得如果可以拿来分享,有可能会帮助到遇到同样问题的人 ionic slidemenu 项目流程: cd pretices(自己 ...
- Go - concurrency
并发 vs 并行 首先,我们先来搞清楚概念以及并发和并行的区别. 并发 - 利用时间片切换来实现“同时”运行的. 并行 - 利用CPU的多核来实现通过多线程来实现同时运行. Go 语言的设计理念就是通 ...
- linux下vim 查找命令
在命令模式下输入/word 这个是查找文件中“word”这个单词,是从文件上面到下面查找?word 这个是查找文件中“word”这个单词,是从文件下上面到面查找
- Swift数组的存取与修改
对数组的存取与修改可以通过数组的方法和属性来进行,或者使用数组的下标语法. 要知道数组中元素的数量,可以查看它的只读属性count: println("The shopping list c ...
- 【Android Developers Training】 7. 添加Action Buttons
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 29. 从Activity获得结果
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 21. 创建一个可变动的UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- [转]浅谈C++指针直接调用类成员函数
找了一番之后发现这篇文章讲的很清楚. 传送门