【问题标题】:scraping multiple pages in python with BeautifulSoup使用 BeautifulSoup 在 python 中抓取多个页面
【发布时间】:2019-07-18 13:46:13
【问题描述】:

我已经设法编写代码来从第一页抓取数据,现在我坚持在这段代码中编写一个循环来抓取接下来的“n”页。下面是代码

如果有人可以指导/帮助我编写从剩余页面中抓取数据的代码,我将不胜感激。

谢谢!

from bs4 import BeautifulSoup
import requests
import csv


url = requests.get('https://wsc.nmbe.ch/search?sFamily=Salticidae&fMt=begin&sGenus=&gMt=begin&sSpecies=&sMt=begin&multiPurpose=slsid&sMulti=&mMt=contain&searchSpec=s').text

soup = BeautifulSoup(url, 'lxml')

elements = soup.find_all('div', style="border-bottom: 1px solid #C0C0C0; padding: 10px 0;")
#print(elements)

csv_file = open('wsc_scrape.csv', 'w')

csv_writer = csv.writer(csv_file)

csv_writer.writerow(['sp_name', 'species_author', 'status', 'family'])


for element in elements:
    sp_name = element.i.text.strip()
    print(sp_name)



    status = element.find('span', class_ = ['success label', 'error label']).text.strip()
    print(status)




    author_family = element.i.next_sibling.strip().split('|')
    species_author = author_family[0].strip()
    family = author_family[1].strip()
    print(species_author)
    print(family)


    print()

    csv_writer.writerow([sp_name, species_author, status, family])

csv_file.close()

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    您必须在 URL 中传递 page= 参数并遍历所有页面:

    from bs4 import BeautifulSoup
    import requests
    import csv
    
    csv_file = open('wsc_scrape.csv', 'w', encoding='utf-8')
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(['sp_name', 'species_author', 'status', 'family'])
    
    for i in range(151):
        url = requests.get('https://wsc.nmbe.ch/search?page={}&sFamily=Salticidae&fMt=begin&sGenus=&gMt=begin&sSpecies=&sMt=begin&multiPurpose=slsid&sMulti=&mMt=contain&searchSpec=s'.format(i+1)).text
        soup = BeautifulSoup(url, 'lxml')
        elements = soup.find_all('div', style="border-bottom: 1px solid #C0C0C0; padding: 10px 0;")
        for element in elements:
            sp_name = element.i.text.strip()
            print(sp_name)
            status = element.find('span', class_ = ['success label', 'error label']).text.strip()
            print(status)
            author_family = element.i.next_sibling.strip().split('|')
            species_author = author_family[0].strip()
            family = author_family[1].strip()
            print(species_author)
            print(family)
            print()
            csv_writer.writerow([sp_name, species_author, status, family])
    
    csv_file.close()
    

    【讨论】:

    • 这可能很明显,但我无法理解。它如何知道范围参数与页面有关?抱歉,我对编程完全陌生。
    • 谢谢!我想通了,但我的问题是它如何知道它应该循环浏览页面?
    • for i in range(151)函数生成0到151之间的数字,然后将生成的数字传递给url。
    • 感谢您的解释!
    【解决方案2】:

    我不完全确定您的描述如何映射到页面上,但以下显示了循环的原理以及如何提取信息。

    import requests 
    from bs4 import BeautifulSoup as bs
    import pandas as pd
    n = 4
    results = []
    headers = ['Success/Failure', 'Names', 'AuthorInfo', 'Family']
    df = pd.DataFrame(columns = headers)
    with requests.Session() as s:
        for page in range(1,n + 1):
            r = s.get('https://wsc.nmbe.ch/search?sFamily=Salticidae&fMt=begin&sGenus=&gMt=begin&sSpecies=&sMt=begin&multiPurpose=slsid&sMulti=&mMt=contain&searchSpec=s&page={}'.format(page))
            soup = bs(r.content, 'lxml')
            failSucceed = [item.text for item in soup.select('.success, .error')]
            names = [item.text for item in soup.select('.ym-gbox div > i')]
            authorInfo = [item.next_sibling for item in soup.select('.ym-gbox div > i')]
            family= [item.split('|')[1] for item in authorInfo]   
            dfCurrent = pd.DataFrame(list(zip(failSucceed, names, authorInfo, family)))
            df = pd.concat([df, dfCurrent])
    df = df.reset_index(drop=True)
    df.to_csv(r"C:\Users\User\Desktop\test.csv", encoding='utf-8') 
    print(df)
    

    您可以通过以下方式获取结果页数:

    numPages = int(soup.select('[href*=search\?page]')[-2].text)
    

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多