使用 python 抓取 AJAX 电子商务网站
Scraping AJAX e-commerce site using python
我在使用 BeautifulSoup 抓取电子商务网站 时遇到问题。我做了一些谷歌搜索,但我仍然无法解决问题。
请参考图片:
1 Chrome F12 :
2 Result :
这是我试图抓取的网站:“https://shopee.com.my/search?keyword=h370m”
问题:
当我尝试在 Google Chrome (F12) 上打开检查元素时,我可以看到产品名称、价格等。但是当我 运行 我的 python 程序,我无法在 python 结果中获得相同的代码和标签。经过一些谷歌搜索,我发现 这个网站使用 AJAX 查询来获取数据 。
任何人都可以通过 抓取 AJAX 站点 来帮助我获取这些产品数据的最佳方法?我想以table形式显示数据。
我的代码:
import requests
from bs4 import BeautifulSoup
source = requests.get('https://shopee.com.my/search?keyword=h370m')
soup = BeautifulSoup(source.text, 'html.parser')
print(soup)
欢迎使用 Whosebug!您可以检查 ajax 请求发送到哪里并复制它。
在这种情况下,请求 goes to this api url. You can then use requests
to perform a similar request. Notice however that this api endpoint requires a correct UserAgent header. You can use a package like fake-useragent 或者只是为代理硬编码一个字符串。
import requests
# fake useragent
from fake_useragent import UserAgent
user_agent = UserAgent().chrome
# or hardcode
user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36'
url = 'https://shopee.com.my/api/v2/search_items/?by=relevancy&keyword=h370m&limit=50&newest=0&order=desc&page_type=search'
resp = requests.get(url, headers={
'User-Agent': user_agent
})
data = resp.json()
products = data.get('items')
欢迎使用 Whosebug! :)
作为替代方案,您可以检查 Selenium
查看文档中的示例用法:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
当您使用 requests
(或像 Scrapy 这样的库)时,通常 JavaScript 不会加载。正如@dmitrybelyakov 提到的,您可以使用 Selenium 回复这些呼叫或模仿正常的用户交互。
我在使用 BeautifulSoup 抓取电子商务网站 时遇到问题。我做了一些谷歌搜索,但我仍然无法解决问题。
请参考图片:
1 Chrome F12 :
2 Result :
这是我试图抓取的网站:“https://shopee.com.my/search?keyword=h370m”
问题:
当我尝试在 Google Chrome (F12) 上打开检查元素时,我可以看到产品名称、价格等。但是当我 运行 我的 python 程序,我无法在 python 结果中获得相同的代码和标签。经过一些谷歌搜索,我发现 这个网站使用 AJAX 查询来获取数据 。
任何人都可以通过 抓取 AJAX 站点 来帮助我获取这些产品数据的最佳方法?我想以table形式显示数据。
我的代码:
import requests
from bs4 import BeautifulSoup
source = requests.get('https://shopee.com.my/search?keyword=h370m')
soup = BeautifulSoup(source.text, 'html.parser')
print(soup)
欢迎使用 Whosebug!您可以检查 ajax 请求发送到哪里并复制它。
在这种情况下,请求 goes to this api url. You can then use requests
to perform a similar request. Notice however that this api endpoint requires a correct UserAgent header. You can use a package like fake-useragent 或者只是为代理硬编码一个字符串。
import requests
# fake useragent
from fake_useragent import UserAgent
user_agent = UserAgent().chrome
# or hardcode
user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36'
url = 'https://shopee.com.my/api/v2/search_items/?by=relevancy&keyword=h370m&limit=50&newest=0&order=desc&page_type=search'
resp = requests.get(url, headers={
'User-Agent': user_agent
})
data = resp.json()
products = data.get('items')
欢迎使用 Whosebug! :)
作为替代方案,您可以检查 Selenium
查看文档中的示例用法:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
当您使用 requests
(或像 Scrapy 这样的库)时,通常 JavaScript 不会加载。正如@dmitrybelyakov 提到的,您可以使用 Selenium 回复这些呼叫或模仿正常的用户交互。