📜  从动态网站中抓取内容

📅  最后修改于: 2022-05-13 01:54:49.110000             🧑  作者: Mango

从动态网站中抓取内容

为了从静态页面抓取内容,我们使用 BeautifulSoup 作为我们的抓取包,它可以完美地用于静态页面。我们使用请求将页面加载到我们的Python脚本中。现在,如果我们尝试加载的页面本质上是动态的,并且我们通过请求库请求该页面,它将发送 JS 代码以在本地执行。 Requests 包不执行此 JS 代码,只是将其作为页面源提供。

BeautifulSoup 不会通过Java脚本捕获与 DOM 的交互。假设,如果您有一个由 JS 生成的表。 BeautifulSoup 将无法捕获它,而Selenium可以。

如果只是需要抓取静态网站,我们会只使用 bs4。但是,对于动态生成的网页,我们使用selenium。
Selenium

Selenium是一个免费(开源)自动化测试框架,用于跨不同浏览器和平台验证 Web 应用程序。您可以使用Java、C#、 Python等多种编程语言来创建Selenium测试脚本。在这里,我们使用Python作为我们的主要语言。

首先,安装:

1) Python中的Selenium绑定

pip install selenium

2) 网络驱动程序
Selenium需要一个 Web 驱动程序来与所选浏览器交互。Web 驱动程序是一个与 Web 浏览器交互的包。它通过对所有人都通用的有线协议与网络浏览器或远程网络服务器进行交互。您可以签出并安装您选择的浏览器的网络驱动程序。

Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
Firefox: https://github.com/mozilla/geckodriver/releases
Safari:    https://webkit.org/blog/6900/webdriver-support-in-safari-10/ 

美汤

Beautifulsoup 是一个Python库,用于从 HTML 和 XML 文件中提取数据。它与您最喜欢的解析器一起使用,提供导航、搜索和修改解析树的惯用方式。它通常可以节省程序员数小时或数天的工作时间。

为了使用漂亮的汤,我们在Python中有这个美妙的绑定:
1) Python中的BS4绑定

pip install bs4

假设该站点是动态的,并且简单的抓取导致返回一个 Nonetype 对象。

#### This program scrapes naukri.com's page and gives our result as a 
#### list of all the job_profiles which are currently present there. 
  
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
  
#url of the page we want to scrape
url = "https://www.naukri.com/top-jobs-by-designations# desigtop600"
  
# initiating the webdriver. Parameter includes the path of the webdriver.
driver = webdriver.Chrome('./chromedriver') 
driver.get(url) 
  
# this is just to ensure that the page is loaded
time.sleep(5) 
  
html = driver.page_source
  
# this renders the JS code and stores all
# of the information in static HTML code.
  
# Now, we could simply apply bs4 to html variable
soup = BeautifulSoup(html, "html.parser")
all_divs = soup.find('div', {'id' : 'nameSearch'})
job_profiles = all_divs.find_all('a')
  
# printing top ten job profiles
count = 0
for job_profile in job_profiles :
    print(job_profile.text)
    count = count + 1
    if(count == 10) :
        break
  
driver.close() # closing the webdriver

这是刮板的视频:Working_scraper_video

代码输出: