Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python填充一个奇怪的Web表单_Python_Html - Fatal编程技术网

用python填充一个奇怪的Web表单

用python填充一个奇怪的Web表单,python,html,Python,Html,我正在尝试构建一个简单的程序,填充一个web表单,然后从结果网站中提取a数据,这应该是非常简单的,经过一个简短的web研究(主要来自此网站),我得出结论,python将是我的最佳选择。(使用urllib) 我将给出一个具体的例子,说明我正在尝试做什么,希望它能澄清一些事情: 假设我想要一个自动脚本来获取酒店的价格,该网站将是: 希尔顿酒店网站 在该网页中,我想填写如下查询:“你要去哪里”应该有N.Y.C和出发和到达日期 如果从浏览器中使用,我将在下一页获得一个包含我刚才填写的查询结果的列表,并从

我正在尝试构建一个简单的程序,填充一个web表单,然后从结果网站中提取a数据,这应该是非常简单的,经过一个简短的web研究(主要来自此网站),我得出结论,python将是我的最佳选择。(使用urllib)

我将给出一个具体的例子,说明我正在尝试做什么,希望它能澄清一些事情:

  • 假设我想要一个自动脚本来获取酒店的价格,该网站将是: 希尔顿酒店网站

  • 在该网页中,我想填写如下查询:“你要去哪里”应该有N.Y.C和出发和到达日期

  • 如果从浏览器中使用,我将在下一页获得一个包含我刚才填写的查询结果的列表,并从该网页中获取价格

  • 让我们假设可以从html源代码中删除数据

    嗯,我就是这么想的(非常笼统的描述…)

  • 首先,我在发送请求时遇到以下错误:“TypeError:POST数据应该是bytes或一个字节的iterable。它不能是str类型。”有人知道为什么吗

  • 如果我做对了,我会假设我会接受以下网站的回复。希尔顿大学网站,最后是urlencode部分(searchQuery=+纽约%2C+纽约&抵达日期=31+2013年10月+离开日期=04+2013年11月+11月)

  • 但是没有这样的网站(当我在浏览器url中键入完整地址时) 看起来所有的结果(不管你的查询是什么,也不管你如何填写表格)都出现在同一个网页上:希尔顿网站…en_US/hi/search/findhotels/results.htm?view=LIST

    那么我做错了什么?我认为这是填写网络表单的方法


    非常感谢您的帮助

    这里有一堆希尔顿酒店的搜索表单(我告诉过您如何获取,但无法将其全部粘贴到评论部分,所以就在这里),我忘了提到您应该检查Chrome tho中的“表单数据”原始数据,这是我的错。。无论如何

    原始数据(以便您了解POST请求的工作原理)

    请求头 表单数据 这些是您需要随每个搜索查询一起发送的键(而不是值):

    • 搜索查询
    • 到达
    • 出发日期
    • _灵活日期
    • 房间数
    • 成人人数%5B0%5D
    • 子项数%5B0%5D
    • 成人人数%5B1%5D
    • 子项数%5B1%5D
    • 成人人数%5B2%5D
    • 子项数%5B2%5D
    • 成人人数%5B3%5D
    • 子项数%5B3%5D
    • 促销代码
    • 组码
    • 法人
    • _旅行代理商
    • _阿拉特
    • _阿普拉特
    • _老年人
    • _政府利率
    • 讨厌的
    • 书本按钮
    • 搜索类型
    • roomKeyEnable
    这就是整个python构建的样子:

    from socket import *
    s = socket()
    
    POST = 'searchQuery=N.Y.C&arrivalDate=23+Oct+2013&departureDate=......'
    
    header = ''
    header += 'POST /en_US/hi/search/findhotels/index.htm?WT.bid=Home,,,find_button HTTP/1.1\r\n'
    header += 'Host: www3.hilton.com\r\n'
    header += 'Connection: keep-alive\r\n'
    header += 'Content-Length: ' + str(len(POST)) + '\r\n'
    header += 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n'
    header += 'Origin: http://www3.hilton.com\r\n'
    header += 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) \r\n'
    header += 'Chrome/30.0.1599.101 Safari/537.36\r\n'
    header += 'Content-Type: application/x-www-form-urlencoded\r\n'
    header += 'Referer: http://www3.hilton.com/en/index.html\r\n'
    header += 'Accept-Encoding: gzip,deflate,sdch\r\n'
    header += 'Accept-Language: en-US,en;q=0.8\r\n'
    header += '\r\n'
    
    s.connect(('www3.hilton.com', 80))
    s.send(header+POST)
    print(s.recv(8192))
    
    这会给你你想要的。 注意,我在标题中遗漏了cookie字段。。通常情况下,服务器不太关心它,因为这是一项古老的技术,服务器通常会假设如果没有提供cookie,只需给客户端新的cookie,并假设这是第一次访问,即使(技术上是这样的,但)它并不是真正的第一页

    另请注意:
    POST
    变量中的所有数据必须按如下方式进行URL编码:
    urlencode(key)=urlencode(val)&
    。请注意,我没有在这个原始帖子数据中对
    =
    &
    进行url编码


    这是您不需要担心的地方,因为urllib为您做了这件事。但这会让您了解HTTP请求的工作原理。

    规则#1:发送请求中的所有表单数据(即使是空的),否则服务器会讨厌您。规则2:你确定数据格式正确吗?(假设下拉列表中显示的文本不一定是发送到服务器的值。如果您使用的是Google Chrome,请单击菜单->工具->开发人员工具->(选项卡)网络->按发送搜索的希尔顿页面文件。现在,这应该会显示“请求标题”,并在右侧显示一个小文本,上面写着“显示源代码”,按下该键并查看您实际发送到服务器的内容。)您能解释一下,两个不同的QUAIRIS如何可能有相同的请求吗?简短回答:它们没有。它们的查询中不能有相同的数据。
    POST/page HTTP1.1
    是相同的,但数据不能是相同的。只是一个建议,您可以使用它浏览网站并选择/填写/提交表单。这是一个无头浏览器实现。所以我在上面的脚本中使用的“urlopen”功能(带有完整的查询参数)还不够吗?只能使用该函数完成吗?@user2910088可以使用
    urlopen
    完成,您只需向POST数据中添加更多参数(更具体地说,我上面列表中的所有项目,即使值为空)Hi,在添加完整的表单文件并将“数据”转换为字节后,我得到了某种响应,我打印了html=response.read()print(html)Hi的输出,在添加完整的表单文件并将“数据”转换为字节后,我得到了某种响应,我打印了html=response.read()print(html)的输出。我看到的是打印的html代码,就像我在浏览器中按“显示源代码”一样吗?它看起来不一样,虽然我正在寻找的价格,他们不能在该输出中找到。
    POST /en_US/hi/search/findhotels/index.htm?WT.bid=Home,,,find_button HTTP/1.1
    Host: www3.hilton.com
    Connection: keep-alive
    Content-Length: 475
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Origin: http://www3.hilton.com
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Content-Type: application/x-www-form-urlencoded
    Referer: http://www3.hilton.com/en/index.html
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: en-US,en;q=0.8
    Cookie: mmcore.tst=0.626; ClrCSTO=T; ClrSSID=1382526492268-11812; ClrOSSID=1382526492268-11812; ClrSCD=1382526492268; mmid=-1914085652%7CAQAAAAq0Q+DZtwkAAA%3D%3D; mmcore.pd=-1914085652%7CAQAAAAq0Q+DZtwkAAA%3D%3D; mmcore.srv=ldnvwcgus01; K3R7=3U24QMiCUbjeh65LoEI31TTjisY8czr4zkIUe06gsA4A5lc0bIKrEhQ; GWSESSIONID=qYDpSnSLNFnJ5CrJrwlSWW7CNBHL7vXSMndGmnxghGns1rLjt2lX!-1490734837; __atuvc=1%7C43; mm_pc_HHonorsPoints=false; mm_pers_storage=loggedin%3Ano%7CStayDuration%3A1-2%20nights%7CDaysToBooking%3A0-1%7CSatStay%3Ano%7CChildren%3Ano%7CBrand%3Ahi%7CHHonorsPoints%3Afalse%7CFlexDates%3Afalse%7CPromoCode%3Ano%7Cproperties8%3Ano%7Chotelcode%3Ano; WT_FPC=id=6f7c5181-8354-430b-b943-9bb95bf2c75c:lv=1382490515002:ss=1382490495203
    
    searchQuery=N.Y.C&arrivalDate=23+Oct+2013&departureDate=24+Oct+2013&_flexibleDates=on&numberOfRooms=1&numberOfAdults%5B0%5D=1&numberOfChildren%5B0%5D=0&numberOfAdults%5B1%5D=1&numberOfChildren%5B1%5D=0&numberOfAdults%5B2%5D=1&numberOfChildren%5B2%5D=0&numberOfAdults%5B3%5D=1&numberOfChildren%5B3%5D=0&promoCode=&groupCode=&corporateId=&_travelAgentRate=on&_aaaRate=on&_aarpRate=on&_seniorRate=on&_governmentRate=on&offerId=&bookButton=false&searchType=ALL&roomKeyEnable=true
    
    from socket import *
    s = socket()
    
    POST = 'searchQuery=N.Y.C&arrivalDate=23+Oct+2013&departureDate=......'
    
    header = ''
    header += 'POST /en_US/hi/search/findhotels/index.htm?WT.bid=Home,,,find_button HTTP/1.1\r\n'
    header += 'Host: www3.hilton.com\r\n'
    header += 'Connection: keep-alive\r\n'
    header += 'Content-Length: ' + str(len(POST)) + '\r\n'
    header += 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n'
    header += 'Origin: http://www3.hilton.com\r\n'
    header += 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) \r\n'
    header += 'Chrome/30.0.1599.101 Safari/537.36\r\n'
    header += 'Content-Type: application/x-www-form-urlencoded\r\n'
    header += 'Referer: http://www3.hilton.com/en/index.html\r\n'
    header += 'Accept-Encoding: gzip,deflate,sdch\r\n'
    header += 'Accept-Language: en-US,en;q=0.8\r\n'
    header += '\r\n'
    
    s.connect(('www3.hilton.com', 80))
    s.send(header+POST)
    print(s.recv(8192))