爬蟲--python3.6+selenium+BeautifulSoup實現動態網頁的資料抓取,適用於對抓取頻率不高的情況
說在前面: 本文主要介紹如何抓取 頁面載入後需要通過JS載入的資料和圖片
本文是通過python中的selenium(pyhton包) + chrome(谷歌瀏覽器) + chromedrive(谷歌瀏覽器驅動)
chrome 和chromdrive建議都下最新版本(參考地址:https://blog.csdn.net/yoyocat915/article/details/80580066)
同樣支援無頭模式(不需要開啟瀏覽器)
直接上程式碼:site_url:需要爬取的地址,CHROME_DRIVER_PATH:chromedrive存放地址
def get_dynamic_html(site_url):
print('開始載入',site_url,'動態頁面')
chrome_options = webdriver.ChromeOptions()
#ban sandbox
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
#use headless,無頭模式
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--ignore-ssl-errors')
driver = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH,chrome_options=chrome_options)
#print('dynamic laod web is', site_url)
driver.set_page_load_timeout(100)
#driver.set_script_timeout(100)
try:
driver.get(site_url)
except Exception as e:
#driver.execute_script('window.stop()') # 超出時間則不載入
print(e, 'dynamic web load timeout')
data = driver.page_source
soup = BeautifulSoup(data, 'html.parser')
try:
driver.quit()
except:
pass
return soup
返回的一個soup,這樣可以對這個soup進行搜尋節點,使用select,search,find等方法找到你想要的節點或者資料
同樣如果你想變成文字下載下來,則
try:
with open(xxx.html, 'w+', encoding="utf-8") as f:
#print ('html content is:',content)
f.write(get_dynamic_html('https://xxx.com').prettify())
f.close()
except Exception as e:
print(e)
下面詳細說一下,beautifusoup的搜尋
首先如何定位到一個標籤
1.使用 find (這位博主詳細介紹了https://www.jb51.net/article/109782.htm)
- find() 返回匹配第一個:如soup.find(name='ul',attrs={class:'hh'}) 返回第一個 class='hh'的ul
- find_all() 返回全部
- find_parent() 搜尋父標籤,返回第一個
- find_parents()搜尋父標籤,返回全部
- find_next_sibling()返回下一個同級標籤
- find_next_siblings()
- find_previous_sibling() 返回上一個同級標籤
- find_previous()返回前面的標籤
- find_all_previous()
- find_next()返回後面的標籤
- find_all_next()