爬取前的准备:

  • 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. 原生和jQuery的ajax用法

    jQuery的ajax方法: $.ajax({ url:'/comm/test1.php', type:'POST', //GET async:true, //或false,是否异步 data:{ n ...

  2. php实现获取汉字的首字母

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. Hibernate入门(三)

    一 Hibernate生成器类 Hibernate中,标签id中的generator标签用于生成持久化类对象的唯一标识.所有的生成器类都实现了org.hibernate.id.IdentifierGe ...

  4. [0] AssemblyInfo.cs文件介绍

    AssemblyInfo.cs文件:包含程序版本.信息.版权的属性文件 先介绍AssemblyInfo.cs文件中的程序集属性 内容: using System.Reflection;using Sy ...

  5. 用Nodejs做一个简单的小爬虫

    Nodejs将JavaScript语言带到了服务器端,作为js主力用户的前端们,因此获得了服务器端的开发能力,但除了用express搭建一个博客外,还有什么好玩的项目可以做呢?不如就做一个网络爬虫吧. ...

  6. 支付宝即时到账DEMO配置与使用

    支付宝网页即时到账功能,可让用户在线向开发者的支付宝账号支付资金,交易资金即时到账,帮助开发者快速回笼资金. 当用户进行支付操作时候可以直接跳转到支付宝支付页面进行支付 1. 准备 关于支付宝签约即时 ...

  7. B. Karen and Coffee

    B. Karen and Coffee time limit per test 2.5 seconds memory limit per test 512 megabytes input standa ...

  8. PHP完成一个日历

    今天我们就用php中的数组合date 做一个日历. 先让我们回顾一下PHP里面的date . 1.时间戳:表示从计算机元年/UNIX纪年(0时区 1970/1/1 00:00:00)到当前事件的秒数. ...

  9. js模版引擎开发实战以及对eval函数的改进

    简介 前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用,同时也算是之前学习的知识的一种总结吧! 首先我们先了解一下模版引擎的工作原理吧! 1. 模版引擎其实就是将指定标签的内容根 ...

  10. ES6中的export以及import的使用多样性

    模块功能主要由两个命令构成:export和import.export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能. 一.export导出模块使用部分的几种方式 一个模块就是一 ...