赞
踩
最近用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解析器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。