【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
对爬取的文章数量就行统计。