我正在尝试将所有链接连接到此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)
答案 0 :(得分:2)
如果要使用requests
,请考虑查询XHR / Ajax Http请求以模仿惰性加载。参见下图:
您向instagram.com服务器查询类似于Scrape a JS Lazy load page by Python requests帖子。
由于某些动态cookie值或Instagram实施的其他防止刮擦功能,您可能无法成功完成该任务。
答案 1 :(得分:0)
Instagram网页使用延迟加载来加载图像。您可以通过2种方法来克服这一点:
第一种方法是更好的方法。
答案 2 :(得分:0)
如果您要开发商业产品,建议您使用Instagram Graph API,因为由于GDPR的原因,使用instagram公开数据需要征得同意。该API可以简化您的工作,但是在api限制下,例如您可以针对每个用户令牌7天查询30次搜索。
如果要构建非商业工具,则有两种方法。
直接抓取instagram网页。如上述答案中所述,您可以使用硒和自动进行页面交互,因为网页使用JavaScript来生成图像网址。这种方法的缺点是instagram和facebook采取了反抓取方法来防止抓取其数据,例如使用动态生成的类包装html元素,频繁更改xpath。您可能需要花费大量时间来编写代码,并在以后修复这些问题。
使用为抓取instagram数据而构建的第三方库。 github中有许多开源第三方库,instaloader是我的最爱。您可以使用single command下载所有主题标签搜索结果。该库不仅下载图像,还下载与该图像相关的帖子的data json。由于该库有维护人员,因此您不必担心以后的instagram网页更改。我建议您使用这种方法。