无法使用请求获取网页上的所有链接

时间:2020-05-26 13:08:58

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

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

如果我让硒脚本向下滚动直到到达底部,我将获得所有链接。我希望抓取的一个此类链接是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)

3 个答案:

答案 0 :(得分:2)

如果要使用requests,请考虑查询XHR / Ajax Http请求以模仿惰性加载。参见下图:

enter image description here

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

免责声明

由于某些动态cookie值或Instagram实施的其他防止刮擦功能,您可能无法成功完成该任务。

答案 1 :(得分:0)

Instagram网页使用延迟加载来加载图像。您可以通过2种方法来克服这一点:

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

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

答案 2 :(得分:0)

如果您要开发商业产品,建议您使用Instagram Graph API,因为由于GDPR的原因,使用instagram公开数据需要征得同意。该API可以简化您的工作,但是在api限制下,例如您可以针对每个用户令牌7天查询30次搜索。

如果要构建非商业工具,则有两种方法。

  1. 直接抓取instagram网页。如上述答案中所述,您可以使用硒和自动进行页面交互,因为网页使用JavaScript来生成图像网址。这种方法的缺点是instagram和facebook采取了反抓取方法来防止抓取其数据,例如使用动态生成的类包装html元素,频繁更改xpath。您可能需要花费大量时间来编写代码,并在以后修复这些问题。

  2. 使用为抓取instagram数据而构建的第三方库。 github中有许多开源第三方库,instaloader是我的最爱。您可以使用single command下载所有主题标签搜索结果。该库不仅下载图像,还下载与该图像相关的帖子的data json。由于该库有维护人员,因此您不必担心以后的instagram网页更改。我建议您使用这种方法。