使用BeautifulSoup获取Google Shopping商品图片src遇到问题
解决Google Shopping爬取图片返回占位GIF的问题
你遇到的是懒加载机制导致的问题——Google Shopping初始加载时会给img标签的src设置占位GIF,真实图片地址实际存放在data-src属性里,而非src。
方法一:直接提取懒加载属性
修改代码中获取图片链接的部分,把src替换为data-src即可,同时保留src作为 fallback 避免异常:
import requests from bs4 import BeautifulSoup as bs from rich import print def gg_shopping(query): headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'} s = requests.Session() s.headers.update(headers) big_list = [] search = query.replace(' ', '+') r = s.get(f'https://www.google.com/search?q={search}&tbm=shop') soup = bs(r.text, 'lxml') all_prods = soup.find_all('div', 'sh-dgr__gr-auto') for prod in all_prods: link = "https://www.google.com" + str(prod.find('a').get('href')) # 优先取data-src,不存在则用原src img = prod.find('img').get('data-src', prod.find('img').get('src')) print(img) def main(): gg_shopping("may tinh") if __name__ == "__main__": main()
方法二:从页面内嵌JSON提取(更稳定)
Google会把商品的完整结构化数据放在页面的script标签中,解析这些JSON能拿到更准确的图片、价格等信息,还能避免HTML结构变动带来的失效问题:
import requests import json from bs4 import BeautifulSoup as bs from rich import print def gg_shopping(query): headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'} s = requests.Session() s.headers.update(headers) search = query.replace(' ', '+') r = s.get(f'https://www.google.com/search?q={search}&tbm=shop') soup = bs(r.text, 'lxml') # 遍历script标签,找到包含商品数据的内容 for script in soup.find_all('script'): script_content = script.string if script_content and 'shoppingData' in script_content: # 截取JSON格式的部分(需根据实际返回内容调整截取逻辑) start_idx = script_content.find('{') end_idx = script_content.rfind('}') + 1 try: shopping_data = json.loads(script_content[start_idx:end_idx]) # 从JSON中提取图片链接(路径需根据实际结构调整) for item in shopping_data.get('items', []): img_url = item.get('image', {}).get('src') if img_url: print(img_url) except json.JSONDecodeError: continue return def main(): gg_shopping("may tinh") if __name__ == "__main__": main()
注意:Google的页面结构和内嵌JSON格式可能随时调整,第二种方法需要你根据实际返回的HTML内容,微调JSON的提取路径。
内容的提问来源于stack exchange,提问作者Dung8466
相关产品推荐
相关产品推荐

