Для примера возьмем baidu.com. Для других сервисов алгоритм будет примерно такой же.
Сначала нужно найти URL, который возвращает те самые подсказки при вводе слова в строку поиска. Для этого я воспользуюсь Инструментами разработчика в Chrome.
Итак, имея запрос и зная, как выглядит результат, делаем пресет на основе
Net::HTTP, с разбором JSON и выводом только подсказок, используя возможности шаблонизатора. Также с помощью tools.query.add можно реализовать подстановку полученных подсказок обратно в запросы, т.е. парсинг в глубину (в примере 2).
Пример результата:
Сначала нужно найти URL, который возвращает те самые подсказки при вводе слова в строку поиска. Для этого я воспользуюсь Инструментами разработчика в Chrome.
- Открываем http://www.baidu.com/ в браузере.
- Пишем любой запрос, например test
- Открываем Инструменты разработчика (Ctrl+Shift+I), переключаемся на вкладку Network.
- Ставим курсор в строку поиска, можно дописать какой-то символ (например пробел). Главное, чтобы отобразились подсказки.
- В Инструментах видим отправленные запросы. Ищем тот, который возвращает подсказки.
- На скрине выделено как раз то, что нам надо (первый запрос). Рекомендую для удобства убрать из запроса лишние параметры, поэксперементировав с ним в браузере. Но делать это нужно с особой внимательностью, т.к. бывает, что убрав некоторые параметры, результат становится совсем другим. В примере запрос выглядит так:
Код:http://suggestion.baidu.com/su?wd=test&sugmode=2&json=1&p=3&sid=18881_18728_1431_18241_18878_12825_18730_18767_18777_18546_18779_17000_18782_17073_15729_11820_17999_10633&req=2&bs=test&pbs=test&csor=4&cb=jQuery11020484825603896752_1452509913872&_=1452509913893 - После сокращения он будет выглядеть так:
Код:http://suggestion.baidu.com/su?wd=test&json=1&req=2&bs=test&pbs=test
По сути это JSON, но заключенный в круглые скобки.window.baidu.sug({"q":"test","p":false,"bs":"test","csor":"0","g":[ { "q": "testing", "t": "n", "st": { "q": "testing", "new": 0 } }, { "q": "test 汇编", "t": "n", "st": { "q": "test 汇编", "new": 0 } }, { "q": "testin云测试平台", "t": "n", "st": { "q": "testin云测试平台", "new": 0 } }, { "q": "testng", "t": "n", "st": { "q": "testng", "new": 0 } }, { "q": "testerhome", "t": "n", "st": { "q": "testerhome", "new": 0 } }, { "q": "test()", "t": "n", "st": { "q": "test()", "new": 0 } }, { "q": "test js", "t": "n", "st": { "q": "test js", "new": 0 } }, { "q": "testlink", "t": "n", "st": { "q": "testlink", "new": 0 } }, { "q": "testflight", "t": "n", "st": { "q": "testflight", "new": 0 } }, { "q": "testo", "t": "n", "st": { "q": "testo", "new": 0 } } ],"s":["testing","test 汇编","testin云测试平台","testng","testerhome","test()","test js","testlink","testflight","testo"]});
Итак, имея запрос и зная, как выглядит результат, делаем пресет на основе
Net::HTTP, с разбором JSON и выводом только подсказок, используя возможности шаблонизатора. Также с помощью tools.query.add можно реализовать подстановку полученных подсказок обратно в запросы, т.е. парсинг в глубину (в примере 2).
Код:
eyJwcmVzZXQiOiJCYWlkdSBzdWdnZXN0cyIsInZhbHVlIjp7InByZXNldCI6IkJh
aWR1IHN1Z2dlc3RzIiwicGFyc2VycyI6W1siTmV0OjpIVFRQIiwiZGVmYXVsdCIs
eyJ0eXBlIjoib3ZlcnJpZGUiLCJpZCI6Imdvb2RDb2RlIiwidmFsdWUiOjIwMH0s
eyJ0eXBlIjoiY3VzdG9tUmVzdWx0IiwicmVzdWx0IjoiZGF0YSIsInJlZ2V4Ijoi
XFwoKC4rPylcXCk7IiwicmVnZXhUeXBlIjoiIiwicmVzdWx0VHlwZSI6ImZsYXQi
LCJhcnJheU5hbWUiOiIiLCJyZXN1bHRzIjpbImpzb25kYXRhIl19XV0sInJlc3Vs
dHNGb3JtYXQiOiJbJSBsZXZlbCA9IDI7ICNcdTA0MTNcdTA0M2JcdTA0NDNcdTA0
MzFcdTA0MzhcdTA0M2RcdTA0MzAgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQxXHUw
NDQyXHUwNDMwXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDM4IFx1MDQzZlx1
MDQzZVx1MDQzNFx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzYSwg
MCBcdTA0MzRcdTA0M2JcdTA0NGYgXHUwNDNlXHUwNDQyXHUwNDNhXHUwNDNiXHUw
NDRlXHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDM4XHUwNDRmXG5cbiNcdTA0MTJcdTA0
NGJcdTA0MzJcdTA0M2VcdTA0MzQgXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDQxXHUw
NDNhXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDNhXG5qc29uID0gdG9vbHMucGFyc2VK
U09OKHAxLmpzb25kYXRhKTtcbklGIGpzb24ucy5zaXplID4gMDtcblx0anNvbi5z
LmpvaW4oXCJcXG5cIikgXyBcIlxcblwiO1xuRU5EO1xuXG4jXHUwNDFmXHUwNDNl
XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNh
XHUwNDMwIFx1MDQzZlx1MDQzZVx1MDQzNFx1MDQ0MVx1MDQzYVx1MDQzMFx1MDQz
N1x1MDQzZVx1MDQzYSBcdTA0MzIgXHUwNDM3XHUwNDMwXHUwNDNmXHUwNDQwXHUw
NDNlXHUwNDQxXHUwNDRiXG5GT1JFQUNIIHN1ZyBJTiBqc29uLnM7XG5cdHRvb2xz
LnF1ZXJ5LmFkZChzdWcsIGxldmVsKTtcbkVORCAlXSIsInJlc3VsdHNTYXZlVG8i
OiJmaWxlIiwicmVzdWx0c0ZpbGVOYW1lIjoiJGRhdGVmaWxlLmZvcm1hdCgpLnR4
dCIsImFkZGl0aW9uYWxGb3JtYXRzIjpbXSwicmVzdWx0c1VuaXF1ZSI6Im5vIiwi
cXVlcnlGb3JtYXQiOlsiaHR0cDovL3N1Z2dlc3Rpb24uYmFpZHUuY29tL3N1P3dk
PSRxdWVyeSZqc29uPTEmcmVxPTImYnM9JHF1ZXJ5JnBicz0kcXVlcnkiXSwidW5p
cXVlUXVlcmllcyI6ZmFsc2UsInNhdmVGYWlsZWRRdWVyaWVzIjpmYWxzZSwiaXRl
cmF0b3JPcHRpb25zIjp7Im9uQWxsTGV2ZWxzIjp0cnVlLCJxdWVyeUJ1aWxkZXJz
QWZ0ZXJJdGVyYXRvciI6ZmFsc2UsInF1ZXJ5QnVpbGRlcnNPbkFsbExldmVscyI6
ZmFsc2V9LCJyZXN1bHRzT3B0aW9ucyI6eyJvdmVyd3JpdGUiOmZhbHNlfSwiZG9M
b2ciOiJubyIsImtlZXBVbmlxdWUiOiJObyIsIm1vcmVPcHRpb25zIjpmYWxzZSwi
cmVzdWx0c1ByZXBlbmQiOiIiLCJyZXN1bHRzQXBwZW5kIjoiIiwicXVlcnlCdWls
ZGVycyI6W10sInJlc3VsdHNCdWlsZGVycyI6W10sImNvbmZpZ092ZXJyaWRlcyI6
W119fQ==
Пример результата:
test 汇编
testin云测试平台
test()
testing
testng
test1
testerhome
test js
testlink
testflight
testlink下载
testlink 安装
testlink使用教程
testlink导出excel
testlink汉化
testlink jira集成
testlink导入excel
testlink和禅道能够集成嘛
testlink excel
testlink1.9.14
test 汇编指令
test al,80h 汇编
test 汇编命令
test汇编
js test()
jquery test()
test和exam的区别
python test()
jquery test() ie8不兼容
test 正则表达式
test() val()
test()和test()
test()验证身份证号
test(3,7,7)
test123
test1.5
test1.5是什么软件
test11
test10095
test10097
test1 completed
test101
新概念2test1
test40011
testlink下载安装
testlink1.9.14
testlink安装 linux
testlink下载后怎么运行
testlin下载
testflight怎么用
testflight 内部测试
testflight外部测试
testflight审核要多久
testflight invitation code
testflight构建版本
test flight内部测试 版本选不上
test flight邀请码过期
testflight app怎么用
testflight 开发商证书已失效
test() js
test json
js test()
test jstl
test是什么意思
tests
teststand
testspeed
teststand中文教程
test汇编指令
testin云测试
testin云测试平台
...