想用 Selenium 进行抓取,但网页(Cloudflare)认为我是机器人。
我尝试添加
options
,无头,等待特定的id
出现,但网页永远不会完全加载。
如何绕过这个?
仅供参考,只是为了一个学术项目,而不是试图做任何邪恶的事情。
def get_reviews(url):
driver = webdriver.Chrome(options=options)
try:
driver.get(url)
wait = WebDriverWait(driver, 30)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "carousel-module--container--27wzs")))
sleep(3)
response_text = driver.page_source
soup = BeautifulSoup(response_text, 'html.parser')
udemy_body = soup.find('body', {'id': 'udemy'})
if udemy_body:
# Get the structure!
# print(udemy_body.prettify())
review_spans = udemy_body.find_all('span', class_='ud-text-md review--review-content-with-modal-trigger--vsRaS')
reviews = [review_span.get_text(strip=True) for review_span in review_spans]
print(reviews)
else:
logger.warning(f"Body element with id 'udemy' not found for {url}.")
except Exception as e:
logger.error(f"An error occurred for {url}: {e}")
finally:
driver.quit()
udemy_course_url = 'https://www.udemy.com/course/deep-learning-tensorflow-2/'
get_reviews(udemy_course_url)
我正在测试的选项包括:
options = Options()
options.add_argument("--window-size=1920,1080")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36")
# options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--ignore-certificate-errors")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
Udemy 使用机器人检测软件。诸如 https://github.com/seleniumbase/SeleniumBase 之类的框架可以使机器人看起来像人类。 SeleniumBase 为此使用 UC 模式。
在
pip install seleniumbase
之后,使用python
运行以下脚本:
from seleniumbase import Driver
driver = Driver(uc=True)
driver.get("https://www.udemy.com/course/deep-learning-tensorflow-2/")
driver.uc_click('button[data-purpose*="show-reviews"] span')
breakpoint()
driver.quit()
该脚本调用
breakpoint()
将其暂停在 Tensorflow 课程的评论/评级部分。 (准备好后,在控制台中键入 c
并按 ENTER 键从断点继续。)
将
breakpoint()
替换为脚本的其余部分以获取评论。
哇,我已经在谷歌上搜索了一段时间,所有指向设置 Chrome 选项的答案都失败了 - 这些答案已经有 2 年多了,所以这是可以理解的。尝试了seleniumbase,不敢相信它只用
pip install seleniumbase
就解决了它!