我尝试通过bs4抓取数据。对于每一页,我想把所有的产品id的,这是确定的,当我从第一页的数据,但从第二页开始,它总是显示第一页的产品id的。这是我的代码(虽然我改变了第五页):
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://tiki.vn/lam-sach-da-mat/c11232?sort=top_seller%3Fpage%3D5&page=5')
bs = BeautifulSoup(html, 'html.parser')
result =bs.find_all(lambda tag: tag.get('class') == ['product-item'])
这里是result of 5th page in my code
我想将第5页的产品ID作为this
我想得到第5页的产品ID,但不明白为什么我的代码仍然显示第一页的结果。
2条答案
按热度按时间8aqjt8rx1#
看起来,包括广告在内,有107种产品。下面是一种直接抓取API端点并获取所有产品的方法:
结果:
guicsvcw2#
顺便说一句,你可以用
soup.select_one('li > a.current[data-view-id="product_list_pagination_item"][data-view-label]').get('data-view-label')
这样的东西来检查actual page number of the html。说明:无论您将链接用于哪个页面,总是首先加载第一个页面,然后动态更新该页面(使用JavaScript和API)。您可以转到network tab on devtools [打开后可能需要刷新页面,并确保the "preserve log" option未选中],然后单击日志中第一个请求的[名称][其结尾应与地址栏中的链接相同] ;“响应”中的html是
requests.get
获取的内容-您可能会注意到this html is of the first page.如果滚动查看日志中的其他请求,您应该会找到一个指向
https://tiki.vn/api/personalish/v1/blocks/listings?limit=40&include=advertisement&aggregations=2&trackity_id=3dddf2b8-1eb2-e891-0cdf-c23b37663c28&category=11232&page=5&sort=top_seller%3Fpage%3D5&urlKey=lam-sach-da-mat
的请求和the products are probably loaded from this。所有参数PPEr都是固定的,或者可以在页面url中找到,**
trackity_id
**除外;如果查看request initiator chain,可以看到哪个JavaScript文件发出了请求,并且可以尝试找出trackity_id
是如何生成的;但就我个人而言,我发现使用selenium更容易。**建议的解决方案1:**看起来您实际上可以只使用已知的参数(
category
、urlKey
、sort
)来使用API:(我使用
cloudscraper
是因为我对urlopen
不是很熟悉,而且我也不擅长使用requests
设置正确的标题以避免403错误...)这将打印然而,我觉得应该有超过只有100个产品-分页与 selenium (下图)表明,应该有177个产品。
**建议的解决方案2:**您可以使用我编写的this function循环访问页面,以获取和解析html(使用selenium + bs 4)
而印刷的
(If您不希望限制为
maxPages
,您可以使用类似while True
的内容来代替for pn in range(maxPages)
,但是您还需要使用计数器或其他内容来获取pn
以获得ecx
,因为这是告诉函数等待,直到加载了html的该部分。)