0

    requests或selenium获取网页内容不全问题(非异步加载)

    2023.10.18 | admin | 181次围观

    最近用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依旧不行

    requests或selenium获取网页内容不全问题(非异步加载)

    搜索后终于在一个博客找到些线索,于是用下列方式,问题就解决了.

    把获取到的页面内容保存到文件里网页图片显示完全代码,再读取,就拿到了。可能原因是页面过大,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文件

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论