You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打开网页中的多个链接并抓取对应页面数据?

嘿,我来帮你搞定这个多链接抓取的问题!先梳理下你现有代码里的小问题,再给你靠谱的实现方案~

如何批量处理网页链接并抓取页面数据

先说说你原代码里的几个小问题

  • urls 定义有误:末尾的逗号让它变成了元组,而且注释掉的链接格式也不对,正确的列表应该是 urls = ['链接1', '链接2', ...] 这种形式
  • 混用工具不合理:Scrapy是专门的异步爬虫框架,自带请求和解析能力,不需要手动用urlopen读取内容,也没必要调用浏览器打开页面(浏览器是给人看的,爬虫只需要获取页面源码就够啦)
  • start_requests 方法不符合Scrapy规范:这个方法应该返回Scrapy的Request对象,而不是自己手动去处理链接

方案1:纯Scrapy批量爬取(推荐,爬虫常规操作)

这个方案完全利用Scrapy的异步特性,高效爬取多个链接的数据,不需要打开浏览器:

import scrapy

class ForumSpider(scrapy.Spider):
    name = "forum"
    
    # 定义要爬取的所有目标链接
    start_urls = [
        'https://tribune.com.pk/',
        'https://www.siasat.pk/forum/content.php/',
        'http://hamariweb.com/news/',
        'https://www.urdupoint.com/pakistan/all-news/'
    ]

    def parse(self, response):
        # 这里写解析页面数据的逻辑,示例抓取页面标题
        self.logger.info(f"正在解析页面: {response.url}")
        
        page_title = response.xpath('//title/text()').get()
        if page_title:
            # 把爬取到的数据返回,后续可以保存到文件/数据库
            yield {
                'page_url': response.url,
                'page_title': page_title.strip()
            }
        
        # 如果需要抓取页面内的其他子链接(比如新闻详情页),可以在这里继续生成请求
        # 示例:
        # for detail_link in response.xpath('//a/@href').getall():
        #     yield response.follow(detail_link, callback=self.parse_detail_page)

    # 可选:如果有详情页需要单独解析,写对应的回调函数
    # def parse_detail_page(self, response):
    #     # 解析详情页的具体内容,比如新闻正文
    #     news_content = response.xpath('//div[@class="content"]/text()').getall()
    #     yield {
    #         'detail_url': response.url,
    #         'content': ' '.join(news_content).strip()
    #     }

运行方式

在终端执行这条命令,爬取结果会自动保存到results.json文件里:

scrapy crawl forum -o results.json

方案2:如果确实需要打开浏览器(仅用于调试,不推荐爬虫使用)

要是你因为调试需求必须打开浏览器查看页面,可以结合webbrowser,但注意这会让爬虫变成同步操作,效率会降低:

import webbrowser
import scrapy

class ForumSpider(scrapy.Spider):
    name = "forum"
    start_urls = [
        'https://tribune.com.pk/',
        'https://www.siasat.pk/forum/content.php/',
        'http://hamariweb.com/news/',
        'https://www.urdupoint.com/pakistan/all-news/'
    ]

    def parse(self, response):
        # 打开当前页面的浏览器窗口
        webbrowser.open(response.url)
        self.logger.info(f"已打开浏览器页面: {response.url}")
        
        # 继续解析页面数据
        page_title = response.xpath('//title/text()').get()
        if page_title:
            yield {
                'page_url': response.url,
                'page_title': page_title.strip()
            }

关键提醒

  • Scrapy的核心优势就是异步请求、自动去重、重试机制这些,是批量爬取的最佳选择,尽量不要和urlopen这类工具混用
  • 如果遇到动态渲染的页面(比如内容靠JS加载),webbrowser也搞不定,这时候可以用Selenium或Playwright这类工具模拟真实浏览器,但那是更进阶的场景啦

内容的提问来源于stack exchange,提问作者Umair Hanif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:13:52