根据位置抓取亚马逊价格时,cookie 随机无法保留位置信息?

Posted

技术标签:

【中文标题】根据位置抓取亚马逊价格时,cookie 随机无法保留位置信息?【英文标题】:When scraping amazon prices based on locations, cookies randomly fail to retain the location info? 【发布时间】:2017-05-05 06:33:29 【问题描述】:

说明

    我正在抓取亚马逊产品价格,我需要更改所选地址(也称为送货地址),以便抓取同一产品在不同位置(可能不同)的价格。

    我已经在这个项目上工作了几个月,我发现与我抓取的其他网站不同,它们通过 javascript 请求将价格信息返回到他们的服务器,并给出相关参数,包括 skuid、productid 和当然是位置;亚马逊不会这样做以返回其价格信息。看起来它只是请求整个 html 页面,价格是其中的一部分。正因为如此,没有简单的方法可以通过简单地在对服务器的 javascript 请求中指定不同的位置参数来抓取不同位置的价格。据我所知,亚马逊根据所选地址返回价格信息,该地址由 cookie 识别。这也是我的抓取策略。

    我尝试在我的网络浏览器上加载亚马逊并手动检索 Chrome 网络中的 cookie,选择不同的位置,以便我可以在我的脚本中使用这些 cookie 来检索不同的价格。(我在这里所做的假设是位置信息存储在 cookie 中。)

    有点用,我可以使用不同的 cookie 获取不同的价格。

症状

在我尝试这种只抓取几个请求的方式后,问题就出现了。 在使用每个保存的 cookie 请求亚马逊页面的第一个周期时,一切正常。但是在那之后,使用我之前保存的两个不同位置的cookie发送请求会返回相同的价格(应该不同),我查看页面源代码发现选择的地址也相同(即毫不奇怪,因为价格是一样的。)

期望的结果

这里的最终目标是能够从亚马逊页面上抓取基于位置的价格。当前的目标是,之前手动保存的 cookie 将有助于根据所需位置取回不同的页面源代码。

会发生什么

使用手动保存的 cookie 请求亚马逊页面似乎在一个请求周期后停止工作,不同的 cookie 返回相同的价格/位置信息。

注意

请注意,我们可以只关注所选地址,因为价格是所选地址的函数。所以我下面的代码会尝试打印出选定的地址并省略价格。

代码

headers = 
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
#location:ShangHai, price:17,999 
#,'Cookie':'x-wl-uid=1DpDBnhSVJ+bNXzDZYpD4q7+iDfJ6GQATOxQy6bH2BnaDE4n/i4aKzzAQ0HKWvjhi4SmEwEIuSuA=; session-token=eYnxCsjigX0nCy8skngiSDkvjfEZlKavU9mTR8e9EP1Lh0pg4oYpoBxP3adQe7vZE9IDvl7xeLN+H5WF25TVXNTTywA3/Y82cuN+a2CdJs1L57Mzvwq7aLrbwtYQJfG2e1WP5/EXrV7oE02b8TB7KJA36q4w351NbUttqmq/yVrJQj7CZ+HMYcIsoxH2Ux8awhZ9jsROFJcaLmtcy+6muoLrtYQpa/QX230yKBQA90lu+D9jtd46BQ==; csm-hit=s-ZAYA2VY7F5MBZA6VKTTQ|1482202685913; ubid-acbcn=453-6620157-1313521; session-id-time=2082729601l; session-id=455-5193383-6307663'
#location: BeiJing price:15,999
,'Cookie':'x-acbcn=EwNBz6OLTIFDxQCv1qiUE4m16A00AUKs; at-main=Atza|IwEBINcqsHbV-1tFBCYlshzjTAyv5Z4msKVZ0rbOATXYrjE7AcoO3LSnYDzYpZcY2C4WP3oOPIlqWLWh9UcAzDHu6Xv6xcdbCW7jQ59cifSfpYiv3UQ0qR5Hk2VJjX0dcrsdgJUw-TWW8ZWLLhs2Z_CTD7Mphdn9fgvg7qnREuayGRpxekotq9lRXxeqJn3-IfoanhF9edDc0MYk2jTDtJv0AiJp71Wwo6PsNRTwwCg0JS69-H5QYeRbXfFSP-dTtVSGzB-MgVo4zX6dRSmYQ12_rjbfZa7ihj0s-3KtBFLnVP-R91VJrvDwMBSjfcyJHL734UfSrN6D6c1MCq76NoM-MpzmKncsn3n7Ruhnxork43k0onNA0jTl4SD1UDQ8dweuxP6FN0O7eTrWTaBkP_isuiDI; sess-at-main="Wyf/mENo8M2ZhLuc1RWCf++uvPG19jd3RE0X61PIhrk="; x-wl-uid=12Hr4lOV8Md2tj2Tjdg***VGb5aL6MrEz19aI0yHjr7FY8N3HsTCe29HlZhe4NCBbeDw2KuN5ShkJajzdy70eGSYuSAIda2OF1CcLpnHo+Bd7mvKvVqTsj1pNwri9d8E2lMOUplbiuZ8=; session-id-time-cn=1482739200l; session-id-cn=452-5760864-5873122; session-token=h1J7fMqt9UYrlp3EVScY8zWkFsNT7oGwBzJLHkKb8ChGVAMO/6quZxt9R24wwGPUCc4BPFLofrOQ5ZG9Jf9KQ5Y7j6XhKqlUh9j3g60qdVTgNSM6gY+eERRbI7iWTLGXQwEBB9LOx49+htkQIMfw1coTjYn50RlfUeeuW9dE8Db937LkwRFJe1ewcyebJZ713u/9HGAFQvCwatOslgNVHrpWOPGW91OUqhkYdW9wS6G46ScDqefXu2tRqWL8mOKn7t4wdMGqaF8=; csm-hit=YWXGRBPABQJZHSN0TYMN+s-88A1TVR7SK2BG3FDDW2M|1482139543670; ubid-acbcn=453-1347853-1253656; session-id-time=2082729601l; session-id=452-5760864-5873122'
#location: ShenZhen price:17,999 
#,'Cookie':'x-wl-uid=1SGKhC3F2g+mtZV/OFWnOwBOuLf8I+HnSJZOyHVbtVHXhyEkpj6cGqURI4kbZl/A7I3J2/0ByMc4=; session-token=TnIBK9s4/NJRHfHVd9gnxg4EA9GZ6wGk9AdAwc1tC5YNWYxS4S9p1IloF+Ex5lQ7O/4DlGB2WpPT7OdrCn/wyhNqLkTUB9ChdqvX3dw0UZW/Rhxsy8gTbdq5BrWCoHIL8y24sAM47Y7YZeAy6MAu9tXxH9wEtb4CF2BqTsp/B3hjGxkNuKwA8tQ1pEAZhnkzFx6tIdAfIvNWCN3c7NmbCoLRELpprDAbYrlLL/ik6lKvBvawLzAqng==; csm-hit=6CE5VNWDNAEMSWZT2VJJ+s-1BMM2C5SJPJV4B4RGMH7|1482205167978; ubid-acbcn=453-9465199-8612643; session-id-time=2082729601l; session-id=456-0427731-7194850'
#location: SuZhou, price:13,999
#,'Cookie':'x-wl-uid=1SGKhC3F2g+mtZV/OFWnOwBOuLf8I+HnSJZOyHVbtVHXhyEkpj6cGqURI4kbZl/A7I3J2/0ByMc4=; session-token=TnIBK9s4/NJRHfHVd9gnxg4EA9GZ6wGk9AdAwc1tC5YNWYxS4S9p1IloF+Ex5lQ7O/4DlGB2WpPT7OdrCn/wyhNqLkTUB9ChdqvX3dw0UZW/Rhxsy8gTbdq5BrWCoHIL8y24sAM47Y7YZeAy6MAu9tXxH9wEtb4CF2BqTsp/B3hjGxkNuKwA8tQ1pEAZhnkzFx6tIdAfIvNWCN3c7NmbCoLRELpprDAbYrlLL/ik6lKvBvawLzAqng==; csm-hit=6CE5VNWDNAEMSWZT2VJJ+s-30EVQ4E6P9Y51PV6WGMW|1482205288109; ubid-acbcn=453-9465199-8612643; session-id-time=2082729601l; session-id=456-0427731-7194850'
,'Host':'www.amazon.cn'
,'X-Requested-With':'XMLHttpRequest'

url = 'https://www.amazon.cn/TCL-%E7%8E%8B%E7%89%8C-L65C2-CUDG-65%E8%8B%B1%E5%AF%B8-%E6%96%B0%E7%9A%84HDR%E6%8A%80%E6%9C%AF-%E5%85%A8%E6%96%B0%E7%9A%84%E9%87%8F%E5%AD%90%E7%82%B9%E6%8A%80%E6%9C%AF-%E9%BB%91%E8%89%B2/dp/B01FXB0ZG4/ref=sr_1_2?ie=UTF8&qid=1476165637&sr=8-2&keywords=L65C2-CUDG'

def getAddress(url):
      response = requests.get(url,headers = headers)
      tree = html.fromstring(response.content)
      xpath = '//span[@id="ddmSelectedAddressText"]'
      print(tree.xpath(xpath)[0].text)

getAddress(url)

另外,更清楚地说,这里有 4 个位置,您可以通过上面的 4 个 cookie 进行验证,基本上我所做的就是注释掉其他三个并将一个留在标题中并调用 getAddress(url)

我认为这对于那些尝试做同样事情(根据不同位置刮价格)的人来说可能是一个常见问题。任何想法将不胜感激!另外,我提到了我的最终目标,因此实现相同结果的新方法也与这个问题有关。

【问题讨论】:

您最好自己发出 ajax 请求来设置位置。会话 cookie 很可能会过期。因此随机失败。 从在 Chrome 中浏览亚马逊的经验来看,您选择的地址将持续数天,我认为 cookie 没有过期。根据ajax请求方法,我确实尝试过使用带有selenium的Chromedriver来完成任务,但是速度不符合我的项目要求,而且我发现chromedriver往往不稳定。不过,感谢您的回答。 会话 cookie 不是它们验证的唯一方式——它也是各种浏览行为的组合。 RE Chromedriver,我建议您改用 PhantomJS 服务器。它要快很多数量级。 (记得使用普通的 PhantomJS 实例) 您介意详细说明各种浏览行为可能指的是什么吗?因为我选择了以这种方式进行刮擦。事实上,我首先使用 PhantomJS 是因为它在速度方面享有盛誉,但由于我无法确定的原因,它的运行速度甚至比 ChromeDriver 还要慢。使用无头浏览器也很难调试。 【参考方案1】:

我终于弄清楚了问题所在并解决了它。耶!就这样吧。

1.我所做的假设是正确的,即 cookie 帮助亚马逊确定您选择的地址,事实证明实际上不止于此,cookie 单独可以完成这项工作。

2. 我得到 cookie 随机无法保留所选地址信息的结果的原因是,对于每个 cookie 都有这个 session-id 值,正如您在上面代码中的最后一个 cookie 中注意到的那样,我只是为了方便将它放在这里。不知何故,我得到了这两个以相同会话 ID 失败的 cookie。 一旦我在 Chrome 中清除我的 cookie 并为故障 cookie 获取一个具有不同会话 ID 的新 cookie,一切都会正常工作。

3. 但是,我对 session-id 如何帮助确定所选地址信息只有一个模糊的概念,因此,如果有人能解释亚马逊如何准确地使用此 session-id 返回一个所选地址而不是另一个地址,那就太好了很棒。

#location: ShenZhen, price: 17,999
'Cookie':'session-id=456-0427731-7194850, other parts = other parts'
#location: SuZhou, price: 13,999
'Cookie':'session-id=456-0427731-7194850, other parts = other parts'

【讨论】:

感谢@Sam Chan 这个解决方案。这对我来说效果很好,因为我必须从各种亚马逊市场上刮下来。 这些会话 cookie 通常有效多长时间? @nasaa 你能调查一下吗? 我在做一个类似的项目,我也很想知道 session-id 的有效期是多久?有什么规则可以让我知道吗? @JerryParker,您很可能无法确定会话 ID 的有效时间,因为这由您正在抓取的网站的后端控制。您可以尝试验证它,如果无效则重新创建一个。 @SamChan,您是否有更多关于如何在不手动输入会话 ID 的情况下自动化此过程(位置更改)的信息,我也注意到它不适用于所有请求。有时即使我们有 fress session-id,它仍然会显示来自错误位置的信息

以上是关于根据位置抓取亚马逊价格时,cookie 随机无法保留位置信息?的主要内容,如果未能解决你的问题,请参考以下文章

使用scrapy抓取电子商务

使用 URL PHP 抓取亚马逊产品数据 [重复]

网站爬取-案例四:知乎抓取(COOKIE登录抓取个人中心)(第一卷)

抓取速度提升 3 倍,Python 的这个内置库你用上了吗?

二级等保二级等保怎么做?价格怎么样?贵吗?

二级等保二级等保怎么做?价格怎么样?贵吗?