在利用urllib進(jìn)行網(wǎng)頁(yè)爬取的時(shí)候,由于很多網(wǎng)頁(yè)都是js動(dòng)態(tài)生成的圆恤,因此抓取到的網(wǎng)頁(yè)存在信息沒(méi)有加載成功突倍,比如一個(gè)搜索網(wǎng)頁(yè)沒(méi)有加載搜索結(jié)果。
利用phantomJS和selenium模擬瀏覽器盆昙,從而能夠一定程度上解決這個(gè)問(wèn)題羽历!
1. phantomJS和selenium的安裝
phantomJS需要下載壓縮包,直接打包即可淡喜。需要用到的是壓縮路徑里的./bin/phantomjs.exe, 我理解的是秕磷,里面應(yīng)該有各種瀏覽器的驅(qū)動(dòng)。
selenium的安裝炼团,可以通過(guò)pip install selenium直接安裝
2. 代碼
from bs4 import BeautifulSoup
from selenium import webdriver
import time
from urllib import request
import os
url = 'http://www.sse.com.cn/home/search/?webswd=%E6%8B%9B%E8%82%A1%E8%AF%B4%E6%98%8E%E4%B9%A6'
dir = '***\\pdf\\'
sleep_time = 10
driver = webdriver.PhantomJS(executable_path=r'F:\phantomjs_2_1_1\bin\phantomjs.exe')
driver.set_window_size(1920, 1080)
def parse(url):
driver.get(url)
###等待網(wǎng)頁(yè)加載完成
time.sleep(sleep_time)
page = BeautifulSoup(driver.page_source)
while True:
extract(page)
###需要注意
driver.set_window_size(1920, 1080)
### 獲取下一頁(yè)
next = driver.find_element_by_class_name('nextPage')
next.click()
if not next:
break
next.click()
time.sleep(sleep_time)
page = BeautifulSoup(driver.page_source)
def extract(page):
list = page.find(id='sse_query_list')
for a in list.find_all('a'):
fileName = a['title'] + '.pdf'
url= 'http://www.sse.com.cn' + a['href']
d = os.path.join(dir, fileName)
print(fileName, " ", d)
print(url)
request.urlretrieve(url, d)
3.幾個(gè)比較坑的地方
1.driver.set_window_size(1920, 1080)
這個(gè)一定要盡可能大吧澎嚣,應(yīng)為涉及到從網(wǎng)頁(yè)源碼中解析一些元素疏尿,如果沒(méi)有這句,可能元素所在超過(guò)屏幕大小币叹,導(dǎo)致無(wú)法獲取該元素润歉,然后報(bào)錯(cuò)信息是:Element is not currently visible and may not be manipulated
2.time.sleep(10)
因?yàn)榫W(wǎng)頁(yè)需要時(shí)間加載,所以在driver獲取url后颈抚,需要讓現(xiàn)成等待一段時(shí)間踩衩,讓網(wǎng)頁(yè)加載完成。否則獲取的網(wǎng)頁(yè)信息不全贩汉。
3.獲取下一頁(yè)