网站分析

为了方便爬取,所以选择了手机版的简版网易新闻网址。
获取新闻链接列表的网址为http://3g.163.com/touch/article/list/BA8J7DG9wangning/1-40.html
其中1-40表示获取列表的当前页数,爬取列表时只需修改页数即可。

爬取过程

获取新闻链接地址

使用requests包读取新闻列表页面,然后使用正则表达式提取出其中的新闻页面链接,返回urls列表

def getList(url):
li = requests.get(url)
res = r'url":"http:.*?.html'
urls = re.findall(res,li.text)
for i in range(len(urls)):
urls[i] = urls[i][6:]
return urls

获取新闻内容

使用requests获取到新闻页面的内容,然后使用BeautifulSoup包解析web内容。

def getNews(url):
url = url[:-5]+"_0.html"
ss = requests.get(url)
soup = BeautifulSoup(ss.text,"html.parser")
title = soup.title.string[:-6].encode('utf-8')
time = soup.find("div","about").contents[0][9:].encode('utf-8')
type = soup.find("div","position lBlue").contents[3].string.encode('utf-8')
content = soup.find("div","content").get_text()[1:-1].encode('utf-8')
news = News(title,time,type,content)
return news

手机简版新闻通常把一个新闻分成几个页面显示,导致爬取内容很麻烦。经过分析发现,在新闻链接地址后加_0即可显示全部新闻内容,所以先处理一下链接地址。然后使用requests获取web页面,再用BeautifulSoup提取新闻的标题,时间,类别和内容。

将结果保存

def saveAsTxt(news):
file = open('E:/news.txt','a')
file.write("标题:" + news.title +
"\t时间:" + news.time +
"\t类型:"+ news.type +
"\t内容:"+ news.content +
"\"\n")

运行程序

程序代码

# encoding: utf-8
import requests
import re
from bs4 import BeautifulSoup
import time

class News:
def __init__(self,title,time,type,content):
self.title = title #新闻标题
self.time = time #新闻时间
self.type = type #新闻类别
self.content = content #新闻内容

def getList(url): #获取新闻链接地址
li = requests.get(url)
res = r'url":"http:.*?.html' #正则表达式获取链接地址
urls = re.findall(res,li.text)
for i in range(len(urls)):
urls[i] = urls[i][6:]
return urls

def getNews(url): #获取新闻内容
url = url[:-5]+"_0.html" #处理链接获取全文
ss = requests.get(url)
soup = BeautifulSoup(ss.text,"html.parser") #获取新闻内容,注意编码
title = soup.title.string[:-6].encode('utf-8')
time = soup.find("div","about").contents[0][9:].encode('utf-8')
# type = soup.find("div","position lBlue").contents[3].string.encode('utf-8')
content = soup.find("div","content").get_text()[1:-1].encode('utf-8')
news = News(title,time,type,content)
return news

def saveAsTxt(news): #保存新闻内容
file = open('E:/news.txt','a')
file.write("标题:" + news.title +
"\t时间:" + news.time +
# "\t类型:"+ news.type +
"\t内容:"+ news.content +
"\"\n")

start = time.clock()
sum = 0
for i in range(1,40):
wangzhi = "http://3g.163.com/touch/article/list/BA8J7DG9wangning/%s-40.html" %i
urls = getList(wangzhi)
sum = sum + len(urls)
# print "当前页解析出 %s 条" %len(urls)
j = 1
for url in urls:
print "正在读取第%s页第%s/%s条:%s" %(i,j,len(urls),url.encode('utf-8'))
news = getNews(url)
saveAsTxt(news)
j = j + 1
end = time.clock()
print "共爬取%s条新闻,耗时%f s" %(sum,end - start)

执行结果


程序运行的时间主要和页面打开的速度有关,若网速理想的话程序运行还是挺快的。

该程序还属于入门级的爬虫,代理ip池以及多线程效率问题都没有涉及到。但是如果附加上你需要这些后续处理,比如
有效地存储(数据库应该怎样安排)
有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)
有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛…
及时更新(预测这个网页多久会更新一次)
如你所想,这里每一个点都可以供很多研究者十数年的研究。(知乎:谢科)

附录

requests文档
Beautiful Soup 4.4.0 文档

更多相关文章

  1. 简单的python爬取网页字符串内容并保存
  2. 从0开始的Python学习019更多的Python内容2
  3. Python MOOC简单获取网页内容并以html格式保存在本地
  4. python爬取csdn的博客内容
  5. Linux 查询文件内容重复数 uniq
  6. linux文件系统内容
  7. linux清空日志文件内容 比如log日志
  8. 是否遇到过MySQL workbench text字段不能直接放入json格式内容
  9. 写SQL语句,如何找到部分字段内容一样的两条记录?实现调货的功能

随机推荐

  1. 浅谈C#中的早期绑定和后期绑定
  2. C语言中的运算符优先级(代码示例)
  3. 浅谈.Net中的浅拷贝和深拷贝
  4. c语言标识符有哪些
  5. C语言中printf,sprintf和fprintf的区别是
  6. Ruby如何生成随机数
  7. 为什么安全编码标准很重要
  8. 如何编写C程序?C程序的基本编写规则
  9. 什么是C#接口
  10. c语言中什么是转义字符