网页新闻抓取(网站相当于一个图结构的解决方法和解决办法(一) )

优采云 发布时间: 2021-09-26 04:37

  网页新闻抓取(网站相当于一个图结构的解决方法和解决办法(一)

)

  哪里

  标签。

  3.编写程序,调试运行。

  这里使用了 Python 的 urllib 和 Beautifulsoup 包。

  我使用python3。3和2在语法上有一些差异,但大体逻辑是一样的。

  urllib负责url的处理,主要是request、parse、error这些模块。负责向url发送请求,获取页面信息,处理错误。

  Beautifulsoup 负责解析页面。获取到的页面是一个html树状结构,通过findAll()、select()、get()、get_text()等函数可以很方便的获取到我们想要的内容。

  4.最后,如果要获取整个portal网站的数据,需要一些递归。整个网站相当于一个图结构,dfs(深度优先遍历)是更好的方法。

  关于爬虫程序的编写,一些烦人的点:

  (1)不同页面的url不一样。门户越大网站,分类越多,总会出现一些没见过也没有考虑过的情况。有时在判断程序不全面,会报错;同样,一些新闻文本页面的页面标签和布局不一样,很难用一种提取方法提取,对于上述问题,我们需要在程序中写更多的情况来处理if错误,防止爬行时报错并终止;

  (2) 编码问题,这是我遇到的最难的问题,尤其是爬行的时候,想抓取新闻保存在txt中,可能有些页面有很特殊的字符,无法编解码,经常会导致程序意外终止 解决办法:对于极少数难以处理的网站,在源头过滤掉,在取数据的时候,往往不会关心一两页数据。

  还有人告诉我python爬虫的特点是:简单,暴力,和python语言风格一样。

  #coding: utf-8

import codecs

from urllib import request, parse

from bs4 import BeautifulSoup

import re

import time

from urllib.error import HTTPError, URLError

import sys

###新闻类定义

class News(object):

def __init__(self):

self.url = None #该新闻对应的url

self.topic = None #新闻标题

self.date = None #新闻发布日期

self.content = None #新闻的正文内容

self.author = None #新闻作者

###如果url符合解析要求,则对该页面进行信息提取

def getNews(url):

#获取页面所有元素

html = request.urlopen(url).read().decode('utf-8', 'ignore')

#解析

soup = BeautifulSoup(html, 'html.parser')

#获取信息

if not(soup.find('div', {'id':'artical'})): return

news = News() #建立新闻对象

page = soup.find('div', {'id':'artical'})

if not(page.find('h1', {'id':'artical_topic'})): return

topic = page.find('h1', {'id':'artical_topic'}).get_text() #新闻标题

news.topic = topic

if not(page.find('div', {'id': 'main_content'})): return

main_content = page.find('div', {'id': 'main_content'}) #新闻正文内容

content = ''

for p in main_content.select('p'):

content = content + p.get_text()

news.content = content

news.url = url #新闻页面对应的url

f.write(news.topic+'\t'+news.content+'\n')

##dfs算法遍历全站###

def dfs(url):

global count

print(url)

pattern1 = 'http://news\.ifeng\.com\/[a-z0-9_\/\.]*$' #可以继续访问的url规则

pattern2 = 'http://news\.ifeng\.com\/a\/[0-9]{8}\/[0-9]{8}\_0\.shtml$' #解析新闻信息的url规则

#该url访问过,则直接返回

if url in visited: return

print(url)

#把该url添加进visited()

visited.add(url)

# print(visited)

try:

#该url没有访问过的话,则继续解析操作

html = request.urlopen(url).read().decode('utf-8', 'ignore')

# print(html)

soup = BeautifulSoup(html, 'html.parser')

if re.match(pattern2, url):

getNews(url)

# count += 1

####提取该页面其中所有的url####

links = soup.findAll('a', href=re.compile(pattern1))

for link in links:

print(link['href'])

if link['href'] not in visited:

dfs(link['href'])

# count += 1

except URLError as e:

print(e)

return

except HTTPError as e:

print(e)

return

# print(count)

# if count > 3: return

visited = set() ##存储访问过的url

f = open('ifeng/news.txt', 'a+', encoding='utf-8')

dfs('http://news.ifeng.com/')

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线