【问题标题】:web-scraping with selenium webdriver - using recursion使用 selenium webdriver 进行网络抓取 - 使用递归
【发布时间】:2021-10-08 12:22:07
【问题描述】:

我正在尝试抓取这个网站:https://glaw.scourt.go.kr/wsjo/panre/sjo100.do?contId=3225630&q=*&nq=&w=panre&section=panre_tot&subw=&subsection=&subId=1&csq=&groups=6,7,5,9&category=&outmax=1&msort=&onlycount=&sp=&d1=20000101~20201231&d2=&d3=&d4=&d5=&pg=1&p1=&p2=&p3=&p4=&p5=&p6=&p7=01&p8=&p9=&p10=&p11=&p12=&sysCd=WSJO&tabGbnCd=&saNo=&joNo=&lawNm=&hanjaYn=N&userSrchHistNo=&poption=&srch=&range=&daewbyn=N&smpryn=N&idgJyul=01&newsimyn=Y&trtyNm=&tabId=&save=Y&bubNm=

它在页面的最左上角有两个按钮<이전글(上一项)和다음글(下一项)。上面的 url 显示了第一个项目,因此单击 <이전글(previous item) 只会刷新同一页面。

我正在尝试抓取每个页面右侧框中的内容,直到到达最后一项(即,直到单击 다음글(下一项)只会刷新同一页面)。

通过检查页面,如果该项目是最后一个项目,那么按钮 다음글(下一个项目)的 a[href] 就是 "#//,而对于所有之前的项目,它们的 a[href]s按钮다음글(下一项)是下一项的网址。

我的代码如下(使用递归),但是从 print 语句中打印出来的 url 往往会随着时间的推移而重复(它们被打印两次或更多次)。

如果我不包含 time.sleep(4),我会在相同的 url 打印近 10 次后立即收到错误。

我错过了什么吗?

from bs4 import BeautifulSoup
from selenium import webdriver
import sys
import re
from tqdm import tqdm
import time


sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36")

wd = webdriver.Chrome('chromedriver',chrome_options=chrome_options)

start_url = "https://glaw.scourt.go.kr/wsjo/panre/sjo100.do?contId=3225630&q=*&nq=&w=panre&section=panre_tot&subw=&subsection=&subId=1&csq=&groups=6,7,5,9&category=&outmax=1&msort=&onlycount=&sp=&d1=20000101~20201231&d2=&d3=&d4=&d5=&pg=1&p1=&p2=&p3=&p4=&p5=&p6=&p7=01&p8=&p9=&p10=&p11=&p12=&sysCd=WSJO&tabGbnCd=&saNo=&joNo=&lawNm=&hanjaYn=N&userSrchHistNo=&poption=&srch=&range=&daewbyn=N&smpryn=N&idgJyul=01&newsimyn=Y&trtyNm=&tabId=&save=Y&bubNm="
content_l = []


def scrape(webdriver, url, l):
  time.sleep(4)
  wd.get(url)
  html = wd.page_source
  soup = BeautifulSoup(html)

  for i in soup.find("div", {"class:", "con_area_02"}).find_all(["h2","p"]):
    l.append(i.text)
  
  next_btn = wd.find_element_by_css_selector('a[title="다음글"]')

  if str(next_btn.get_attribute("href")) != "#//":
    next_btn = wd.find_element_by_css_selector('a[title="다음글"]')
    print(str(next_btn.get_attribute("href")))
    #next_btn.click()
    time.sleep(1)
    return scrape(webdriver, str(next_btn.get_attribute("href")), l)
  elif str(next_btn.get_attribute("href")) == "#//":
    return l 


scrape(wd, start_url, content_l)

【问题讨论】:

    标签: python selenium-webdriver web-scraping beautifulsoup


    【解决方案1】:

    我认为这是因为您在找到next_btn 后没有执行click()。所以它进入if loop,同样的url再次被传递。

    更新:这是我尝试过的代码。

    driver.get("https://glaw.scourt.go.kr/wsjo/panre/sjo100.do?contId=3225630&q=*&nq=&w=panre&section=panre_tot&subw=&subsection=&subId=1&csq=&groups=6,7,5,9&category=&outmax=1&msort=&onlycount=&sp=&d1=20000101%7E20201231&d2=&d3=&d4=&d5=&pg=1&p1=&p2=&p3=&p4=&p5=&p6=&p7=01&p8=&p9=&p10=&p11=&p12=&sysCd=WSJO&tabGbnCd=&saNo=&joNo=&lawNm=&hanjaYn=N&userSrchHistNo=&poption=&srch=&range=&daewbyn=N&smpryn=N&idgJyul=01&newsimyn=Y&trtyNm=&tabId=&save=Y&bubNm=")
    next = driver.find_element_by_xpath("//a[@name='btnContNext']")
    list1 = [next.get_attribute('href')]
    next.click()
    for i in range(5):
        time.sleep(2)
        nextoption = driver.find_element_by_xpath("//a[@name='btnContNext']")
        if nextoption.get_attribute('href') in list1:
            print("Duplicate")
        else:
            list1.append(nextoption.get_attribute('href'))
            nextoption.click()
    print(list1)
    

    【讨论】:

    • 谢谢!但是当我在 if 语句之前添加 next_btn.click() 时,我收到以下错误:StaleElementReferenceException: Message: stale element reference: element is not attach to the page document (Session info: headless chrome=91.0.4472.101)跨度>
    • 是的,即使我遇到了同样的错误。将同一行 next_btn = wd.find_element_by_css_selector('a[title="다음글"]') 放在 if loop 内。它通过了那个例外。
    • @pvalerie - 我已经用代码更新了答案。它可能对你有用。
    • 非常感谢!对此,我真的非常感激。只是一个简单的问题,我想我需要知道我需要提前刮多少元素,对吧?这样我就知道要在范围(数字)中输入什么数字?或者有什么办法可以算出这个数字吗? (页面元素中没有“最后一页”等内容..)
    • 是的,下一个选项没有结束。因此,您需要确定所需的页数,即您需要选择 range(number)
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 2019-04-06
    • 2019-06-23
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多