request-html找不到页面元素

时间:2019-07-05 21:24:42

标签: python cookies web-scraping python-requests-html

因此,我尝试导航至以下网址:>>> solve(eqs, var('x1:5')) {x4: (a*s + b*d + b*(e + l*s)*(m + n) + c - (-f - i*s)/j)/(-b*k*(m + n) + 1/j), x3: e + k*(a*s + b*d + b*(e + l*s)*(m + n) + c - (-f - i*s)/j)/(-b*k*(m+ n) + 1/j) + l*s, x1: (-f - i*s)/j + (a*s + b*d + b*(e + l*s)*(m + n) + c - (-f - i*s)/j)/(j*(-b*k*(m + n) + 1/j)), x2: d + (m + n)*(e + k*(a*s + b*d + b*(e + l*s)*(m + n) + c - (-f - i*s)/j)/(-b*k*(m + n) + 1/j) + l*s)} 并使用类https://www.instacart.com/store/wegmans/search_v3/horizon%201%25从div抓取数据。但是,有两个主要问题,第一个是instacart.com需要先登录才能访问该URL,第二个是大部分页面是使用javascript生成的。

我相信我已经解决了第一个问题,因为我的item-name item-row得到了200个响应代码。我也很确定session.post(...)应该通过在我抓取之前呈现javascript生成的html来解决第二个问题。不幸的是,尽管硒没有问题,但我的代码的最后一行仅返回一个空列表。有人知道为什么这行不通吗?

r.html.render()

1 个答案:

答案 0 :(得分:1)

使用requests模块和BeautifulSoup登录后,您可以使用我已经在注释中建议的链接来解析json中可用的必需数据。以下脚本将为您提供名称,数量,价格以及相关产品的链接。使用下面的脚本,您只能获得21个产品。在此json内容中有一个分页选项。您可以通过分页操作来获得所有产品。

import json
import requests
from bs4 import BeautifulSoup

baseurl = 'https://www.instacart.com/store/'
data_url = "https://www.instacart.com/v3/retailers/159/module_data/dynamic_item_lists/cart_starters/storefront_canonical?origin_source_type=store_root_department&tracking.page_view_id=b974d56d-eaa4-4ce2-9474-ada4723fc7dc&source=web&cache_key=df535d-6863-f-1cd&per=30"

data = {"user": {"email": "alexanderjbusch@gmail.com", "password": "password"},
        "authenticity_token": ""}
headers = {
    'user-agent':'Mozilla/5.0',
    'x-requested-with': 'XMLHttpRequest'
}
with requests.Session() as s:

    res = s.get('https://www.instacart.com/',headers={'user-agent':'Mozilla/5.0'})
    soup = BeautifulSoup(res.text, 'lxml')
    token = soup.select_one("[name='csrf-token']").get('content')

    data["authenticity_token"] = token

    s.post("https://www.instacart.com/accounts/login",json=data,headers=headers)
    resp = s.get(data_url, headers=headers)

    for item in resp.json()['module_data']['items']:
        name = item['name']
        quantity = item['size']
        price = item['pricing']['price']
        product_page = baseurl + item['click_action']['data']['container']['path']
        print(f'{name}\n{quantity}\n{price}\n{product_page}\n')

部分输出:

SB Whole Milk
1 gal
$3.90
https://www.instacart.com/store/items/item_147511418

Banana
At $0.69/lb
$0.26
https://www.instacart.com/store/items/item_147559922

Yellow Onion
At $1.14/lb
$0.82
https://www.instacart.com/store/items/item_147560764