как да изтриете уебсайт, в който url адресът на страницата не е променен, но следващият бутон добавя данни под същата url страница

Имам URL:

http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant

На тази страница има бутон „следващи резултати“, който зарежда още 20 точки от данни, докато все още показва първия набор от данни, без да актуализира URL адреса. Написах скрипт за изтриване на тази страница в python, но той изтрива само първите 22 точки от данни, въпреки че е щракнат върху бутона „следващи резултати“ и показва около 40 данни.

Как мога да изтрия тези видове уебсайтове, които динамично зареждат съдържание

Сценарият ми е

import csv
import requests
from bs4 import BeautifulSoup


url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/"
r = requests.get(url)
r.content

soup = BeautifulSoup(r.content)
print (soup.prettify())

g_data2 = soup.find_all("a", {"class": "heading"})
for item in g_data2:
    try:
        name = item.text
        print name
    except IndexError:
        name = ''
        print "No Name found!"

person vishnu    schedule 26.07.2016    source източник


Отговори (2)


Ако трябваше да го решите с requests, трябва да имитирате това, което браузърът прави, когато щракнете върху бутона „Зареждане на още“ - той изпраща XHR заявка до крайната точка http://www.goudengids.be/q/ajax/business/results.json, симулирайте го във вашия код, поддържайки сесия за уеб скрапинг. XHR отговорите са във формат JSON - в този случай изобщо няма нужда от BeautifulSoup:

import requests

main_url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/"
xhr_url = "http://www.goudengids.be/q/ajax/business/results.json"
with requests.Session() as session:
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}

    # visit main URL
    session.get(main_url)

    # load more listings - follow the pagination
    page = 1
    listings = []
    while True:
        params = {
            "input": "restaurant Provincie Antwerpen",
            "what": "restaurant",
            "where": "Provincie Antwerpen",
            "type": "DOUBLE",
            "resultlisttype": "A_AND_B",
            "page": str(page),
            "offset": "2",
            "excludelistingids": "nl_BE_YP_FREE_11336647_0000_1746702_6165_20130000, nl_BE_YP_PAID_11336647_0000_1746702_7575_20139729427, nl_BE_YP_PAID_720348_0000_187688_7575_20139392980",
            "context": "SRP * A_LIST"
        }
        response = requests.get(xhr_url, params=params, headers={
            "X-Requested-With": "XMLHttpRequest",
            "Referer": main_url
        })
        data = response.json()

        # collect listing names in a list (for example purposes)
        listings.extend([item["bn"] for item in data["overallResult"]["searchResults"]])

        page += 1

        # TODO: figure out exit condition for the while True loop

    print(listings)

Оставих важна TODO за вас - измислете условие за изход - кога да спрете да събирате обяви.

person alecxe    schedule 26.07.2016
comment
когато изпълних вашия скрипт, ми даде съобщение за грешка Traceback (последното последно извикване): File C:\Users\User\Desktop\python\script\3url.py, ред 3, в ‹module› с requests.Session() като сесия: NameError: името 'requests' не е дефинирано Как мога да го поправя?? - person vishnu; 27.07.2016
comment
@vishnu виждаш ли този import requests ред отгоре? Това е важно. И трябва да имате инсталиран модул requests. - person alecxe; 27.07.2016
comment
да, прав си @alecxe, наистина забравих. Благодаря ви за голямата ви помощ и имам нужда от вас в бъдеще - person vishnu; 28.07.2016
comment
@alexce тук имам друг URL theknowledgeonline.com/production-companies в тази връзка трябва да изтрийте име адрес телефонен номер имейл и т.н. Но данните не се намират директно. Трябва да щракна върху всяка връзка и тя да влезе в нова страница, давайки пълни данни. Как мога да изтрия тези типове URL адреси?? - person vishnu; 28.07.2016

Вместо да се фокусирате върху изтриването на HTML, мисля, че трябва да погледнете JSON, който се извлича чрез AJAX. Мисля, че е по-малко вероятно JSON да бъде променен в бъдеще, за разлика от маркирането на страницата. И на всичкото отгоре, много по-лесно е да преминете през JSON структура, отколкото да издърпате DOM.

Например, когато заредите предоставената от вас страница, тя достига URL адрес, за да получи JSON на http://www.goudengids.be/q/ajax/business/results.json.

След това предоставя някои URL параметри за запитване към бизнеса. Мисля, че трябва да разгледате повече използването на това, за да получите данните си, вместо да изтривате страницата и да симулирате щраквания върху бутони и т.н.

Редактиране:

И изглежда, че използва заглавките, зададени от първоначалното посещение на сайта, за да гарантира, че имате валидна сесия. Така че може да се наложи да посетите сайта първоначално, за да получите заглавките на бисквитките и да зададете това за последващи заявки, за да получите JSON от крайната точка по-горе. Все още мисля, че това ще бъде по-лесно и по-предвидимо, отколкото да се опитвате да изтриете HTML.

person arjabbar    schedule 26.07.2016