python爬虫网易新闻 爬取500条新闻的标题 时间 关键词 题目 链接 详细内容包含图片等详细信息 并导入到csv中 给出具体详细的示范代码 并解析
时间: 2024-10-02 08:01:05 浏览: 47
在Python中,我们可以使用requests库来发送HTTP请求获取网页内容,BeautifulSoup库来解析HTML并提取所需的数据,然后将结果保存到CSV文件。以下是使用`requests`, `BeautifulSoup`, 和 `pandas` 库的一个示例代码,用于爬取网易新闻的500条新闻数据:
```python
import requests
from bs4 import BeautifulSoup
import csv
import time
# 定义函数来抓取一条新闻的信息
def fetch_news(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
title = soup.find('h2', class_='title').text.strip()
pub_time = soup.find('time')['datetime']
keywords = soup.find('div', class_='keywords').text.strip() if soup.find('div', class_='keywords') else ''
link = soup.find('a')['href']
content = soup.find('div', class_='articalContent').text.strip()
# 图片链接通常不在纯文本中,这里假设没有直接图片链接
img_url = None
return title, pub_time, keywords, link, content, img_url
# 主函数
def main():
base_url = "https://news.163.com/"
start_url = base_url + "?cat=all"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
news_data = []
for i in range(500): # 指定抓取500篇文章
page_num = str(i // 10 + 1)
url = f"{start_url}&page={page_num}"
try:
response = requests.get(url, headers=headers)
time.sleep(1) # 避免太快请求导致封IP,设置合理的延时
extracted_data = fetch_news(url)
news_data.append(extracted_data)
print(f"第{i+1}篇文章已抓取:{title}")
except Exception as e:
print(f"抓取第{i+1}篇文章时发生错误:{e}")
break
# 导入数据到CSV文件
with open('news.csv', 'w', newline='', encoding='utf-8-sig') as csvfile:
fieldnames = ['Title', 'Publish Time', 'Keywords', 'Link', 'Content', 'Image URL']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(news_data)
if __name__ == "__main__":
main()
```
注意:
1. 实际运行此代码时,由于网络限制、网站结构变化等因素,可能无法获取所有500条新闻,也可能无法直接获取图片URL,因为大部分网站会隐藏或加密它们。
2. 如果网站有反爬机制,如需要登录或频繁请求导致封锁,可能需要进一步处理,例如使用Selenium模拟浏览器或设置代理服务器。
3. CSV文件中关于图片的部分(`img_url`),在上述示例中并未抓取到,实际操作中如果需要图片链接,可能需要解析HTML的更深层次结构。
阅读全文