由于有反爬机制,使用了自动化测试工具selenium的无头模式进行爬取,使用fake_useragent设置随机请求头。
爬虫难点:
-
有时候元素未显示在当前窗口,需要执行js进行滚动操作。滚动大小可以根据窗口(滚动指定窗口大小),也可以根据元素来(滚动到指定元素)。
根据窗口:
# 获取当前窗口的高度 window_height = driver.execute_script("return window.innerHeight") # 执行JavaScript滚动操作 driver.execute_script(f"window.scrollBy(0, {int(window_height / 2)})")
根据元素:
# 定位到需要滚动到的元素 element_to_scroll_to = driver.find_element(By.XPATH, "//your/xpath/to/element") # 使用 JavaScript 滚动到指定元素 driver.execute_script("arguments[0].scrollIntoView();", element_to_scroll_to)
-
网站元素为动态加载,需要用WebDriverWait设置等待指定元素加载
# 设置一个等待时间,等待某个元素加载完成,可以根据实际情况调整 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'knowstart')) )
-
click点击元素后,需要driver.window_handles获取所有窗口句柄后进行窗口的切换
# 获取所有窗口句柄 window_handles = driver.window_handles # 切换到最新打开的页面 latest_window_handle = window_handles[-1] driver.switch_to.window(latest_window_handle)
过程中出现ip被封的情况。本来想通过proxypool爬虫代理池获取免费代理,后面调整爬取频率解决了这个问题。
对于有些反爬的网站,这种限制频率的方式是没用的。只要是同个ip在爬,速度够快,很快就会封掉。
这种情况还是需要走代理ip。
shell脚本难点:
shell脚本实现多个python脚本爬取,根据脚本不同输出不同的日志到对应文件。并设置如果脚本执行失败自动再次重试,重试最大次数为3次。
定时任务难点:主要是一个cron表达式的理解,其他没有什么。
定时任务坑点:
定时任务的执行涉及shell脚本和python脚本的执行。
一定要保存好输出文件,将输出保存到log文件中,方便查找错误。
-
crontab -e打开的文件,里面的内容需要使用全路径。或者使用cd /path(shell脚本调用的python脚本执行的路径,否则出现No such file or directory)
-
确保执行的文件有执行权限
查看文件执行权限:
ll filename
添加权限
chmod +x filename
-
确保启用了cron定时服务
查看cron定时任务
crontable -l
修改cron定时任务
crontable -e
修改后会自动加载
查看定时任务是否执行:
tail -f /var/log/cron