爬虫时常常用到的一些函数
·
1.获取现在的时间
def current_date_str():
now = datetime.now()
return f"{now.month}.{now.day}"
2.数据的清洗
(1) 将带“K”、“M”、“B”后缀的数字字符串统一转换为以“K”为单位的简写字符串。
def num2k(num_str):
if not num_str:
return ""
num_str = num_str.replace(',', '').strip().upper()
try:
if num_str.endswith('B'):
value = float(num_str[:-1]) * 1000000
elif num_str.endswith('M'):
value = float(num_str[:-1]) * 1000
elif num_str.endswith('K'):
value = float(num_str[:-1])
elif re.match(r'^\d+(\.\d+)?$', num_str):
value = float(num_str) / 1000
else:
return num_str
value_str = f"{value:.1f}".rstrip('0').rstrip('.')
return f"{value_str}K"
except Exception:
return num_str
结果如下:
print(num2k("1.2M")) # 输出: 1200K
print(num2k("3B")) # 输出: 3000000K
print(num2k("2500")) # 输出: 2.5K
print(num2k("2,300K")) # 输出: 2300K
print(num2k("abc")) # 输出: abc
(2) 将带“K”、“M”、“B”后缀的数字字符串转换为实际数值(如int或float),方便后续计算。
def parse_num(num_str):
if pd.isnull(num_str):
return 0
num_str = str(num_str).replace(",", "").strip().upper()
try:
if num_str.endswith('B'):
return float(num_str[:-1]) * 1_000_000_000
elif num_str.endswith('M'):
return float(num_str[:-1]) * 1_000_000
elif num_str.endswith('K'):
return float(num_str[:-1]) * 1_000
elif re.match(r'^\d+(\.\d+)?$', num_str):
return float(num_str)
else:
return 0
except Exception:
return 0
结果如下:
print(parse_num("1.2M")) # 输出: 1200000.0
print(parse_num("3B")) # 输出: 3000000000.0
print(parse_num("2500")) # 输出: 2500.0
print(parse_num("2,300K")) # 输出: 2300000.0
print(parse_num(None)) # 输出: 0
print(parse_num("abc")) # 输出: 0
3.获取视频链接
-
利用 find_elements 查找网页元素
-
set 集合去重
-
while 循环控制采集数量与次数
-
网页下拉与等待
-
代码简化与结构清晰
def get_video_links(driver, max_links=30, max_scroll=20):
"""
自动采集网页中所有包含'/video/'的链接,返回不重复的前 max_links 个链接。
"""
video_links = set() # 用集合去重
scroll_times = 0
while len(video_links) < max_links and scroll_times < max_scroll:
# 1. 查找所有包含 /video/ 的链接
a_tags = driver.find_elements(By.XPATH, '//a[contains(@href, "/video/")]')
for a in a_tags:
href = a.get_attribute('href')
if href and '/video/' in href:
# 只保留主链接部分,去掉参数
video_links.add(href.split('?')[0])
# 2. 模拟用户向下滚动页面加载新内容
driver.execute_script("window.scrollBy(0, 500);")
time.sleep(1.5) # 等待页面加载
scroll_times += 1
# 3. 如果这次没有新链接,提前结束
if len(video_links) >= max_links or scroll_times >= max_scroll:
break
print(f"共采集到 {len(video_links)} 个视频链接")
return list(video_links)[:max_links]
4.启动chrome,并跳转到需要爬取的网站
chrome_options = uc.ChromeOptions()
chrome_options.add_argument('--start-maximized')
chrome_options.add_argument('--lang=en-US')
chrome_options.add_argument(f'--user-data-dir={chrome_user_data_dir}')
chrome_options.add_argument(f'--profile-directory={chrome_profile_dir}')
driver = uc.Chrome(options=chrome_options, use_subprocess=True)
print('当前工作目录:', os.getcwd())
driver.get("https://www.tiktok.com/")
wait_for_captcha(driver) # 首次页面先等通过验证码
input("请在弹出的浏览器窗口手动登录并完成所有图片/滑块验证,确认主页可正常浏览后,回到命令行按回车继续...")
更多推荐
所有评论(0)