Web Scraping с BeautifulSoup и неизменным URL - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь удалить это

    r = requests.get(url) 
    soup = BeautifulSoup(r.text , 'lxml')
    details = soup.find_all('span', {'class' : 'src'})
   details = soup.find_all('div', {'class' : 'product_contain'})
i=0
for d in details:
    print(i,d.get_text(strip=True).strip())
    i+=1

Но он удаляет только одну веб-страницу.Я проверил XHR, но при изменении страницы ничего не срабатывает.

Я также проверил FORM DATA в advancesearch.aspx , но он также не имеет индекса страницы, связаннойИнформация.На событии клика на странице я обнаружил ctl00$ContentPlaceHolder1$gvItem$ctl01$ctl03, но не уверен, как использовать это в URL.

Какой URL я должен использовать для доступа к другим страницам?

Ответы [ 3 ]

2 голосов
/ 19 сентября 2019

В этом случае вы должны использовать Selenium, который откроет страницу в браузере, а затем вы сможете обработать событие нажатия кнопки навигатора и каждый раз получать доступ к обновленной DOM.Вот простой код для вашей справки:

from selenium import webdriver

browser = webdriver.Firefox()
browser.get("http://www.google.com")

browser.find_element_by_id("lst-ib").send_keys("book")
browser.find_element_by_name("btnK").click()
0 голосов
/ 25 сентября 2019

я смог достичь без selenium.Хотя код не завершен, но мы можем удалить все страницы с помощью цикла __EVENTTARGET

from bs4 import BeautifulSoup
import requests,json

def returnJson(wordmark):
    url = "https://classicalnumismaticgallery.com/advancesearch.aspx?auctioncode=0&pricerange=0&keyword=indore&category=&material=0&lotno=&endlotno="
    r_init = requests.get(url)
    soup = BeautifulSoup(r_init.text, 'html.parser')
    event_validation = soup.find("input", attrs={"name" : "__EVENTVALIDATION"})['value']
    view_state = soup.find("input", attrs={"name" : "__VIEWSTATE"})['value']

    pages=4
    event_target = 'ctl00$ContentPlaceHolder1$gvItem$ctl01$ctl{:>02d}'.format(pages)
    postdata = {
        'ctl00$ContentPlaceHolder1$DDLFilter' : '0',
        '__EVENTVALIDATION' : event_validation,
        '__EVENTTARGET' : event_target,
        "__VIEWSTATE" : view_state,
    }

    r = requests.post(url, data=postdata)
    return r

def scrapping(r):
    description=''
    soup = BeautifulSoup(r.text, 'html.parser')
    desc = soup.find_all('div' , {'class' : 'product_contain'})
    for d in desc: 
         print(d)      


scrapping(returnJson('indore'))
0 голосов
/ 19 сентября 2019

URL-адрес страницы, которым вы поделились, показывает, что номера страниц могут быть доступны через следующие теги гиперссылок:

  1. Текущая страница: <a class="pager currentpage">
  2. Другие страницы (каждая): <a class="pager">

Вы можете получить доступ к соответствующей информации следующим образом.Вторая строка даст вам список всех страниц.Извлеките из них атрибут "href".Когда вы нажимаете на кнопку, запускается JavaScript и, скорее всего, добавляет часть URL, чтобы открыть новую страницу.

soup.findall('a', _class="pager currentpage")
soup.findall('a', _class="pager")

Это текст одной из кнопок.Вам нужно будет изучить исходный код страницы, чтобы выяснить, какой URL нужен.

<a class="pager currentpage"  
href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(
&quot;ctl00$ContentPlaceHolder1$gvItem$ctl01$ctl03&quot;, 
&quot;&quot;, 
true, &quot;&quot;, 
&quot;&quot;, false, true))" 
style="display:inline-block;width:27px;">1</a>
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

Лучший вариант

Использовать selenium автоматизацию браузера для выполнения кликов по таким ссылкам.Завернутые в JavaScript кнопки.

...