使用Scrapy对新浪微博热搜榜的前50条信息进行爬取 必须使用yield item语句 每一行代码都要详细注释 并详细给出要怎么展示运行爬出内容
时间: 2024-10-08 22:05:55 浏览: 53
Scrapy爬取新浪微博用户信息、用户微博及其微博评论转发
5星 · 资源好评率100%
首先,让我们了解如何使用 Scrapy 爬虫库对微博热搜榜进行爬取。Scrapy 是一个强大的 Python 网络爬虫框架,非常适合这种任务。下面是一个详细的步骤和示例代码:
```python
# 导入所需的模块
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
# 创建一个新的 Scrapy Spider 类
class WeiboHotNewsSpider(CrawlSpider):
# 定义爬虫名称和起始URL
name = 'weibo_hot_news'
start_urls = ['http://hot.weibo.com']
# 设置自定义 User-Agent 避免被网站识别为机器人
custom_settings = {
'USER_AGENT': UserAgent().random,
}
# 设定提取规则
rules = (
# 通过 LinkExtractor 提取所有 href 为 '/topic/' 的链接作为待抓取页面
Rule(LinkExtractor(re.compile(r'/topic/\d+')), callback='parse_item', follow=True),
)
def parse_item(self, response):
"""
解析每个页面获取热搜榜信息并存储为Item
"""
# 将响应对象转换为BeautifulSoup以便解析HTML
soup = BeautifulSoup(response.text, 'lxml')
# 找到包含热搜信息的区域(假设是class为"list-timeline")
hot_topics = soup.select('.list-timeline')
for topic in hot_topics:
# 提取每一条的信息(如标题、链接等)
title = topic.find('a', class_='title').text.strip() # 标题
link = response.urljoin(topic.find('a', class_='title')['href']) # 链接
# 创建一个临时字典保存数据
item_data = {
'title': title,
'link': link,
}
# 使用 yield item 来生成Item实例,并传入数据
yield scrapy.Item(data=item_data)
# 如果还有下一页,继续追加请求(假设分页链接在'a.next'上)
next_page = response.css('a.next::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse_item) # 跟随下一个链接
def closed(self, reason):
"""
爬虫关闭时,可以在这里做一些清理工作,例如打印已爬取的条目数
"""
print(f"Crawling stopped. Total items crawled: {self.crawler.stats.get_value('item_scraped_count')}")
# 运行爬虫
if __name__ == "__main__":
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess()
process.crawl(WeiboHotNewsSpider)
process.start() # 启动爬虫
```
运行这个爬虫后,它会依次抓取每一页的热搜信息,并将数据存储为一个个`scrapy.Item`对象。你可以选择直接在命令行中查看这些 Item 对象,或者稍作修改,将它们存入数据库或者CSV文件,甚至通过 Flask 或 Django 构建一个简单的Web应用来展示。
阅读全文