Python爬虫抓取EAN编码全部输出在同一行,代码哪里存在问题?
问题根因与修复方案
核心问题
你当前输出为单行的根本原因是:file.write()方法不会自动在写入内容末尾追加换行符,你每次抓取到的EAN直接连续写入文件,自然会拼接成一整行。
另外代码中存在冗余请求逻辑:你已经用requests.get(link)请求了子页面,前面的urllib.request.urlopen(link)是完全多余的操作,不仅浪费请求资源,还可能触发站点反爬限制,建议直接删除。
修复后的代码
import requests from bs4 import BeautifulSoup import os subpage = 1 while subpage <= 2: URL = "https://..." + str(subpage) # 增加超时参数避免请求卡住 page = requests.get(URL, timeout=10) soup = BeautifulSoup(page.content, "html.parser") """writes all links under the h2 tag into a list""" links = [] h2s = soup.find_all("h2") for h2 in h2s: links.append("http://www.xxxxxxxxxxx.com" + h2.a['href']) """opens links from list and extracts EAN number from underlying page""" with open("temp.txt", "a") as output: for link in links: # 删掉冗余的urllib请求 page_2 = requests.get(link, timeout=10) soup_2 = BeautifulSoup(page_2.content, "html.parser") if "EAN:" in soup_2.text: span = soup_2.find(class_="articleData_ean") # 增加空值判断避免匹配不到时报错 if span and span.a: EAN = span.a.text # 写入时追加换行符 output.write(EAN + '\n') subpage += 1 os.replace('temp.txt', 'EANs.txt')
额外优化建议
- 可以把文件打开的
with open语句提到分页循环的外层,避免每次翻页都重复打开关闭文件,降低IO开销 - 可以给请求增加User-Agent头,降低被站点反爬拦截的概率
- 如果需要处理大量分页,建议增加请求间隔,避免请求频率过高触发限制
内容的提问来源于stack exchange,提问作者Markus Krieger
相关产品推荐
相关产品推荐

