网络爬虫学习(三)

网络爬虫学习(三)


1、抓取内文资料

(1)打开每条链接,内文包括:标题、内文、时间来源、评论和编辑。


(2)取得内文页面

开发者工具--->检查---->Network--->重载---->Doc,找到对应的链接。


import requests
from bs4 import BeautifulSoup
res=requests.get('http://news.sina.com.cn/c/nd/2017-03-25/doc-ifycspxn9729572.shtml')
res.encoding='utf-8'
print (res.text)
soup=BeautifulSoup(res.text,'html.parser')

通过上面代码可以提取到内容


(3)抓取标题

通过检测工具----->观察元素---->选择标题---->看到标题标签为artibodyTitle。


抓取命令为:soup.select('#artibodyTitle')[0].text

标题抓取结果为:


(4)来源与时间



抓取命令:soup.select('.time-source')[0]


处理来源与时间

  • 取得时间

	timesource=soup.select('.time-source')[0].contents[0].strip()
	timesource

  • 取得来源

	medianame=soup.select('.time-source span a')[0].text
	medianame



时间字符串转换

	from datetime import datetime

  • 字符串转时间--strptime

		dt=datetime.strptime(timesource,'%Y年%m月%d日%H:%M')
		dt

  • 时间转字符串

		dt.strftime('%Y-%m-%d')



2、取得内文


(1)将每一个段落加到list中

	article=[]
	for p in soup.select('#artibody p')[:-1]:
			article.append(p.text.strip())
	' '.join(article)

简短写法

	' '.join([p.text.strip() for p in soup.select('artibody p')[:-1] ])


3、取得编辑名称


抓取命令为:

	editor=soup.select('.article-editor')[0].text.strip('责任编辑:')
	editor


4、取得评论数


抓取命令:soup.select('#commentCount1')

没有抓取到想要的结果


找寻评论出处




命令为:(找到Headers中的链接拷贝过来即可)

	import json
	comments=requests.get('http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=gn&newsid=comos-fycspxn9729572&group=&
		compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20&jsvar=loader_1490417383395_65805650')

取得评论数与评论内容

	jd=json.loads(comments.text.strip('var data='))
	jd['result']['count']['total']


由于评论数是实时变化的,所以数字也是变化的


如何取得新闻编号


	newsurl='http://news.sina.com.cn/c/nd/2017-03-25/doc-ifycspxn9729572.shtml'
	newsid=newsurl.split('/')[-1].rstrip('.shtml').lstrip('doc-i')
	newsid

抓取中间的部分


抓取结果


如何取得新闻编号(使用正则表达式)

	import re
	m=re.search('doc-i(.*).shtml',newsurl)
	print (m.group(1))



5、将抓取评论数方法整理成一函式

commentURL=

函式定义:

def  getCommentCount(newsurl):
	m=re.search('doc-i(.*).shtml',newsurl)
	newsid=m.group(1)
	comments=requests.get(commentURL.format(newsid))
	jd=json.loads(comments.text.strip('var data='))
	return jd['result']['count']['total']


6、将抓取内文信息方法整理成一函式

import requests
from bs4 import BeautifulSoup
def getNewsDetail(newsurl):
	result={}
	res=requests.get(newsurl)
	res.encoding='utf-8'
	soup=BeautifulSoup(res.text,'html.parser')
	result['title']=soup.select('#artibodyTitle')[0].text
	result['newssource']=soup.select('time-source span a')[0].text
	timesource=soup.select('.time-source')[0].contents[0].strip()
	result['dt']=datetime.strptime(timesource,'%Y年%m月%d日%H:%M')
	result['article']=' '.join([p.text.strip() for p in soup.select('#artibody p')[:-1]])
	result['editor']=soup.select('.article-editor')[0].text.strip('责任编辑:')
	result['comments']=getCommentCount(newsurl)
	return result


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值