Форум сайта python.su
857
bwпрочитай страницу, которую он пытается распарсить
Да причём здесь обфускация, которую вы к тому же с упаковкой путаете.
Pa-H;m=Ia;l=Ca;break;case "ut":t=Qa-H;m=Ja;l=Da;break;default:t=Ma,m=K,l=za}var p=a.snw&&a.snw();p&&(l+=p+m);var p=x,z=v("gbg1");z&&(p+=z.clientWidth+m);(s=v("gbg3"))&&(p+=y+m);var S=v("gbgs4dn");q&&!S&&(p+=q.clientWidth+m);var da=v("gbd4"),T=v("gb_71");T&&!da&&(p+=T.clientWidth+m+K);p=Math.min(Ta,p);l+=t;var O=v("gbqfbw"),I=v("gbq4");I&&(l+=I.offsetWidth);O&&(O.style.display="",l+=O.clientWidth+Ra);var I=f-l,ea=v("gbqf"),fa=v("gbqff"),h=a.gpcc&&a.gpcc();if(ea&&fa&&!h){h=f-p-l;switch(N){case "ut":h=Math.min(h,wa);h=Math.max(h,ra);break;case "ty":h=Math.min(h,va);h=Math.max(h,qa);break;case "xl":h=Math.min(h,ua);h=Math.max(h,J);break;case "xxl":h=Math.min(h,ta);h=Math.max(h,J);break;default:h=Math.min(h,sa),h=Math.max(h,J)}ea.style.maxWidth=h+"px";fa.style.maxWidth=h+"px";I-=h}var g=v("gbgs3");if(g){var N=I<=Sa,ga=a.cc(g,"gbsbc");N&&!ga?(a.ca(g,"gbsbc"),a.close()):!N&&ga&&(a.cr(g,"gbsbc"),a.close())}g=I;z&&(z.style.display="",g-=z.clientWidth+m);s&&(s.style.display="",g-=s.clientWidth+m);q&&bwзачем создавать браузерное окружение, если нужно просто получить текст, выдаваемый скриптом ?
Готовый интерпретатор JS это конечно хорошо, но ещё вам потребуется 40kloc и год работы (при хорошем изначальном скиле) что бы воссоздать хоть какое-то достаточное браузерное окружение.
sanodinсохрани её на диск, зачем коннектиться каждый раз ? коннектиться будешь, когда сделаешь всё
да пока тестировал, меня перестали пускать к этой странице, надеюсь временно
Отредактировано py.user.next (Сен. 27, 2013 22:56:04)
Офлайн
20
> любой браузер, написанный на python, делает это
Браузер на Python :-). Можно посмотреть на один :-) ?
Вообще WebKit может спасти, иногда. Но хотя бы то что все биндинги (ну может не все, не очень с состоянием дел на сегодня знаком) требуют графическую морду (X11 или что-нибудь ещё), я считаю очень большим недостатком, по весу, по скорости, по зависимостям… Теоретически можно соорудить заглушку GUI для WebKit, но на сколько это реально практически – не знаю.
> прочитай страницу, которую он пытается распарсить
Прочитал, не очень конечно красиво, но логика кода легко прослеживается (другой фрагмент):
// ... function ca(a, b, c) { var d = "on" + b; if (a.addEventListener) a.addEventListener(b, c, !1); else if (a.attachEvent) a.attachEvent(d, c); else { var g = a[d]; a[d] = function () { var a = g.apply(this, arguments), b = c.apply(this, arguments); return void 0 == a ? b : void 0 == b ? a : b && a } } } // ...
Офлайн
31
“любой браузер, написанный на python, делает это”- это я имел ввиду ,что читают же они js скрипты и выдают содержимое страницы, надо только вытащить в читаемом виде )
http://www.rkblog.rk.edu.pl/w/p/webkit-pyqt-rendering-web-pages/
или
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import * app = QApplication(sys.argv) web = QWebView() web.load(QUrl("http://"+raw_input('//'))) web.show() sys.exit(app.exec_())
Отредактировано sanodin (Сен. 28, 2013 09:49:48)
Офлайн
31
есть результат
#!/usr/bin/python # -*- coding: utf-8 import spynner import pyquery import HTMLParser import re from BeautifulSoup import BeautifulSoup pars = HTMLParser.HTMLParser() browser = spynner.Browser() browser.set_html_parser(pyquery.PyQuery) browser.create_webview() browser.load("http://www.google.com/trends/hottrends#pn=p14") data = browser.soup("html") #print data soup = BeautifulSoup(str(data)) my = soup.findAll(name='span', attrs={'class': 'hottrends-single-trend-title'}) re1 = re.compile('<span class="hottrends-single-trend-title">(.+?)</span>', re.IGNORECASE) for m in my: res= re1.findall(str(m)) u= ', '.join(res) print pars.unescape(u)
Отредактировано sanodin (Сен. 29, 2013 20:41:42)
Офлайн
857
sanodinне, он прав насчёт дерева документа, браузер строит дерево страницы и скрипт по этому дереву лазит, поэтому простой интерпретатор скриптов не подойдёт
это я имел ввиду ,что читают же они js скрипты и выдают содержимое страницы, надо только вытащить в читаемом виде )
Офлайн
31
В общем, натыкали меня носом, за такое, и подсказали что:
прежде чем писать парсер, нужно посмотреть какие запросы шлются. Тут можно просто спарсить JSON и все становится проще раз в 100, и не нужно тучи модулей.
import jsonа потом написал он с requests
json.loads(response) через urllib получить текст с страницы
ты загружал страницу с ajax. ajax делал запрос на http://www.google.com/trends/hottrends/hotItems и потом показывал на странице это
http://www.google.com/trends/hottrends/hotItems?pn=p14&htv=l
# -*- coding: cp1251 -*- import requests def main(): values = { 'htd': '', 'pn': 'p14', 'htv': 'l' } response = requests.post('http://www.google.com/trends/hottrends/hotItems', values).json() print response['summaryMessage'] print '-' * 79 for trends in response['trendsByDateList']: print trends['formattedDate'] print for trend in trends['trendsList']: print trend['title'] print 'Запросов:', trend['formattedTraffic'] print print '-' * 79 if __name__ == '__main__': main()
Отредактировано sanodin (Сен. 30, 2013 06:29:40)
Офлайн