【问题标题】:web scraping - webdriver in for loop网页抓取 - for 循环中的 webdriver
【发布时间】:2021-09-18 17:30:48
【问题描述】:

我正在尝试抓取这个网站:https://glaw.scourt.go.kr/wsjo/panre/sjo100.do?contId=2060160&q=%EB%8C%80%EB%B2%95%EA%B4%80&nq=&w=panre&section=panre_tot&subw=&subsection=&subId=2&csq={panre_bub_idx:%EB%8C%80%EB%B2%95%EC%9B%90}&groups=6,7,5,9&category=&outmax=1&msort=&onlycount=&sp=&d1=&d2=&d3=&d4=&d5=&pg=1&p1=01&p2=&p3=&p4=&p5=&p6=&p7=&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=%EB%8C%80%EB%B2%95%EC%9B%90

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

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

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

我想以某种方式使用 for 循环(也许我错了,还有其他更有效的方法可以解决这个问题),但我一直在努力为其编写正确的逻辑。这是我目前所拥有的:

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


def get_content(wd, url, lst): 
  wd.get(url)

  html = wd.page_source
  soup = BeautifulSoup(html)

  for i in soup.find("div", {"class:", "con_area_02"}).find_all(["h2","p"]):
    lst.append(i.text)
  
  url = soup.find("div", {"class:", "tit_area"}).find_all("a")[-1]['href']
  return url


# url of the very first item
url = "https://glaw.scourt.go.kr/wsjo/panre/sjo100.do?contId=2060160&q=%EB%8C%80%EB%B2%95%EA%B4%80&nq=&w=panre&section=panre_tot&subw=&subsection=&subId=2&csq={panre_bub_idx:%EB%8C%80%EB%B2%95%EC%9B%90}&groups=6,7,5,9&category=&outmax=1&msort=&onlycount=&sp=&d1=&d2=&d3=&d4=&d5=&pg=1&p1=01&p2=&p3=&p4=&p5=&p6=&p7=&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=%EB%8C%80%EB%B2%95%EC%9B%90" 

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)
l = []

while get_content(wd, url, l) != "#//": # logic seems off here
  get_content(wd, url, l)
  url = get_content(wd, url, l)

  #print(len(l))

谢谢!


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

如果没有time.sleep(),我几乎会在同一个网址打印近 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")) != "#//":
    print(str(next_btn.get_attribute("href")))
    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 selenium-webdriver web-scraping beautifulsoup


    【解决方案1】:

    我会建议这样的事情:

    next_btn = wd.find_element_by_css_selector('a[name="btnContNext"]')
    while next_btn.get_attribute("href") != "#//":
        #do your scraping
        .............
        next_btn.click()
        time.sleep(4) #make the next page loaded
        next_btn = wd.find_element_by_css_selector('a[name="btnContNext"]') #fetch the next button again
    

    【讨论】:

    • 这能回答你的问题吗?
    • 不,它没有 :( 我已经编辑了我的问题以更新我最近尝试过的内容 - 如果您能看一下并提出建议,我将不胜感激。谢谢!
    • 我现在也收到以下错误:“RecursionError:调用 Python 对象时超出了最大递归深度”。递归是不是通常不应该用于网络抓取的东西?
    • 好吧,当你差不多一个月后回来的时候......再试一次,这样其他用户也会看到这个问题,也许有人可以在这里提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2021-01-07
    • 2021-04-13
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多