如何解决requests或selenium无法获取完整网页内容的问题(非异步加载)?

最近用python做脚本的时候,发现了一个问题,就是获取的网页并不全。可能原因之一是页面内容过大,无法加载全部到内存中
下面的解决方法只针对静态加载页面(有的网页是动态加载数据,需要查看对应的js请求或者用selenium来获取就好)。
解决方法为放入文件里,再读取即可

使用selenium,代码如下

browser = webdriver.Chrome(service=webdriver_service, options=option)
browser.get(url)
browser.implicitly_wait(10) # 等待页面加载完毕,最多等待10s
# print(browser.page_source)
# str(browser.page_source)
soup = BeautifulSoup(browser.page_source,"lxml")
soup.find(xxxx)

soup.find(xxxx) 获取不到,但是在网页上F12查找元素是有的。于是查看network,但是并未发现有ajax异步数据,只有静态数据,于是打印页面源码,print(browser.page_source),发现获取的 html 页面内容并不全,并且每次获取的html 内容不一样,每次都是获取到一半就没有了。转成str打印也是一样的效果。于是怀疑是selenium的问题,又换用requests

source_html = requests.get(url)
soup = BeautifulSoup(browser.source_html,"lxml")
soup.find(xxxx)

还是一样的效果,还是找不到。
以为是页面没加载完毕,sleep(3) 睡眠3s依旧不行
搜索后终于在一个博客找到些线索,于是用下列方式,问题就解决了.
把获取到的页面内容保存到文件里,再读取,就拿到了。可能原因是页面过大,python的输出限制长度。

tmp_html = "temp.html"
source_html = requests.get(url)
with open(tmp_html, "w+", encoding="utf-8") as f:
    f.write(source_html.text)
    f.seek(0)
    html_handle = f.read()
soup = BeautifulSoup(html_handle,"lxml")
soup.find(xxxx)

如果文件过大无法写入,可使用requests.iter_content写

with open(filename, 'wb') as fd:
    for chunk in r.iter_content(chunk_size):
        fd.write(chunk)

这次soup.find(xxxx)找到了,并且文件里也是完整的html内容。
如果文件过大,soup = BeautifulSoup(html_handle,“lxml”) Beautifulsoup无法加载,可以使用使用SAX解析器

参考链接

requests.get()获取信息不完整
使用BeautifulSoup加载大型xml文件

物联沃分享整理
物联沃-IOTWORD物联网 » 如何解决requests或selenium无法获取完整网页内容的问题(非异步加载)?

发表评论