【问题标题】:requests.session to initialize session and input search termsrequests.session 初始化会话并输入搜索词
【发布时间】:2018-03-01 03:15:26
【问题描述】:

我正在尝试创建一个转到this website 的函数并在字段中输入邮政编码,然后执行逐项搜索,例如搜索框中的“鸡”。我是从这个开始的。

import requests
s = requests.session()
input_data = {"Register_ZipCode": "60637"}
r = s.post("https://shop.jewelosco.com/ecom/home", login_data)
r2 = s.get("https://shop.jewelosco.com/ecom/home")

在此之后,我想以某种方式保留上面的输入信息并运行如下搜索。

chicken = request.get("https://shop.jewelosco.com/ecom/search?source=searchBox&searchTerm=chicken")

我终于可以开始抓取 html 数据了。

我一直在检查邮政编码是否输入正确,以及如何使用该会话进行搜索,同时保留会话形成(位置)。

感谢任何建议!

【问题讨论】:

    标签: python python-3.x cookies web-scraping python-requests


    【解决方案1】:

    获取所需数据:

    查看页面源码,提交数据的表单(邮编)为:

    <form action="/ecom/account/sign-in" method="post">
        <input type="hidden" name="form" value="ZipCode" />
        <div class="field id-ZipCode">
            <input data-val="true" data-val-required="Zip Code is required." data-val-sdcexactlength="Zip Code must be 5 characters long." data-val-sdcexactlength-max="5" data-val-sdcexactlength-min="5" data-val-sdcnumeric="Zip Code must contain numeric characters only." data-val-sdcnumeric-pattern="^[0-9]*$" id="Register_ZipCode" maxlength="5" name="Register.ZipCode" placeholder="Enter Your Zip Code" type="text" value="" />
        </div>
        <div class="btn btn-getstarted  submit btn-round " onclick="javascript:trackLinkZipGetStarted();">
            <input class="submit btn-round " name="Browse" type="submit" value="    Get Started    "></input>
        </div>
    </form>
    

    我删除了一些 &lt;div&gt; 标签,因为它们无关紧要。

    从这个表格中,我们需要的信息是:

    1. URL = 'https://shop.jewelosco.com/ecom/account/sign-in'
    2. method="post" 意味着我们必须使用 requests.post()
    3. data = {'form': 'ZipCode', 'Register.ZipCode': '60637', 'Browse': ' Get Started '}

    注意:您必须使用name作为键和value作为值来提供表单数据中&lt;input&gt;标签中包含的所有值。)


    发送数据:

    发送邮政编码的代码:

    data = {'form': 'ZipCode', 'Register.ZipCode': '60637', 'Browse': '    Get Started    '}
    
    with requests.Session() as s:
        r = s.post('https://shop.jewelosco.com/ecom/account/sign-in', data=data)
    

    如果您检查响应历史记录和当前 url,您会看到它被重定向到 https://shop.jewelosco.com/ecom/home,这是我们要从中获取数据的 url。

    >>> r.status_code
    200
    >>> r.url
    https://shop.jewelosco.com/ecom/home
    >>> r.history
    [<Response [302]>]
    

    要检查我们是否已成功发布此数据,您可以使用:

    >>> 'Top Offers &amp; Shopping Tools' in r.text
    True
    

    搜索项目:

    现在我们已成功发布邮政编码,您可以使用此 Session 对象 (s) 搜索您想要的任何内容。

    完整代码:

    data = {'form': 'ZipCode', 'Register.ZipCode': '60637', 'Browse': '    Get Started    '}
    
    with requests.Session() as s:
        s.post('https://shop.jewelosco.com/ecom/account/sign-in', data=data)
        r = s.get('https://shop.jewelosco.com/ecom/search?source=searchBox&searchTerm=chicken')
        print('Perdue Chicken Ground Fresh - 16 Oz' in r.text)
        # prints 'True'
    

    【讨论】:

    • 我还有一个问题。当我运行它一次时,它运行良好,但是由于某种原因,当我再次调用确切的代码时,我现在得到一个 400 错误。知道为什么吗?
    • 实际上,我现在多次运行代码,没有任何错误。你确定你没有改变任何东西?如果您更改了搜索词,请首先检查链接是否在普通浏览器中有效。
    • 所以帖子每次都能正常工作,但 get 行给出 400 错误。代码完全相同。当我退出 ipython 终端并再次运行确切的代码时会发生这种情况。
    • 发生这种情况的唯一原因是您使用了错误的网址。错误的 url 会给出 400 错误代码。但是正如你所说的你没有改变代码,我不能说为什么会这样。您仍然收到错误消息吗?
    • 抱歉,您的代码没问题,问题是 Perdue Chicken 不在搜索结果中,因为广告已更改。非常感谢! :)
    猜你喜欢
    • 2012-06-15
    • 2015-11-18
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2016-12-16
    • 2021-10-15
    相关资源
    最近更新 更多