【问题标题】:Web Scraping with BeautifulSoup and unchanging URL使用 BeautifulSoup 和不变的 URL 进行网页抓取
【发布时间】:2020-01-20 05:17:00
【问题描述】:

我正在尝试抓取 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 来访问其他页面?

【问题讨论】:

  • 什么意思?在您的代码中,您只请求 1 个网址
  • 搜索结果返回超过 25 项。通过这个程序,我们只能获得第一页上的信息。
  • 有向classicalnumismaticgallery.com/… 发出的 POST 请求,尽管您可以删除许多标题和所有 cookie,但帖子的其余部分非常庞大且丑陋(尽管也许可以修剪)

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


【解决方案1】:

在这种情况下,您应该使用 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()

【讨论】:

  • 请注意,您需要通过selenium 下载“geckodriver”以运行firefox。在下载最新的 Firefox 网络驱动程序之前,请务必更新您的 Firefox。此外,您可以设置保存“geckodriver.exe”文件的路径,以在实例化webdriver.Firefox() 时指定。一旦你把这些事情整理好,剩下的就很顺利了。祝你好运。
【解决方案2】:

您分享的页面 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 包装按钮的点击。

【讨论】:

  • 我暂时保留此回复。我要么用更好的版本更新它,要么删除它。
  • 谢谢。我会尝试Selenium
【解决方案3】:

没有selenium,我也能实现。虽然代码不完整,但我们可以通过循环__EVENTTARGET

scrape所有页面
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 scraping(r):
    description=''
    soup = BeautifulSoup(r.text, 'html.parser')
    desc = soup.find_all('div' , {'class' : 'product_contain'})
    for d in desc: 
         print(d)      


scraping(returnJson('indore'))

【讨论】:

  • 仅供参考,它是 scraping(和 scrapescrapedscraper)没有报废, “报废”是指把东西像垃圾一样扔掉。
猜你喜欢
  • 2021-09-10
  • 2020-09-13
  • 2020-08-09
  • 2017-06-11
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多