下面展示一些 内联代码片
。
前言
爬虫的基本原理
种子 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)
项目效果