我正试图用Python和BeautifulSoup来抓取产品页的Aliexpress产品数据。
我运行下一段代码,引用一个YML文件(aliexpress.yml),其中包含用SelectorLib创建的Aliexpress CSS选择器:
from selectorlib import Extractor
import requests
import json
import argparse
argparser = argparse.ArgumentParser()
argparser.add_argument('url', help='Amazon Product Details URL')
# Create an Extractor by reading from the YAML file
e = Extractor.from_yaml_file('./aliexpress.yml')
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'
headers = {'User-Agent': user_agent}
# Download the page using requests
args = argparser.parse_args()
r = requests.get(args.url, headers=headers)
# Pass the HTML of the page and create
data = e.extract(r.text)
# Print the data
print(json.dumps(data, indent=True))
我收到下一个答复:
{
"name": null,
"price": null,
"image": null
}
我有其他用于Amazon和其他电子商务的YML文件,并且工作正常,但是使用Aliexpress,它返回null。这很奇怪,因为在SelectorLib中,我可以正确地查看预览数据,所以YML文件是正确的。
会不会是支付宝阻塞了我的擦伤?如何在没有空响应的情况下刮取Aliexpress数据?
发布于 2020-04-22 07:14:55
JavaScript
加载的,因此requests
不会帮助您呈现JS
。您可以使用selenium
或任何呈现JS
的模块。script
标记中,您实际上可以在JSON
中对其进行loads
,然后将其放在parse
中。elements
中看到inspect element
,是因为浏览器实际上是为您可视化的,但是如果您检查了page source
,如果禁用了JS
,您会注意到它不在其中。在这里,我已经将script
加载到JSON
中,您可以以JSON
dict
的形式访问它
import requests
import json
import re
target = ["title", "itemDetailUrl", "imagePath"]
def main(url):
r = requests.get(url)
match = re.search(r'data: ({.+})', r.text).group(1)
data = json.loads(match)
goal = [data['pageModule'][x] for x in target] + \
[data['priceModule']['formatedActivityPrice']]
print(goal)
main("https://es.aliexpress.com/item/32601027783.html")
输出:
['Nueva versión Xiaomi Mi cargador de coche Dual USB versión de carga rápida 37W Max con puntas de luz LED para iPhone Huawei Xiaomi para Samsung|charger dual|dual usb|mi car - AliExpress',
'https://es.aliexpress.com/item/32601027783.html',
'https://ae01.alicdn.com/kf/H6f0b93e98bb646d5a1183161b65707e3P/Nueva-versi-n-Xiaomi-Mi-cargador-de-coche-Dual-USB-versi-n-de-carga-r-pida.jpg',
'€ 9,31 - 10,86']
https://stackoverflow.com/questions/61364719
复制