• 【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() + '
    '  # 追加段落信息
    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+""+"	")
    73     file.write(Object.author+"	"+Object.date+"
    ")
    74     file.write(Object.content+"
    "+"
    ")
    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

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

  • 相关阅读:
    4章 关键的“构建”决策
    [转]EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接
    5章 软件构建中的设计
    网站收集,慢慢积攒
    常见的SQL优化建议
    eclipse 最全快捷键 分享快乐与便捷
    设置Activity全屏和无标题
    Anaroid WebView详解大全
    cordova2.2对于CordovaWebView的配置
    在Android的webview中定制js的alert,confirm和prompt对话框的方法
  • 原文地址:https://www.cnblogs.com/SeekHit/p/6262534.html
Copyright © 2020-2023  润新知