【问题标题】:requests post - and retry mechanism problem请求后重试机制问题
【发布时间】:2020-03-06 02:11:31
【问题描述】:

我的 webscraper 中有以下代码:

postbody = {'Submit': {}, 'czas_kon2': '', 'czas_pocz2': '', 'num_pacz': '', 'typ': 'wsz'}
post = requests.post(spolka, data=postbody)
data = post.text

我在一个循环中执行超过 400 个网页,以使用多处理(8 个进程)抓取数据。 data 应该包含整个 html 页面以进行进一步的 xml 处理。 但是在 400 页中,我得到了 2 页没有返回有意义的内容。我怀疑这是因为我创造了沉重的负担。我试过time.sleep(1), time.sleep(10),但没有运气。

如何确保 datapost 变量始终包含整个页面,例如 398 个工作页面?

我尝试了简单的 while 循环进行重试......但在额外尝试一次之后,它远非完美(我能够从剩余的 2 页中获得 1 页)。

 while len(data) < 1024:
        postbody = {'Submit': {}, 'czas_kon2': '', 'czas_pocz2': '', 'num_pacz': '', 'typ': 'wsz'}
        post = requests.post(spolka, data=postbody)
        data = post.text

【问题讨论】:

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


    【解决方案1】:

    我认为你应该添加一个请求标头。

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'}
    postbody = {'Submit': {}, 'czas_kon2': '', 'czas_pocz2': '', 'num_pacz': '', 'typ': 'wsz'}
    post = requests.post(spolka, data=postbody, headers=headers)
    

    以及更多标题示例:

    headers = {
    'Accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Host': 'www.google.com',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'X-Requested-With': 'XMLHttpRequest',
    'Cookies': '',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'
    }
    

    【讨论】:

    • 如果我的请求被识别为机器人并被禁止?
    • 你应该想想你为什么被识别,我很确定或者你的要求模拟不正确,所以你可以被识别为机器人,这是一个非常低级的错误,你应该想一想为什么浏览器能得到数据请求,而你为什么不能,答案只有一个,就是你听起来不像是浏览器请求模拟或者,合适的请求头,这样会让你更像浏览器
    猜你喜欢
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2021-04-02
    • 1970-01-01
    • 2021-03-29
    • 2022-08-19
    相关资源
    最近更新 更多