用python填充一个奇怪的Web表单
我正在尝试构建一个简单的程序,填充一个web表单,然后从结果网站中提取a数据,这应该是非常简单的,经过一个简短的web研究(主要来自此网站),我得出结论,python将是我的最佳选择。(使用urllib) 我将给出一个具体的例子,说明我正在尝试做什么,希望它能澄清一些事情:用python填充一个奇怪的Web表单,python,html,Python,Html,我正在尝试构建一个简单的程序,填充一个web表单,然后从结果网站中提取a数据,这应该是非常简单的,经过一个简短的web研究(主要来自此网站),我得出结论,python将是我的最佳选择。(使用urllib) 我将给出一个具体的例子,说明我正在尝试做什么,希望它能澄清一些事情: 假设我想要一个自动脚本来获取酒店的价格,该网站将是: 希尔顿酒店网站 在该网页中,我想填写如下查询:“你要去哪里”应该有N.Y.C和出发和到达日期 如果从浏览器中使用,我将在下一页获得一个包含我刚才填写的查询结果的列表,并从
非常感谢您的帮助这里有一堆希尔顿酒店的搜索表单(我告诉过您如何获取,但无法将其全部粘贴到评论部分,所以就在这里),我忘了提到您应该检查Chrome tho中的“表单数据”原始数据,这是我的错。。无论如何 原始数据(以便您了解POST请求的工作原理) 请求头 表单数据 这些是您需要随每个搜索查询一起发送的键(而不是值):
- 搜索查询
- 到达
- 出发日期
- _灵活日期
- 房间数
- 成人人数%5B0%5D
- 子项数%5B0%5D
- 成人人数%5B1%5D
- 子项数%5B1%5D
- 成人人数%5B2%5D
- 子项数%5B2%5D
- 成人人数%5B3%5D
- 子项数%5B3%5D
- 促销代码
- 组码
- 法人
- _旅行代理商
- _阿拉特
- _阿普拉特
- _老年人
- _政府利率
- 讨厌的
- 书本按钮
- 搜索类型
- roomKeyEnable
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))