爬取学校新闻网站文章

本文介绍了使用Python爬虫抓取学校新闻网站的过程,包括获取新闻目录、提取每篇文章的日期和标题、按日期限制爬取范围、获取详细信息如作者、正文和浏览数。在实施过程中遇到的一个问题是新闻浏览数无法直接爬取,原因是该数据通过Ajax动态加载。

爬取学校新闻网站文章

爬取思路

第一步,用requests获取新闻目录的网页源码。

def get_page(url):   #页面源代码
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        print("Fail to get page")
        
url = "http://news.fzu.edu.cn/html/fdyw/" + str(offset) + ".html"
html = get_page(url)

第二步,获取每一篇文章的url,并先提取日期、标题

def get_articles(html, new_list):
    doc = pq(html)
    articles = doc('.list_main_content li')
    
get_articles(html, new_list)

第三步,通过日期限制爬取范围,并对每一则新闻的url发起get请求

if new["date"][:4
### 使用 Python 进行网络爬虫的具体步骤 以下是使用 Python 编写网络爬虫程序来获取学校官网新闻的主要步骤: #### 1. 导入必要的库 为了完成爬取任务,通常需要导入一些常用的第三方库。这些库可以帮助处理 HTTP 请求、解析 HTML 页面以及保存数据。 ```python import requests from bs4 import BeautifulSoup import os ``` 这里 `requests` 库用于发送 HTTP 请求[^1],而 `BeautifulSoup` 是一个强大的工具,可以用来解析网页内容并提取所需的信息[^2]。 --- #### 2. 发送请求 通过向目标网站发送 GET 或 POST 请求,获取其响应内容。这一步骤的关键在于设置合适的 User-Agent 和其他头部信息,以模拟浏览器行为。 ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = requests.get('https://example.school/news', headers=headers) if response.status_code == 200: html_content = response.text else: print(f"Failed to retrieve data: {response.status_code}") ``` 此代码片段展示了如何构建带有自定义头文件的请求,并验证服务器返回的状态码是否正常[^3]。 --- #### 3. 解析 HTML 文档 一旦成功接收到了 HTML 响应,则需将其传递给 BeautifulSoup 对象以便进一步分析结构化数据。 ```python soup = BeautifulSoup(html_content, 'html.parser') news_items = soup.find_all('div', class_='news-item') # 替换为实际标签名和类名 ``` 上述例子假设每条新闻发布在一个具有特定 CSS 类名为 `.news-item` 的 `<div>` 中。如果实际情况不同,请调整查找条件匹配真实情况下的 DOM 结构。 --- #### 4. 提取消息细节 遍历找到的所有项目节点,逐一读取出标题、链接以及其他感兴趣字段的数据项。 ```python for item in news_items[:10]: # 只选取前十个消息作为示范 title_tag = item.find('h2').find('a') # 调整路径至具体位置 time_info = item.select_one('.date-time').text.strip() article_title = title_tag['title'] if 'title' in title_tag.attrs else title_tag.text full_link = f"https://example.school{title_tag['href']}" print({ "Title": article_title, "Time": time_info, "Link": full_link }) ``` 注意这里的属性访问方式可能依据源站点的设计有所变化;另外还演示了相对 URL 向绝对形式转换的过程[^2]。 --- #### 5. 访问详情页面 对于某些需求而言,仅收集列表概览还不够充分——还需要深入到各个文章内部去挖掘更多深层次资料。这就涉及到二次跳转操作。 ```python def fetch_detail(url): detail_resp = requests.get(url, headers=headers) detail_soup = BeautifulSoup(detail_resp.content, features="lxml") body_text = "" paragraphs = detail_soup.find('article').findAll('p') for p in paragraphs: body_text += "\n" + p.getText() return {"Content": body_text} details_data = [] for link in links_list: details_data.append(fetch_detail(link)) ``` 以上函数实现了针对单篇文章正文部分的抓取逻辑[^3]。 --- #### 6. 数据存储 最后考虑将所得成果妥善保管起来供后续查阅或者分享用途。可以选择多种格式比如 CSV 文件、JSON 字符串甚至是数据库记录等方式存盘。 ```python output_dir = './school_news/' os.makedirs(output_dir, exist_ok=True) with open(os.path.join(output_dir,'all_articles.json'),'w+',encoding='utf-8') as json_file: json.dump(complete_results,json_file ,ensure_ascii=False ) ``` 确保创建目录时不会因为重复命名引发错误,并且指定编码参数防止中文乱码现象发生[^1]。 --- ### 注意事项 在整个开发过程中需要注意遵守 Robots 协议尊重对方服务条款限制频率避免造成负担等问题之外也要记得异常捕获机制提高健壮性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值