使用beautifulsoup4进行抓取时数据丢失

时间:2019-03-24 23:14:33

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

实际上,我是使用Python Beautifulsoup4进行解析的新手。我正在抓取this website。我需要首页上的当前每英里价格

我已经花了3个小时了。在互联网上寻找解决方案时。我知道有一个PyQT4库,它可以像Web浏览器一样模拟并加载内容,然后在完成加载后就可以提取所需的数据。但是我坠毁了。

使用此方法以原始文本格式收集数据。我也尝试了其他方法。

def parseMe(url):
    soup = getContent(url)
    source_code = requests.get(url)
    plaint_text = source_code.text
    soup = BeautifulSoup(plaint_text, 'html.parser')
    osrs_text = soup.find('div', class_='col-md-12 text-center')
    print(osrs_text.encode('utf-8'))

Please have a look on this image。我认为问题在于:: before和:: after标签。页面加载后它们就会出现。
我们将不胜感激任何帮助。

4 个答案:

答案 0 :(得分:1)

网页制作XHR来获取其中包含价格的JSON文件

import requests

r = requests.get('https://api.boglagold.com/api/product/?id=osrs-gold&couponCode=null')
j = r.json()
# print(j)
print('sellPrice', j['sellPrice'])
print('buyPrice', j['buyPrice'])

输出:

sellPrice 0.8
buyPrice 0.62

答案 1 :(得分:1)

如其他答案所述,此页面仅包含文本Current Price Per Mil:0USD。中间的值0.8是使用JS从下面描述的网址中动态获得的(可以通过using a process described (for example) here and many other places获得。该站点检查机器人,因此您拥有to use a method described (for example) here

所以在一起:

url = 'https://api.boglagold.com/api/product/?id=osrs-gold&couponCode=null'
import requests
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'})

response.json()['sellPrice']

输出:

0.8

答案 2 :(得分:0)

您应该使用selenium而不是`requests:

from selenium import webdriver
from bs4 import BeautifulSoup

def parse(url):
    driver = webdriver.Chrome('D:\Programming\utilities\chromedriver.exe')
    driver.get('https://boglagold.com/buy-runescape-gold/')
    soup = BeautifulSoup(driver.page_source)
    return soup.find('h4', {'id': 'curr-price-per-mil-text'}).text

parse()

输出:

'Current Price Per Mil: 0.80USD'

原因是该元素的值是通过requests无法处理的JavaScript获取的。此特定代码段使用Chrome驱动程序;如果愿意,可以使用Firefox /其他等效浏览器(您需要安装selenium库并自己寻找Chrome驱动程序)。

答案 3 :(得分:0)

问题是javascript动态添加了您要在该网站上剪贴的数据。您可以尝试在客户端上运行JS,等待获取要剪贴的数据,然后获取DOM内容-如果您要这样做,请查看@gmds answer。另一种方法是检查javascript代码发出了哪些请求,以及哪个请求包含您需要的信息。然后,您可以使用python发出该请求,并获得所需的数据,而无需使用PyQT4甚至BS4。