如何遍历URL列表抓取对应页面内容存入数组,需用Selenium还是BS4
工具选择判断
- 若你要抓取的文本是页面静态渲染内容(直接打开URL右键查看页面源码就能找到对应文本):不需要用Selenium,
requests+BeautifulSoup4(BS4)完全可以满足需求,如果目标页面直接返回纯文本,甚至不需要BS4解析。 - 若你要抓取的文本是JavaScript动态渲染生成的(页面源码里找不到,需要等页面加载完成才会出现):才需要用到Selenium模拟浏览器运行获取内容。
实现方案(静态页面场景,常规需求通用)
你现有代码存在语法错误:print(client_id, client_description_link)会抛出变量未定义异常,这两个字段是存在你构造的holdAllThis字典中,需要从字典取值。
以下是完整的遍历URL、抓取内容、存入列表的实现代码:
import requests import json from bs4 import BeautifulSoup import time # 读取本地JSON文件 with open('_files/TestFile2.json', 'r') as f: file_contents = json.load(f) result_list = [] # 自定义请求头,避免被网站反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } for x in file_contents['merchandiseData']: # 构造基础信息结构 item = { 'client_id': x['clientID'], 'client_description_link': x['url'], 'page_content': '' # 预留字段存储抓取到的页面内容 } try: # 发起请求,设置10秒超时 resp = requests.get(item['client_description_link'], headers=headers, timeout=10) resp.encoding = resp.apparent_encoding # 自动识别编码避免乱码 # 解析页面提取目标文本,可根据实际页面结构修改定位规则 soup = BeautifulSoup(resp.text, 'lxml') # 示例如果目标文本在id为target_text的div标签里,可修改为:soup.find('div', id='target_text').get_text(strip=True) item['page_content'] = soup.get_text(strip=True) print(f"客户端ID{item['client_id']} 内容抓取完成") except Exception as e: print(f"客户端ID{item['client_id']} 抓取失败,错误信息:{str(e)}") item['page_content'] = '抓取失败' result_list.append(item) # 增加1秒请求间隔,避免请求频率过高被封IP time.sleep(1) # 单独提取所有页面内容生成独立数组 all_page_content = [i['page_content'] for i in result_list] # 输出结果 print(result_list) print(all_page_content)
如果不需要解析HTML结构,目标页面返回的就是纯文本,可以把BS4解析的部分直接替换为item['page_content'] = resp.text即可。
动态页面场景实现(Selenium版本)
需要提前安装Selenium库和对应浏览器的驱动,示例代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import json import time # 读取本地JSON文件 with open('_files/TestFile2.json', 'r') as f: file_contents = json.load(f) # 配置浏览器无头模式(不弹出浏览器窗口) chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") driver = webdriver.Chrome(options=chrome_options) result_list = [] for x in file_contents['merchandiseData']: item = { 'client_id': x['clientID'], 'client_description_link': x['url'], 'page_content': '' } try: driver.get(item['client_description_link']) # 等待页面加载,也可以替换为显式等待定位目标元素提升效率 time.sleep(2) # 示例提取页面body文本,可根据需求修改元素定位规则 item['page_content'] = driver.find_element('tag name', 'body').text.strip() except Exception as e: print(f"客户端ID{item['client_id']} 抓取失败:{str(e)}") item['page_content'] = '抓取失败' result_list.append(item) driver.quit() print(result_list)
内容的提问来源于stack exchange,提问作者user1176783
相关产品推荐
相关产品推荐

