如何使用Scrapy框架爬取www.baidu.com上的动态渲染新闻页面,提取每个新闻的标题(title)和链接(href),并将数据保存为CSV文件?
时间: 2024-12-18 15:19:43 浏览: 4
【Scrapy爬虫项目】爬取books.toscrape.com上书籍的相关信息并存储为csv文件
使用Scrapy框架爬取动态渲染的网站,如www.baidu.com上的新闻页面,通常需要以下步骤:
1. 安装Scrapy和相关的中间件:首先确保已经安装了Scrapy及其依赖库,如`lxml`或`cssselect`用于解析HTML。
```bash
pip install scrapy lxml cssselect
```
2. 创建新的Scrapy项目:运行命令创建一个新的Scrapy项目并进入该项目目录。
```bash
scrapy startproject baidu_news_crawler
cd baidu_news_crawler
```
3. 设计 spiders:在`spiders`文件夹下创建一个Python文件(例如`baidunews_spider.py`),定义Spider类,并配置开始URL和解析规则。
```python
# baidunews_spider.py
import scrapy
class BaiduNewsSpider(scrapy.Spider):
name = "baidu_news"
start_urls = ['http://news.baidu.com/']
def parse(self, response):
# 使用Selector或XPath选择器找到动态加载的内容区域
dynamic_content_selector = '.dynamic-content'
# 遍历每个新闻元素
for news_item in response.css(dynamic_content_selector):
title = news_item.css('h2 a::text').get() # 提取标题
href = news_item.css('h2 a::attr(href)').get() # 提取链接
yield {
'title': title,
'link': href,
}
# 分析响应中是否有分页链接或更多请求的迹象,并追加请求
next_page = response.css('.next-page a::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
```
4. 配置settings.py:允许Scrapy处理JavaScript(如果网页是通过JS加载内容的话),并设置保存CSV文件的路径。
```python
settings.py
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
'myproject.middlewares.RandomUserAgentMiddleware': 400,
}
ITEM_PIPELINES = {'myproject.pipelines.CSVPipeline': 300}
CSV_FILE_PATH = 'output/news_data.csv'
```
5. 编写中间件RandomUserAgentMiddleware:提供随机User-Agent以防止被识别为机器人。
6. 创建pipelines.py:定义CSVPipeline,将抓取的数据保存到CSV文件。
```python
pipelines.py
import csv
class CSVPipeline(object):
def open_spider(self, spider):
self.file = open(spider.settings['CSV_FILE_PATH'], 'w', newline='', encoding='utf-8')
self.writer = csv.DictWriter(self.file, fieldnames=['title', 'link'])
self.writer.writeheader()
def process_item(self, item, spider):
self.writer.writerow(item)
return item
def close_spider(self, spider):
self.file.close()
```
7. 运行爬虫:在命令行中输入以下命令启动爬虫。
```bash
scrapy crawl baidu_news
```
爬虫会开始抓取指定的URL,并按照设定的方式提取标题和链接,将结果保存到名为`news_data.csv`的CSV文件中。注意,实际操作中可能会遇到反爬机制、动态加载延迟等问题,需视具体情况调整。
阅读全文