【Python网络爬虫三】 爬取网页新闻

学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下。写了一个爬门户网站新闻的程序

 

需求:

从门户网站爬取新闻,将新闻标题,作者,时间,内容保存到本地txt中。

 

用到的python模块:

1 import re  # 正则表达式
2 import bs4  # Beautiful Soup 4 解析模块
3 import urllib2  # 网络访问模块
4 import News   #自己定义的新闻结构
5 import codecs  #解决编码问题的关键 ,使用codecs.open打开文件
6 import sys   #1解决不同页面编码问题

其中bs4需要自己装一下,安装方法可以参考:Windows命令行下pip安装python whl包

 

程序:

 1 #coding=utf-8
 2 import re  # 正则表达式
 3 import bs4  # Beautiful Soup 4 解析模块
 4 import urllib2  # 网络访问模块
 5 import News   #自己定义的新闻结构
 6 import codecs  #解决编码问题的关键 ,使用codecs.open打开文件
 7 import sys   #1解决不同页面编码问题
 8 
 9 reload(sys)                         # 2
10 sys.setdefaultencoding('utf-8')     # 3
11 
12 # 从首页获取所有链接
13 def GetAllUrl(home):
14     html = urllib2.urlopen(home).read().decode('utf8')
15     soup = bs4.BeautifulSoup(html, 'html.parser')
16     pattern = 'http://\w+\.baijia\.baidu\.com/article/\w+'
17     links = soup.find_all('a', href=re.compile(pattern))
18     for link in links:
19         url_set.add(link['href'])
20 
21 def GetNews(url):
22     global NewsCount,MaxNewsCount  #全局记录新闻数量
23     while len(url_set) != 0:
24         try:
25             # 获取链接
26             url = url_set.pop()
27             url_old.add(url)
28 
29             # 获取代码
30             html = urllib2.urlopen(url).read().decode('utf8')
31 
32             # 解析
33             soup = bs4.BeautifulSoup(html, 'html.parser')
34             pattern = 'http://\w+\.baijia\.baidu\.com/article/\w+'  # 链接匹配规则
35             links = soup.find_all('a', href=re.compile(pattern))
36 
37             # 获取URL
38             for link in links:
39                 if link['href'] not in url_old:
40                     url_set.add(link['href'])
41 
42                     # 获取信息
43                     article = News.News()
44                     article.url = url  # URL信息
45                     page = soup.find('div', {'id': 'page'})
46                     article.title = page.find('h1').get_text()  # 标题信息
47                     info = page.find('div', {'class': 'article-info'})
48                     article.author = info.find('a', {'class': 'name'}).get_text()  # 作者信息
49                     article.date = info.find('span', {'class': 'time'}).get_text()  # 日期信息
50                     article.about = page.find('blockquote').get_text()
51                     pnode = page.find('div', {'class': 'article-detail'}).find_all('p')
52                     article.content = ''
53                     for node in pnode:  # 获取文章段落
54                         article.content += node.get_text() + '\n'  # 追加段落信息
55 
56                     SaveNews(article)
57 
58                     print NewsCount
59                     break
60         except Exception as e:
61             print(e)
62             continue
63         else:
64             print(article.title)
65             NewsCount+=1
66         finally:
67             # 判断数据是否收集完成
68             if NewsCount == MaxNewsCount:
69                 break
70 
71 def SaveNews(Object):
72     file.write(""+Object.title+""+"\t")
73     file.write(Object.author+"\t"+Object.date+"\n")
74     file.write(Object.content+"\n"+"\n")
75 
76 url_set = set()  # url集合
77 url_old = set()  # 爬过的url集合
78 
79 NewsCount = 0
80 MaxNewsCount=3
81 
82 home = 'http://baijia.baidu.com/'  # 起始位置
83 
84 GetAllUrl(home)
85 
86 file=codecs.open("D:\\test.txt","a+") #文件操作
87 
88 for url in url_set:
89     GetNews(url)
90     # 判断数据是否收集完成
91     if NewsCount == MaxNewsCount:
92         break
93 
94 file.close()

新闻文章结构

 1 #coding: utf-8
 2 # 文章类定义
 3 class News(object):
 4     def __init__(self):
 5         self.url = None
 6         self.title = None
 7         self.author = None
 8         self.date = None
 9         self.about = None
10         self.content = None

 

对爬取的文章数量就行统计。

 

posted @ 2017-01-08 19:09  SeeKHit  阅读(9558)  评论(1编辑  收藏  举报