请问爬虫如何爬取动态的、无Response的页面数据(例如B站的视频在线人数)?

我在爬B站的时候发现视频在线人数是一段时间更新一次的,然而Chrome或是Fiddler中抓包发现页面加载完之后并没有新的包,并且在Response中…
关注者
14
被浏览
4,910
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

今天给大家普及下一种爬虫获取动态网页源码的方式。

众所周知,如果爬虫是在请求静态网页的情况下,是可以直接获取到网页源码的。但是如果请求的是一个动态网页,比如涉及到js加载等,那么直接请求是获取不到网页源码的。

那么这种情况下该怎么办呢?可能有同学想到了,就是用selenium。selenium是模拟人为操控网页的一款神器,可以实现可见即可爬的效果。唯一的缺点就是速度慢,消耗资源大。如果全部流程都用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")