Python爬虫爬取网站新闻

网站分析

为了方便爬取,所以选择了手机版的简版网易新闻网址。
获取新闻链接列表的网址为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)

执行结果

Python爬虫爬取网站新闻_第1张图片
程序运行的时间主要和页面打开的速度有关,若网速理想的话程序运行还是挺快的。

Python爬虫爬取网站新闻_第2张图片

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

附录

requests文档
Beautiful Soup 4.4.0 文档

你可能感兴趣的:(Python爬虫爬取网站新闻)