python爬虫(抓取百度新闻列表)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lenovo403/article/details/50720953

一、python请求要抓取的url页面

要抓取的url http://news.baidu.com/ ,先python模拟请求该url

#!/usr/bin/python
# -*- coding:utf-8 -*-

import httplib


class NewsBaidu(object):
	
	def __init__(self):
		super(NewsBaidu,self).__init__()
		
	def request(self):
			conn = httplib.HTTPConnection('news.baidu.com')  #请求的host
			request_url = '/'                                #请求的网页路径
			body = ''										 #请求的参数
			headers = {}									 #请求所带的头信息,该参数是一个字典 								
			conn.request('GET',request_url,body,headers)
			result = conn.getresponse()
			print u'获取百度新闻'
			print result.status
			print result.reason
			
if __name__ == '__main__':
	nb = NewsBaidu()
	nb.request()

运行效果


status =200 ,表示请求成功 ,result.read() 

二、分析页面HTML

1、我们要抓取的内容,百度新闻左侧的列表的标题、href



2、加载re模块,正则匹配出我们要的内容, 我们先看看HTML样式


这是我们要抓取的上面一部分页面HTML,我们可以看到  <a href="http://www.gov.cn/zhengce/2016-02/22/content_5044753.htm" target="_blank" class="a3" mon="ct=1&amp;a=1&amp;c=top&amp;pn=1">总理发话 科技成果将堂堂正正走出"深闺"</a>   ,包含我们想要的内容, 【总理发话 科技成果将堂堂正正走出"深闺"】   和href这部分的内容 【http://www.gov.cn/zhengce/2016-02/22/content_5044753.htm】  用正则提取出来

pattern = re.compile(r'<strong>.*?href="(.*?)" target="_blank" class="a3" mon="ct=1&a=1&c=top&pn=[0-9]+">(.*?)</a>.*?strong>',re.S)

下面一部分要抓取的HTML内容,我就不再分析,原理都一样。

三、源码

#!/usr/bin/python
# -*- coding:utf-8 -*-

import httplib
import urllib
import re

class NewsBaidu(object):
	
	def __init__(self):
		super(NewsBaidu,self).__init__()
		self.f = open(u'百度新闻.txt','a')
		
	def request(self):
		try:
			conn = httplib.HTTPConnection('news.baidu.com')  #请求的host
			request_url = '/'                                #请求的网页路径
			body = ''										 #请求的参数
			headers = {}									 #请求所带的头信息,该参数是一个字典 								
			conn.request('GET',request_url,body,headers)
			result = conn.getresponse()
			print u'获取百度新闻'
			print result.status
			print result.reason
			#print result.read()
			if result.status == 200:
				data = result.read()
				self.main(data)
		except Exception,e:
			print e
		finally:
			conn.close()
			self.f.close()
	
		
		
	def main(self,data):
		
		print u'获取中...'
		pattern = re.compile(r'<strong>.*?href="(.*?)" target="_blank" class="a3" mon="ct=1&a=1&c=top&pn=[0-9]+">(.*?)</a>.*?strong>',re.S)
		items = re.findall(pattern,data)
		content = ''
		for item in items:
			content +=item[1].strip()+'\t'+item[0].strip()+'\t\n'
		
		pattern = re.compile(r'<a href="(.*?)" target="_blank"  mon="r=1">(.*?)</a>',re.S)
		items = re.findall(pattern,data)
		for item in items:
			pattern = re.compile(r'^http://.*<a href="(.*)$',re.S)         #url 对某些url再次正则获取
			url = re.findall(pattern,item[0])
			if url:
				u = url[0]
			else :
				u = item[0]
			content +=item[1].strip()+'\t'+u.strip()+'\t\n'	
		
		
		pattern = re.compile(r'<a href="(.*?)" mon="ct=1&a=2&c=top&pn=[0-9]+" target="_blank">(.*?)</a>',re.S)
		items = re.findall(pattern,data)
		del items[0]
		for item in items:
			content +=item[1].strip()+'\t'+item[0].strip()+'\t\n'
		self.f.write(content)
		print u'完成'
		
if __name__ == '__main__':
	nb = NewsBaidu()
	nb.request()




展开阅读全文

没有更多推荐了,返回首页