java爬虫抓取动态网页(一种爬虫获取动态网页源码的方式你get到了吗?)
优采云 发布时间: 2022-03-19 19:13java爬虫抓取动态网页(一种爬虫获取动态网页源码的方式你get到了吗?)
今天给大家普及下爬虫获取动态网页源码的方法。
众所周知,如果爬虫请求静态网页,它可以直接获取该网页的源代码。但是如果请求的是动态网页,比如js加载等,那么直接请求是无法获取网页源代码的。
那么在这种情况下该怎么办呢?有些学生可能已经考虑过使用硒。Selenium 是一个模拟人为操作网页的神器,可以达到可见、可爬的效果。唯一的缺点是速度慢,消耗大量资源。如果整个过程都用硒来操作,会费时费力,那么有没有更好的办法呢?
如果我只是使用 selenimu 加载网页,在加载完网页并获取网页的源代码后,我会关闭 selenium 并使用 BeautifulSoup 来解析网页的内容。这可能吗?答案是肯定的,这种方法完美的实现了既可以获取网页的源代码,又可以避免整个过程中使用selenium。
接下来,我以*敏*感*词*网站为例。我们想在下一页上获得第一部*敏*感*词*的名称和链接。
如果我们使用普通请求请求网站,流程如下:
import time
import requests
from bs4 import BeautifulSoup
import hashlib
from selenium import webdriver
import os
headers = {'X-Requested-With': 'XMLHttpRequest','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
url = 'http://manhua.dmzj.com/tags/search.shtml?s=%E6%8B%B3%E7%9A%87'
res = requests.get(url, headers=headers)
res = res.text
soup = BeautifulSoup(res, "html.parser")
a = soup.select('div.tcaricature_block.tcaricature_block2 ul>li:first-child a')[0]
title = a['title']
url2 = 'http:' + a['href']
print(url2)
print(title)
结果如下:
可见,*敏*感*词*的名字和链接根本不是我们想要的。其实是因为它的网页是动态加载的,而我们请求的网页源代码不是我们想要的,所以出现定位错误。
接下来,我们使用 selenium 获取源代码进行试用。程序如下:
import time
import requests
from bs4 import BeautifulSoup
import hashlib
from selenium import webdriver
import os
path = "/usr/local/chromedriver"
driver = webdriver.Chrome(path)
headers = {'X-Requested-With': 'XMLHttpRequest','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
url = 'http://manhua.dmzj.com/tags/search.shtml?s=%E6%8B%B3%E7%9A%87'
driver.get(url)
time.sleep(3) #这是为了让网页能够完全加载出来
res = driver.page_source
driver.close()
soup = BeautifulSoup(res, "html.parser")
a = soup.select('div.tcaricature_block.tcaricature_block2 ul>li:first-child a')[0]
title = a['title']
url2 = 'http:' + a['href']
print(url2)
print(title)
结果如下:
可以看出我们得到了我们想要的*敏*感*词*名和链接,因为用selenium得到的源码和我们在网页上看到的一样。
你有这种获取网页源代码的方法吗?