爬取全部的校园新闻

作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3002

作业要求:

从新闻url获取点击次数,并整理成函数

  • newsUrl
  • newsId(re.search())
  • clickUrl(str.format())
  • requests.get(clickUrl)
  • re.search()/.split()
  • str.lstrip(),str.rstrip()
  • int
  • 整理成函数
  • 获取新闻发布时间及类型转换也整理成函数

1.从新闻url获取新闻详情: 字典,anews

2.从列表页的url获取新闻url:列表append(字典) alist

3.生成所页列表页的url并获取全部新闻 :列表extend(列表) allnews

*每个同学爬学号尾数开始的10个列表页

4.设置合理的爬取间隔

import time

import random

time.sleep(random.random()*3)

5.用pandas做简单的数据处理并保存

保存到csv或excel文件 

newsdf.to_csv(r'F:\duym\爬虫\gzccnews.csv')

作业详情:

 

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://www.gzcc.cn/')

 

 

 

 

 
 

 

转载于:https://www.cnblogs.com/-hui/p/10710804.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值