Python爬虫-爬取国外新闻网站标题和文本信息

下面展示一些 内联代码片

前言

爬虫的基本原理

种子 URL:爬虫从一个或多个种子 URL 开始,这些 URL 是起点。
发送请求:爬虫向这些种子 URL 发送 HTTP 请求,通常是 GET 请求。
获取响应:服务器返回网页的 HTML 内容作为响应。
解析内容:爬虫解析 HTML 内容,提取所需的数据(如文本、链接、图片等)。
提取链接:从网页中提取出所有链接,并将这些链接加入待访问队列。
重复过程:爬虫重复上述步骤,直到达到某个停止条件,如爬取了一定数量的页面,或所有页面都被爬取完毕。
爬虫的分类

通用爬虫

设计用于抓取整个互联网的大量网页。搜索引擎(如 Google、Bing)的爬虫就是通用爬虫。

聚焦爬虫

专注于特定主题或领域,抓取相关网页。比如,一个新闻爬虫只抓取新闻网站的内容。

增量爬虫

仅抓取自上次爬取以来发生变化或更新的网页,适用于动态内容更新频繁的网站。

爬虫的合法性和道德

在编写和运行爬虫时,必须遵循以下原则:

遵守网站的 robots.txt:

大多数网站都有一个 robots.txt 文件,规定了哪些页面允许被爬取,哪些不允许。爬虫应当尊重这些规则。

避免过度抓取:

设置适当的抓取频率,避免对服务器造成过大负担。
尊重版权和隐私:

不应抓取或使用受版权保护的内容,或涉及用户隐私的数据。
获取许可:

在某些情况下,最好获得网站管理员的许可,特别是当你打算频繁地抓取大量数据时。
通过以上方法和原则,可以编写高效、可靠且合规的网络爬虫来满足数据采集的需求。

参考链接:
链接: link

侦察

打开页面
在这里插入图片描述
选取你要爬取的时间区间的网页
可以看到我所选的日期是fromDate=01.01.2012&toDate=31.12.2021

在这里插入图片描述
在这里插入图片描述
后面的看代码里面的内容吧,我的目的是为了爬取网站内的标题、日期和文章内容,标题爬取是比较简单的,但是每个标题网页内的内容还是需要不断进入到网页内部去抓取,这时候就要写内部网页网址的for循环,见于源代码:

源代码

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import requests
import os
import pandas as pd

# 自定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'
}

# 爬取单个页面的数据
def scrape_news_titles_and_dates(session, url):
    try:
        response = session.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查HTTP请求是否成功
        soup = BeautifulSoup(response.text, 'html.parser')

        # 查找标题和日期
        data = []
        title_tags = soup.find_all('div', class_='searchTl')
        date_tags = soup.find_all('div', class_='searchDate')

        for title_tag, date_tag in zip(title_tags, date_tags):
            title = title_tag.get_text(strip=True)
            date = date_tag.get_text(strip=True)
            if title and date:
                data.append((title, date))

        return data
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {url} - {e}")
        return []

# 主爬取逻辑
def scrape_multiple_pages(start_page, end_page, base_url, output_file):
    all_data = []
    output_dir = "output"
    os.makedirs(output_dir, exist_ok=True)

    with requests.Session() as session:
        for page in range(start_page, end_page + 1):
            current_url = f"{base_url}&page={page}"
            print(f"正在爬取第 {page} 页...")
            page_data = scrape_news_titles_and_dates(session, current_url)
            all_data.extend(page_data)

            # 每爬取10页,保存一次数据
            if page % 10 == 0 or page == end_page:
                print(f"保存第 {start_page} 到第 {page} 页的数据...")
                df = pd.DataFrame(all_data, columns=["News Titles", "Date"])
                df.to_excel(output_file, index=False)
                print(f"已保存到 {output_file}")

    print(f"爬取完成,总共爬取到 {len(all_data)} 条新闻数据。")

# 示例调用
if __name__ == "__main__":
    base_url = "输入你要爬取我网址,可选择翻页"
    output_file = "output/news_titles_and_dates.xlsx"
    start_page = 60
    end_page = 100

    scrape_multiple_pages(start_page, end_page, base_url, output_file)

项目效果

在这里插入图片描述
在这里插入图片描述

要用Python进行文本分类,你需要先爬取一些文本数据,并对其进行预处理。一般来说,文本数据的预处理包括以下步骤: 1. 读取文本数据 2. 分词 3. 去除停用词 4. 提取特征 5. 训练模型 6. 对新数据进行分类 下面是一个简单的示例,演示如何用Python爬取文本数据并进行分类: ```python import requests from bs4 import BeautifulSoup import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB # 网页爬取 url = "https://news.sina.com.cn/china/" response = requests.get(url) html = response.content.decode("utf-8") soup = BeautifulSoup(html, "html.parser") # 获取新闻标题 news_list = soup.find_all("a", href=True) titles = [] for news in news_list: title = news.text.strip() if title: titles.append(title) # 分词去除停用词 stop_words = ["的", "了", "", "是"] corpus = [] for title in titles: words = jieba.cut(title) words = [word for word in words if word not in stop_words] corpus.append(" ".join(words)) # 特征提取模型训练 vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(corpus) y = ["china"] * len(titles) clf = MultinomialNB() clf.fit(X, y) # 预测新标题的类别 new_title = "新冠病毒疫苗开始接种" new_words = jieba.cut(new_title) new_words = [word for word in new_words if word not in stop_words] new_corpus = [" ".join(new_words)] new_X = vectorizer.transform(new_corpus) predicted = clf.predict(new_X) print(predicted[0]) ``` 在这个例子中,我们首先使用requestsBeautifulSoup库爬取了新浪网的中国新闻页面。然后我们对每个新闻标题进行了分词去除停用词的处理。接着,我们使用TfidfVectorizer进行特征提取,并用MultinomialNB训练了一个朴素贝叶斯分类器。最后,我们使用这个分类器对一个新的标题进行了分类,输出了它属于“china”类别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值