使用BeautifulSoup和不变URL进行Web爬网

时间:2019-09-19 08:06:31

标签: python selenium selenium-webdriver web-scraping beautifulsoup

我正在尝试废弃this

    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,但是当它更改页面时什么也没触发。

我还检查了 advancesearch.aspx 中的FORM DATA,但是它也没有与页面索引相关的信息。 在页面点击事件中,我发现了ctl00$ContentPlaceHolder1$gvItem$ctl01$ctl03,但不确定如何在URL中使用它。

我应该使用哪个URL访问其他页面?

3 个答案:

答案 0 :(得分:2)

在这种情况下,应使用Selenium,它将在浏览器中打开页面,然后可以处理导航器按钮的click事件并每次访问刷新的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()

答案 1 :(得分:0)

您共享的页面url显示可以通过以下超链接标记访问页面编号:

  1. 当前页面:<a class="pager currentpage">
  2. 其他页面(每页):<a class="pager">

您可以按以下方式访问相关信息。第二行将为您提供所有页面的列表。从其中提取"href"属性。当您单击该按钮时,将触发javascript,并且很可能会附加一部分网址以打开新页面。

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

这是按钮之一的文本。您将需要进一步研究页面源代码,以找出所需的网址。

<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包装的按钮的点击。

答案 2 :(得分:0)

没有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'))