BeautifulSoup подстраницы списка с нумерацией страниц «загрузить больше»

Совершенно новый здесь, поэтому заранее извиняюсь. Я ищу, чтобы получить список всех описаний компании отhttps://angel.co/companies поиграть с. Веб-инструменты разбора, которые я пробовал, не сокращают его, поэтому я ищу написать простой скрипт на python. Должен ли я начать с получения массива всех URL-адресов компании, а затем просмотреть их? Любые ресурсы или указания были бы полезны - я просмотрел документацию BeautifulSoup и несколько постов / видеоуроков, но, между прочим, я зацикливался на симуляции запроса json (см. Здесь:Получить все ссылки с BeautifulSoup с одностраничного веб-сайта (функция «Загрузить еще»))

Я вижу скрипт, который, как мне кажется, вызывает дополнительные листинги:

o.on("company_filter_fetch_page_complete", function(e) {
    return t.ajax({
        url: "/companies/startups",
        data: e,
        dataType: "json",
        success: function(t) {
            return t.html ? 
                (E().find(".more").empty().replaceWith(t.html),
                 c()) : void 0
        }
    })
}),

Спасибо!

 taylorhamcheese13 июн. 2016 г., 23:21
Над этим сценарием, если это полезно, есть: filters: function (s, l) {var c, u, d, h, p, f, g, m, v, y, b, _, w, x, C, A , k, S, N, T, E, D, I, $, P, M; return u = new o (s (". текущий показ"), l.data ("sort")), u.set_data (l.data ("init_data")), u.render ({fetch:! l. данные ("новые")}),

Ответы на вопрос(1)

которые вы хотите очистить, динамически загружаются с помощью ajax, вам нужно проделать большую работу, чтобы получить HTML, который вы на самом деле хотите:

import requests
from bs4 import BeautifulSoup

header = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest",
    }

with requests.Session() as s:
    r = s.get("https://angel.co/companies").content
    csrf = BeautifulSoup(r).select_one("meta[name=csrf-token]")["content"]
    header["X-CSRF-Token"] = csrf
    ids = s.post("https://angel.co/company_filters/search_data", data={"sort": "signal"}, headers=header).json()
    _ids = "".join(["ids%5B%5D={}&".format(i)  for i in ids.pop("ids")])
    rest = "&".join(["{}={}".format(k,v) for k,v in ids.items()])
    url = "https://angel.co/companies/startups?{}{}".format(_ids, rest)
    rsp = s.get(url, headers=header)
    print(rsp.json())

Сначала нам нужно получить действительный токен csrf, что и делает первоначальный запрос, затем нам нужно отправитьhttps://angel.co/company_filters/search_data:

что дает нам:

{"ids":[296769,297064,60,63,112,119,130,160,167,179,194,236,281,287,312,390,433,469,496,516],"total":908164,"page":1,"sort":"signal","new":false,"hexdigest":"3f4980479bd6dca37e485c80d415e848a57c43ae"}

Это параметры, необходимые для нашего доступа кhttps://angel.co/companies/startups т.е. наш последний запрос:

Этот запрос затем дает нам больше json, который содержит HTML и всю информацию о компании:

{"html":"<div class=\" dc59 frs86 _a _jm\" data-_tn=\"companies/results ...........

Существует слишком много для публикации, но это то, что вам нужно будет проанализировать.

Итак, все вместе:

In [3]: header = {
   ...:     "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
   ...:     "X-Requested-With": "XMLHttpRequest",
   ...: }

In [4]: with requests.Session() as s:
   ...:         r = s.get("https://angel.co/companies").content
   ...:         csrf = BeautifulSoup(r, "lxml").select_one("meta[name=csrf-token]")["content"]
   ...:         header["X-CSRF-Token"] = csrf
   ...:         ids = s.post("https://angel.co/company_filters/search_data", data={"sort": "signal"}, headers=header).json()
   ...:         _ids = "".join(["ids%5B%5D={}&".format(i) for i in ids.pop("ids")])
   ...:         rest = "&".join(["{}={}".format(k, v) for k, v in ids.items()])
   ...:         url = "https://angel.co/companies/startups?{}{}".format(_ids, rest)
   ...:         rsp = s.get(url, headers=header)
   ...:         soup = BeautifulSoup(rsp.json()["html"], "lxml")
   ...:         for comp in soup.select("div.base.startup"):
   ...:                 text = comp.select_one("div.text")
   ...:                 print(text.select_one("div.name").text.strip())
   ...:                 print(text.select_one("div.pitch").text.strip())
   ...:         
Frontback
Me, now.
Outbound
Optimizely for messages
Adaptly
The Easiest Way to Advertise Across The Social Web.
Draft
Words with Friends for Fantasy (w/ real money)
Graphicly
an automated ebook publishing and distribution platform
Appstores
App Distribution Platform
eVenues
Online Marketplace & Booking Engine for Unique Meeting Spaces
WePow
Video & Mobile Recruitment
DoubleDutch
Event Marketing Automation Software
ecomom
It's all good
BackType
Acquired by Twitter
Stipple
Native advertising for the visual web
Pinterest
A Universal Social Catalog
Socialize
Identify and reward your most influential users with our drop-in social platform.
StyleSeat
Largest and fastest growing marketplace in the $400B beauty and wellness industry
LawPivot
99 Designs for legal
Ostrovok
Leading hotel booking platform for Russian-speakers
Thumb
Leading mobile social network that helps people get instant opinions
AppFog
Making developing applications on the cloud easier than ever before
Artsy
Making all the world’s art accessible to anyone with an Internet connection.

Что касается нумерации страниц, вы ограничены 20 страницами в день, но получить все 20 страниц - просто случай добавленияpage:page_no к нашим данным формы, чтобы получить новые параметры, необходимые,data={"sort": "signal","page":page}, когда вы нажимаете кнопку «Загрузить больше», вы можете увидеть, что опубликовано:

Итак, окончательный код:

import requests
from bs4 import BeautifulSoup

def parse(soup):

        for comp in soup.select("div.base.startup"):
            text = comp.select_one("div.text")
            yield (text.select_one("div.name").text.strip()), text.select_one("div.pitch").text.strip()

def connect(page):
    header = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest",
    }

    with requests.Session() as s:
        r = s.get("https://angel.co/companies").content
        csrf = BeautifulSoup(r, "lxml").select_one("meta[name=csrf-token]")["content"]
        header["X-CSRF-Token"] = csrf
        ids = s.post("https://angel.co/company_filters/search_data", data={"sort": "signal","page":page}, headers=header).json()
        _ids = "".join(["ids%5B%5D={}&".format(i) for i in ids.pop("ids")])
        rest = "&".join(["{}={}".format(k, v) for k, v in ids.items()])
        url = "https://angel.co/companies/startups?{}{}".format(_ids, rest)
        rsp = s.get(url, headers=header)
        soup = BeautifulSoup(rsp.json()["html"], "lxml")
        for n, p in parse(soup):
            yield n, p
for i in range(1, 21):
    for name, pitch in connect(i):
        print(name, pitch)

Очевидно, что то, что вы анализируете, зависит от вас, но все, что вы увидите в своем браузере в результатах, будет доступно.

 Padraic Cunningham15 июн. 2016 г., 01:06
@ TylerHudson-Crimi, какую информацию ты на самом деле хочешь?
 taylorhamcheese16 июн. 2016 г., 03:05
Идея состояла в том, чтобы обучить NN всем этим описаниям запуска, чтобы создать генератор случайных описаний запуска. Теперь я думаю, что Крамеру могло бы быть веселее, если бы Angel List слишком хорошо защищал их списки.imsdb.com/transcripts/Seinfeld-Good-News,-Bad-News.html
 taylorhamcheese14 июн. 2016 г., 19:57
Падрайк, спасибо за вдумчивый ответ. Я уверен, что без тебя я бы не справился, учитывая, как я решал проблему. Как ни странно, я последовательно получаю 383 уникальных предмета в качестве вывода. Есть идеи, почему это может быть? Я считаю, что страница должна выкладываться ближе к результатам в 900k.
 Siddhant Ghosh22 мая 2019 г., 11:28
Нужно было найти решение для некоторой проверки в Интернете с помощью кнопки «Загрузить больше», с этим столкнулся, и это, безусловно, самый описательный ответ, который я когда-либо читал на этом сайте. Я никогда не знал, что смогу сделать так много, и до сих пор было так много дел. Спасибо за этот ответ!
 Padraic Cunningham14 июн. 2016 г., 20:36
@ TylerHudson-Crimi, если вы нажмете «загрузить больше» 19 раз, вы увидитеВы достигли максимум 20 страниц на запрос

Ваш ответ на вопрос