【问题标题】:Scraping using Inspect element使用 Inspect 元素进行抓取
【发布时间】:2016-10-17 16:45:10
【问题描述】:

我正在尝试通过抓取 Instagram 从 Instagram 获取一些信息。我在 twitter 上尝试过这段代码,它运行良好,但在 Instagram 上没有显示任何结果,这两个代码都可以在这里找到。


推特代码:

from bs4 import BeautifulSoup
from urllib2 import urlopen
theurl = "https://twitter.com/realmadrid"
thepage = urlopen(theurl)
soup = BeautifulSoup(thepage,"html.parser")
print(soup.find('div',{"class":"ProfileHeaderCard"}))

结果:完美给出。


Instagram 代码:​​

from bs4 import BeautifulSoup
from urllib2 import urlopen
theurl = "https://www.instagram.com/barackobama/"
thepage = urlopen(theurl)
soup = BeautifulSoup(thepage,"html.parser")
print(soup.find('div',{"class":"_bugdy"}))

结果:无

【问题讨论】:

标签: python twitter beautifulsoup instagram screen-scraping


【解决方案1】:

如果您查看源代码,您会看到内容是动态加载的,因此您的请求返回的内容中没有div._bugdy,这取决于您想要的内容,您可以从脚本中提取它json:

import requests
import re
import json

r = requests.get("https://www.instagram.com/barackobama/")
soup = BeautifulSoup(r.content)
js = soup.find("script",text=re.compile("window._sharedData")).text
_json = json.loads((js[js.find("{"):js.rfind("}")+1]))
from pprint import pprint as pp

pp(_json)

这为您提供了您在返回的源代码中的<script type="text/javascript">window._sharedData = ..... 中看到的所有内容。

如果您想获得关注者,则需要使用selenium 之类的东西,该网站几乎都是动态加载的内容,要获得关注者,您需要单击链接,该链接仅在您登录时可见in,这会让你更接近你想要的:

from selenium import webdriver
import time
login = "https://www.instagram.com"
dr = webdriver.Chrome()

dr.get(login)

dr.find_element_by_xpath("//a[@class='_k6cv7']").click()
dr.find_element_by_xpath("//input[@name='username']").send_keys(youruname")
dr.find_element_by_xpath("//input[@name='password']").send_keys("yourpass")
dr.find_element_by_css_selector("button._aj7mu._taytv._ki5uo._o0442").click()
time.sleep(5)
dr.get("https://www.instagram.com/barackobama")

dr.find_element_by_css_selector('a[href="/barackobama/followers/"]').click()
time.sleep(3)
for li in dr.find_element_by_css_selector("div._n3cp9._qjr85").find_elements_by_xpath("//ul/li"):
    print(li.text)

点击链接后,从弹出的 li 标签中提取一些文本,你可以从无序列表中提取任何你想要的内容:

【讨论】:

  • 但是从 Inspect 元素中可以看到的一些东西在源中不可用,例如关注者的用户 ID,那么如何获得它。
  • @Ravi,你看过 json 吗?整个内容由脚本加载,所以你什么都没有,除非你使用 selenium 之类的东西来解析 json
  • 您的代码运行良好,但我想访问的是来自 instagram.com/barackobama/followers 的关注者的用户 ID,但对于此源代码,当列表在检查元素中可见时不给出结果。
  • @Ravi,该链接即使在浏览器中也无济于事,您需要使用 selenium 模拟单击​​链接,该站点是完全动态创建的。
  • 您还必须先登录才能获取链接
【解决方案2】:

首先,第 3 行的地址似乎有错字。

from bs4 import BeautifulSoup
from urllib2 import urlopen
theurl = "https://www.instagram.com/barackobama/"
thepage = urlopen(theurl)
soup = BeautifulSoup(thepage,"html.parser")
print(soup.find('div',{"class":"_bugdy"}))

其次,由于您使用的是动态加载的内容,Python 可能无法看到您在浏览器中浏览页面时看到的所有内容。 为了解决这个问题,有不同的 webdrivers,例如 Selenium webdriver (http://www.seleniumhq.org/projects/webdriver/) 和 PhantomJS (http://phantomjs.org/),它们模拟浏览器,可以等待 Javascript 生成/显示数据,然后再查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2021-01-26
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多