【问题标题】:Scraped data and real data is not same (python)抓取的数据和真实数据不一样(python)
【发布时间】:2015-12-09 19:42:28
【问题描述】:

要抓取的网址http://aqicn.org/city/chennai//us-consulate/
这样做的原因是为了获取“pm2.5aqi”、“温度”、“湿度” , 来自网站的“压力”数据。

问题:从网站来源抓取的数据和查看的数据相同。

我使用的代码来抓取和显示数据:

from bs4 import BeautifulSoup
import urllib2
import urllib
import cookielib

url="http://aqicn.org/city/chennai//us-consulate/"
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPRedirectHandler(),
        urllib2.HTTPHandler(debuglevel=0),
        urllib2.HTTPSHandler(debuglevel=0),
        urllib2.HTTPCookieProcessor(cj))
page=opener.open(url)
page_soup=BeautifulSoup(page.read(),'html.parser')

print "curr, max, min pmi2.5 aqi : ",
print page_soup.find('td',id='cur_pm25').string,"     ",page_soup.find('td',id='max_pm25').string,"  ",page_soup.find('td',id='min_pm25').string

print "curr, max, min temp : ",
print page_soup.find('td',id='cur_t').span.string,"  ",page_soup.find('td',id='max_t').span.string,"  ",page_soup.find('td',id='min_t').span.string

print "curr, max, min pressure : ",
print page_soup.find('td',id='cur_p').string,"  ",page_soup.find('td',id='max_p').string,"  ",page_soup.find('td',id='min_p').string

print "curr, max, min humidity : ",
print page_soup.find('td',id='cur_h').string,"  ",page_soup.find('td',id='max_h').string,"  ",page_soup.find('td',id='min_h').string



我在做什么:我手动识别了页面源中包含值的标签,并从抓取的数据中打印了相同的标签值。

令人惊讶的是,显示的数据和页面源上的数据是不同的。

我抓取的数据:

curr, max, min pmi2.5 aqi :  143    157    109
curr, max, min temp :  24    30    24
curr, max, min pressure :  1012    1014    1010
curr, max, min humidity :  100    100    62


网站上的数据是:(可以通过链接验证数据,但数据可能会过时,因为它是实时数据)

curr, max, min pmi2.5 aqi : 108   166   94
curr, max, min temp : 27   30   24
curr, max, min pressure : 1013   1014   1010
curr, max, min humidity : 83   100   62


我在页面源代码中再次检查了相同的标签,并通过使用 python 显示汤来识别相同的区域:

print page_soup.prettify()


但数据相同。
这怎么可能?有人可以解释为什么会发生这种奇怪的行为吗?并建议解决此问题的方法/解决方案?

【问题讨论】:

    标签: python-2.7 web-scraping beautifulsoup


    【解决方案1】:

    实时数据由脚本呈现,它取代了默认数据,即您的抓取数据。我不知道他们为什么要放入默认数据,因为它具有误导性,并且应该始终被替换。当然,如果不是,那么最好显示错误消息而不是错误数据。

    如果你想把这个看成像 selenium 这样的网络驱动程序来为你渲染页面,然后通过漂亮的汤运行

    【讨论】:

    • 所以你的意思是说,当我的抓取脚本获取页面时,网站的服务器无法呈现真实数据(它自己的脚本失败),因此我正在检索的是默认值数据?
    • 不,默认数据是页面中的一条红鲱鱼,不幸的是,它对你没有任何意义。 Beautiful Soup 无法运行 javascript 来填充页面。你需要像 selenium 这样可以运行 javascript 并填充页面的东西。
    • 啊哈,所以必须运行返回数据中的 javascript 才能将真实数据放置在正确的位置,但是 soup 不运行脚本。 (我现在将从页面源代码中检查 javascript,假设我现在理解的是正确的。)
    • 没错,祝你好运!通常print soup 会显示数据尚未呈现。令人困惑的是他们放入了默认数据。
    • 这可能有助于您入门:stackoverflow.com/questions/33580004/…
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多