Python爬虫中的过滤问题如何解决?
在写个爬取 url 的爬虫,原理大概是从一个起始的 url 开始爬,然后获取整个页面的链接地址,然后顺着收集到的 url 进行广泛的爬取,这里面出现 2 个问题没找到合适的办法解决.
1,会爬去到国外去
2,会爬到蜘蛛池(一种泛站程序,可以无限多的生成 N 个域名的网站类似,asd123.123.com assss.123.com 123.234.com)
目前通过判断标题是否是中文来避免是不是爬到国外的站,
还有一个就是放一个黑名单的表.存在就不爬.
但是蜘蛛池的域名实在太多了,也找不到太多规律的东西进行判断.
V 友们友什么好的建议么?
Python爬虫中的过滤问题如何解决?
制定 url 的匹配规则(正则),符合规则的 url 才爬,其他的过滤
在Python爬虫中过滤数据,核心就是拿到原始数据后,用规则筛出你要的部分。主要分两步:提取和清洗。
1. 提取:用对工具
* HTML/XML:直接用 BeautifulSoup 或 lxml。BeautifulSoup写起来简单,lxml速度更快。
* JSON:直接用 json.loads() 转成Python字典/列表操作。
* 正则表达式:对付不规则文本或复杂字符串匹配,用 re 模块。但HTML解析优先用前面的工具,正则容易出问题。
2. 清洗:处理脏数据
提取后的文本经常有空白符、特殊字符、多余标签等。
* 用字符串方法:.strip(), .replace(), .split()。
* 用正则:re.sub() 是替换或删除不需要字符的利器。
举个完整例子(用BeautifulSoup + 正则): 假设我们要从一个简单页面里提取所有纯文本段落,并清理掉数字和多余空格。
import requests
from bs4 import BeautifulSoup
import re
# 1. 抓取页面
url = '你的目标网址'
resp = requests.get(url)
html_content = resp.text
# 2. 用BeautifulSoup解析并提取所有<p>标签文本
soup = BeautifulSoup(html_content, 'html.parser')
paragraphs = soup.find_all('p')
raw_texts = [p.get_text() for p in paragraphs]
# 3. 清洗:定义一个过滤函数
def clean_text(text):
# 移除数字
text = re.sub(r'\d+', '', text)
# 将多个连续空格/换行符替换为单个空格
text = re.sub(r'\s+', ' ', text)
# 去掉首尾空格
return text.strip()
# 应用清洗函数
cleaned_texts = [clean_text(t) for t in raw_texts]
# 打印结果
for i, text in enumerate(cleaned_texts):
print(f"段落 {i+1}: {text}")
总结:根据数据格式选对解析库,清洗时字符串方法和正则搭配使用。
设置一个爬取深度
只爬去一个 url 的主页的链接,
开始是直接获取整个页面的链接,然后进行过滤,对 URL 的长度,后缀进行了过滤,
如果设置成 域名带有 WWW 的才保存的话,数量就很少.如果不这样设置的话就会跑到蜘蛛池里面去.所以有点尴尬.
国外的有域名就有 ip,有 ip 就有地域吧,一大堆速度超快的 ip 转地域的,淘宝啊搜狐啊腾讯啊
遇到爬虫陷阱爬虫蜜罐或者脏数据混淆等反爬手段,没啥好办法啊,socket 连一下试试域名存在性?控制友好频率上代理池才是正路子,就算撇开是否合法,频率太高会被当作 dos 攻击告你的
IP 倒不是瓶颈,不是针对单站爬行的,每个站只会访问 1-2 次而已

