【问题标题】:Unable to fetch all the links from a webpage using requests无法使用请求从网页中获取所有链接
【发布时间】:2020-09-13 07:13:54
【问题描述】:

我正在尝试获取连接到此webpage 中每个图像的所有链接。

如果我让 selenium 脚本向下滚动直到它到达底部,我可以获得所有链接。我希望抓取的一个这样的链接是this one

现在,我的目标是使用请求解析所有这些链接。我注意到我要解析的链接是使用这样的B-uPwZsJtnB 短代码构建的。

然而, 我正在尝试在该网页的页面源中找到的脚本标记中抓取那些不同的shortcode。该页面中大约有600 shortcodes。我创建的脚本只能解析第一个70,比如shortcode,最终可以建立70个合格的链接。

如何使用请求获取所有 600 个链接?

到目前为止,我已经尝试过:

import re
import json
import requests

base_link = 'https://www.instagram.com/p/{}/'
lead_url = 'https://www.instagram.com/explore/tags/baltimorepizza/'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
    req = s.get(lead_url)
    script_tag = re.findall(r"window\._sharedData[^{]+(.*?);",req.text)[0]
    for item in json.loads(script_tag)['entry_data']['TagPage']:
        tag_items = item['graphql']['hashtag']['edge_hashtag_to_media']['edges']
        for elem in tag_items:
            profile_link = base_link.format(elem['node']['shortcode'])
            print(profile_link)

【问题讨论】:

  • 您考虑过使用API吗?
  • 我建议使用 instagram API...
  • @robots-txt,我很想知道你是如何找出不同的 shortcodes 的?此外,您是否必须登录该网站才能确定相同的内容?
  • 我只看到 79 个shortcode,即使页面滚动到最后——600 个链接在哪里?
  • 查看this image,它表示@0m3r 有多少链接。

标签: python python-3.x web-scraping beautifulsoup re


【解决方案1】:

如果你想用requests 来做,那么请考虑查询XHR/Ajax Http 请求以模仿延迟加载。见下图:

您向 instagram.com 服务器发出类似于Scrape a JS Lazy load page by Python requests 帖子的查询。

免责声明

由于某些动态 cookie 值或 Instagram 强加的其他抓取防护措施,您可能无法成功完成该任务。

【讨论】:

    【解决方案2】:

    Instagram 网页使用延迟加载来加载图像。你可以通过两种方式克服这个问题:

    1. 使用 cmets 中提到的 Instagram API
    2. 使用selenium之类的工具将页面上scrolling的所有图片加载到底部,然后获取链接

    第一种方法是更好的方法。

    【讨论】:

    • 你把我的问题弄错了@BBloggsbott。我没有寻找更好的方法来做到这一点。相反,我希望按照我开始的方式完成其余的工作。在悬赏问题之前,我已经收到了您对 API 的评论建议。至于硒的方式,我在我的帖子中提到过我走这条路并取得了成功。谢谢。
    【解决方案3】:

    如果您正在构建商业产品,我建议您使用Instagram Graph API,因为使用 instagram 公共数据需要获得 GDPR 的同意。此 API 将简化您的工作,但在 api 限制下,例如您可以在每个用户令牌 7 天内查询 30 次搜索。

    如果您正在构建非商业工具,您有两种方法。

    1. 直接抓取 instagram 网页。如上面的答案所述,您可以使用 selenium 并自动化页面交互,因为网页使用 javascript 生成图像 url。这种方法的缺点是 instagram 和 facebook 做了反抓取方法来防止抓取他们的数据,例如用动态生成的类包装 html 元素,经常更改 xpaths。您可能需要花费大量时间来编写代码并稍后修复这些问题。

    2. 使用为抓取 Instagram 数据而构建的第三方库。 github上有很多开源的第三方库,我最喜欢instaloader。您可以使用single command 下载所有主题标签搜索结果。这个库不仅可以下载图片,还可以下载图片相关帖子的data json。由于该库有维护人员,因此您不必担心以后的 instagram 网页更改。在您的情况下,我推荐这种方法。

    【讨论】:

      猜你喜欢
      • 2020-02-14
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多