Найти - Пользователи
Полная версия: Парсер
Начало » Python для новичков » Парсер
1 2 3
py.user.next
bw
Да причём здесь обфускация, которую вы к тому же с упаковкой путаете.
прочитай страницу, которую он пытается распарсить

38 строка
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=

39 строка
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
да пока тестировал, меня перестали пускать к этой странице, надеюсь временно
сохрани её на диск, зачем коннектиться каждый раз ? коннектиться будешь, когда сделаешь всё
bw
> любой браузер, написанный на 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
        }
    }
}
// ...
На деле обфускация встречается так редко, что я её и не встречал. А это упаковка, минификация, если любите американизмы.

> зачем создавать браузерное окружение, если нужно просто получить текст, выдаваемый скриптом ?
Затем что 99.99% вебовских JS скриптов не будут работать без DOM и прочего браузерного API. Более того зависимость кода, который получится запустить от процента реализованного API очень нелинейная. так, для запуска 20% скриптов вам потребуется 80% API (заглушки к счастью считаются).

..bw
sanodin
“любой браузер, написанный на 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
есть результат
#!/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)

я не специалист ) , но пока искал решение, прочитал что обфускация стала применяться не только как защита кода но и как экономия трафика путем сокращения кода,возможно теперь как упаковка выглядит….имхо )))
py.user.next
sanodin
это я имел ввиду ,что читают же они js скрипты и выдают содержимое страницы, надо только вытащить в читаемом виде )
не, он прав насчёт дерева документа, браузер строит дерево страницы и скрипт по этому дереву лазит, поэтому простой интерпретатор скриптов не подойдёт
sanodin
В общем, натыкали меня носом, за такое, и подсказали что:
прежде чем писать парсер, нужно посмотреть какие запросы шлются. Тут можно просто спарсить JSON и все становится проще раз в 100, и не нужно тучи модулей.
import json
json.loads(response) через urllib получить текст с страницы
ты загружал страницу с ajax. ajax делал запрос на http://www.google.com/trends/hottrends/hotItems и потом показывал на странице это
http://www.google.com/trends/hottrends/hotItems?pn=p14&htv=l
а потом написал он с requests
# -*- 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()
P.S. считаю оба варианта, нужны по своему
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB