繁体   English   中英

Python 漂亮的汤 etsy 刮板没有收集所有项目

[英]Python beautiful soup etsy scraper is not gathering all items

在 4 年的中断后刚刚拿起蟒蛇。 我想用美丽的汤库练习一些网络抓取。 这有点痛苦,因为我不得不同时学习基本的 html/css,但最终我想起了编码的兴奋(和沮丧)。

无论如何,我的soup.findAll()方法似乎只获取所需列表的 48/50。 我不确定这是否是由于列表长度的某些限制、不正确的方法重载或 lxml 解析器中的错误造成的。

我专门包含了按价格对列表进行排序的网页,这样我就可以检查生成的 .csv 文件中是否有丢失的项目。 这似乎是省略的最后两个列表,这让我相信这是一个列表长度问题。

任何建议表示赞赏,欢迎我的问题之外的任何其他提示! 谢谢!

#import Dependencies
from bs4 import BeautifulSoup
import requests

url = 'https://www.etsy.com/search?q=knitted+Toe&explicit=1&order=price_desc'
response = requests.get(url) #request http Data at URL
soup=BeautifulSoup(response.content,'lxml') #parse the data with lxml data parser
#Find all containers in divs with classes named item-container that hold item objects and store them into a list
containers = soup.findAll("div", {"class":"js-merch-stash-check-listing"})

print("-----------------------------------------------------------------------------------------------------------")
print("Search Term:\n"+'"'+soup.h1.text+'"\n') #print <h1> tag contents text
print("Items: ",len(containers)) #print length of container
print("-----------------------------------------------------------------------------------------------------------")

#print(containers[0].a)
container=containers[0]

#CSV data input methods
filename = "EtsyProducts.csv"
f = open(filename,"w")
headers = "Brand, Product Name, Cost, Product Page\n"
f.write(headers)

for container in containers:
    brand_container = container.findAll("div", {"class":"v2-listing-card__shop"})
    brand = brand_container[0].p.text  #Call subclasses of container object 
    cost_container= container.findAll("span", {"class":"currency-value"})
    cost= cost_container[0].text
    product_name = container.a.h3.text.strip()
        
    urlContainer = container.find('a', href=True)
    productPage = urlContainer['href']
        
    print('===========================================================================================================')
    print("Brand: "+brand)
    print("Name: "+product_name)
    print("Price: "+cost+"\n")
    print("URL: "+productPage.strip());
    #sleep(randint(3,10))
    
    f.write(brand + "," + product_name.replace(",","|") + "," + cost + "," + productPage + "\n")
        
f.close() #Close CSV

这不是解析 HTML 时的错误,而只是 Etsy 页面针对支持 JavaScript 的浏览器进行优化的副作用。

from bs4 import BeautifulSoup
import requests

url = 'https://www.etsy.com/search?q=knitted+Toe&explicit=1&order=price_desc'
response = requests.get(url) #request http Data at URL
print(response.text.count("js-merch-stash-check-listing"))

# 48

Etsy 的初始 HTML 响应确实包含 48 个项目。 您可以通过将response.text保存到文件并在浏览器中打开该 html 文件来验证这一点。 您将看到一个 12 行 4 列的网格。

该页面包含浏览器通过 AJAX 加载更多信息的 JS 指令(可能基于显示大小),这就是额外条目的显示方式。

也就是说,你的代码都是正确的。 如果您希望从抓取中获取更多结果,您可能需要对 Etsy API 进行逆向工程,因为这是您的浏览器用来呈现所有 50 个结果的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM