【问题标题】:How to get HTML of the whole page without scrolling?如何在不滚动的情况下获取整个页面的 HTML?
【发布时间】:2020-10-03 10:31:44
【问题描述】:
import requests
import urllib.request
from bs4 import BeautifulSoup
def get_photos(nick,how_many):
    url = f"https://www.picuki.com/profile/{nick}"
    content = requests.get(url,headers={'User-Agent': 'Mozilla/5.0'}).content
    soup = BeautifulSoup(content,"html.parser")
    images = [f["src"] for f in soup.findAll('img',class_="post-image")]
    for index, image in enumerate(images, start=1):
        urllib.request.urlretrieve(image, f"/Users/user/PycharmProjects/untitled1/Instagram_images/image{index}.png")
        if index == how_many: break
if __name__ == "__main__":
    get_photos("Username",20)

所以我有这段代码,它可以从 instagram 下载 png 格式的图像。但问题是这个页面只加载了 18 张图片而不滚动。所以如果我输入 18-36 我需要再向下滚动一次页面,如果 36-54 我需要向下滚动两次并获得它的 HTML。如何处理请求,甚至可以使用这个模块?

【问题讨论】:

  • 我不知道您的源页面是什么,但它可能正在执行某种无限滚动,通过 AJAX 或 Fetch API 从服务器获取更多数据。在这种情况下,您将不得不执行 JavaScript 来获取额外的数据。 (或者,只要弄清楚 API 是什么并直接调用它。)
  • 我是个爬虫新手。但我猜是无限滚动 src="/app/assets/js/infinite-scroll.pkgd.js" 我在inspect中找到了这个。

标签: python parsing web-scraping python-requests


【解决方案1】:

图像是使用 Ajax 加载的,但您可以使用 requests 模块模拟 Ajax。

此脚本将打印在用户个人资料中找到的所有图片 URL:

import requests
from bs4 import BeautifulSoup


username = 'itsdougthepug'
base_url = 'https://www.picuki.com/profile/{username}'


def get_image_urls(username):

    url = base_url.format(username=username)
    soup = BeautifulSoup(requests.get(url).content, 'html.parser')

    while True:
        for f in soup.findAll('img',class_="post-image"):
            yield f['src']

        load_more_url = soup.select_one('.load-more-wrapper[data-next]')
        if not load_more_url:
            load_more_url = soup.select_one('.pagination-next-page-input[value]')
            if load_more_url:
                load_more_url = load_more_url['value']
        else:
            load_more_url = load_more_url['data-next']

        if not load_more_url:
            break

        soup = BeautifulSoup(requests.get('https://www.picuki.com' + load_more_url).content, 'html.parser')


for img in get_image_urls(username):
    print(img)

打印:

https://scontent-sin6-2.cdninstagram.com/v/t51.2885-15/sh0.08/e35/p640x640/103328423_965950027183296_957866876806120724_n.jpg?_nc_ht=scontent-sin6-2.cdninstagram.com&_nc_cat=100&_nc_ohc=sW8Ic2lI-4UAX_b7bkB&oh=dc42f3f625065b6fba524bd39fc29cb0&oe=5EE7819B
https://scontent-sin6-2.cdninstagram.com/v/t51.2885-15/sh0.08/e35/p640x640/103183716_3364797436946158_1962633742202963007_n.jpg?_nc_ht=scontent-sin6-2.cdninstagram.com&_nc_cat=1&_nc_ohc=OjegUcacb2kAX_BGNBA&oh=92a8035ffed07e724a77617c6ff73b73&oe=5F0F1F22
https://scontent-sin6-2.cdninstagram.com/v/t51.2885-15/sh0.08/e35/s640x640/102951446_2650089068539996_1395066409287738000_n.jpg?_nc_ht=scontent-sin6-2.cdninstagram.com&_nc_cat=1&_nc_ohc=zXDXxxtqYUkAX9_1jE3&oh=06e83257c7a2b1cfea593719a3af60d2&oe=5F0D3F32
https://scontent-sin6-2.cdninstagram.com/v/t51.2885-15/sh0.08/e35/p640x640/103290695_2721943028038123_664290938707092396_n.jpg?_nc_ht=scontent-sin6-2.cdninstagram.com&_nc_cat=107&_nc_ohc=cZKGnM3wjBwAX9wsGvR&oh=132218410341a0ffc2d7d78f38904a01&oe=5F104353
https://scontent-sin6-2.cdninstagram.com/v/t51.2885-15/sh0.08/e35/p640x640/103207650_283928112789317_1081832932435688252_n.jpg?_nc_ht=scontent-sin6-2.cdninstagram.com&_nc_cat=105&_nc_ohc=3XfsL50CwCoAX9k2_dN&oh=969bdf74e73466a39952957bfd8ec528&oe=5F0E2A91
https://scontent-sin6-2.cdninstagram.com/v/t51.2885-15/sh0.08/e35/s640x640/102546510_111827600395599_8198630171951588410_n.jpg?_nc_ht=scontent-sin6-2.cdninstagram.com&_nc_cat=103&_nc_ohc=cVJqLrxo-fUAX9fBZtG&oh=8edcc8a5bf56519d0155e6d23ac514b3&oe=5F0EA104

... and so on.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2023-02-05
    • 1970-01-01
    相关资源
    最近更新 更多