当前位置: 首页 > 面试题库 >

如何使用python和beautifulsoup4循环抓取网站中多个页面的数据

益英逸
2023-03-14
问题内容

我正在尝试从PGA.com网站上获取数据,以获取美国所有高尔夫球场的表格。在我的CSV表中,我想包括高尔夫球场的名称,地址,所有权,网站,电话号码。有了这些数据,我想对其进行地理编码并放入地图中,并在计算机上拥有本地副本

我利用Python和Beautiful
Soup4提取了我的数据。到目前为止,我已经提取了数据并将其导入CSV,但是现在我遇到了从PGA网站上的多个页面抓取数据的问题。我想提取所有高尔夫球场,但是我的脚本仅限于一页,我想循环播放它,以便它将从PGA网站中找到的所有页面捕获高尔夫球场的所有数据。大约有18000个黄金课程和900个页面来捕获数据

以下是我的脚本。我需要有关创建代码的帮助,该代码将捕获来自PGA网站的所有数据,而不仅仅是一个站点,而是多个站点。通过这种方式,它将为我提供美国黄金课程的所有数据。

这是我的脚本如下:

import csv
import requests 
from bs4 import BeautifulSoup
url = "http://www.pga.com/golf-courses/search?searchbox=Course+Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0"

r = requests.get(url)

soup = BeautifulSoup(r.content)

g_data1=soup.find_all("div",{"class":"views-field-nothing-1"})
g_data2=soup.find_all("div",{"class":"views-field-nothing"})

courses_list=[]

for item in g_data2:
     try:
          name=item.contents[1].find_all("div",{"class":"views-field-title"})[0].text
     except:
          name=''
     try:
          address1=item.contents[1].find_all("div",{"class":"views-field-address"})[0].text
     except:
          address1=''
     try:
          address2=item.contents[1].find_all("div",{"class":"views-field-city-state-zip"})[0].text
     except:
          address2=''
     try:
          website=item.contents[1].find_all("div",{"class":"views-field-website"})[0].text
     except:
          website=''   
     try:
          Phonenumber=item.contents[1].find_all("div",{"class":"views-field-work-phone"})[0].text
     except:
          Phonenumber=''

     course=[name,address1,address2,website,Phonenumber]
     courses_list.append(course)

     with open ('filename5.csv','wb') as file:
          writer=csv.writer(file)
          for row in courses_list:
               writer.writerow(row)

#for item in g_data1:
     #try:
          #print item.contents[1].find_all("div",{"class":"views-field-counter"})[0].text
     #except:
          #pass  
     #try:
          #print item.contents[1].find_all("div",{"class":"views-field-course-type"})[0].text
     #except:
          #pass

#for item in g_data2:
   #try:
      #print item.contents[1].find_all("div",{"class":"views-field-title"})[0].text
   #except:
      #pass
   #try:
      #print item.contents[1].find_all("div",{"class":"views-field-address"})[0].text
   #except:
      #pass
   #try:
      #print item.contents[1].find_all("div",{"class":"views-field-city-state-zip"})[0].text
   #except:
      #pass

该脚本一次只能捕获20个脚本,而我想一次捕获全部脚本,这相当于18000个高尔夫球场和900页要抓取的表格。


问题答案:

PGA网站的搜索有多个页面,URL遵循以下模式:

http://www.pga.com/golf-courses/search?page=1 # Additional info after page parameter here

这意味着您可以读取页面的内容,然后将page的值更改为1,然后读取下一页…。依此类推。

import csv
import requests 
from bs4 import BeautifulSoup
for i in range(907):      # Number of pages plus one 
    url = "http://www.pga.com/golf-courses/search?page={}&searchbox=Course+Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0".format(i)
    r = requests.get(url)
    soup = BeautifulSoup(r.content)

    # Your code for each individual page here


 类似资料:
  • 我对Python相当陌生,第一次使用漂亮的汤,尽管我对硒有一些经验。我试图刮一个网站(http://cbseaff.nic.in/cbse_aff/schdir_Report/userview.aspx)所有的从属关系号码。 问题是它们在多个页面上(1上有20个结果,总计:21000个结果) 所以,我希望在某种循环中刮这些,可以在下一个页面上迭代btn,网页的URL中的问题不会改变,因此没有模式。

  • 我想刮从多个网站与类似的网址的,如https://woollahra.ljhooker.com.au/our-team, https://chinatown.ljhooker.com.au/our-team和https://bondibeach.ljhooker.com.au/our-team. 我已经写了一个脚本,第一个网站的工作,但我不知道如何告诉它从其他两个网站刮。 我的代码: 有没有一种方

  • 问题内容: 我正在尝试抓取此网站:http : //data.eastmoney.com/xg/xg/ 到目前为止,我已经使用selenium执行javascript并抓取了表格。但是,现在我的代码仅使我获得第一页。我想知道是否有一种方法可以访问其他17个页面,因为当我单击下一页时,URL不会更改,因此我不能每次都遍历另一个URL 下面是我到目前为止的代码: 还是我每次单击后都可以使用webdri

  • 问题内容: 我正在尝试开发一个简单的网页抓取工具。我想提取没有代码的文本。我实现了这个目标,但是我发现在某些加载了的页面中,我没有获得良好的结果。 例如,如果一些代码添加了一些文本,则看不到它,因为当我调用 我得到的原始文本没有添加文本(因为在客户端执行了)。 因此,我正在寻找一些解决此问题的想法。 问题答案: 一旦安装了,请确保二进制文件在当前路径中可用: 例 举个例子,我用以下HTML代码创建

  • 我正试图浏览一个网站。我尝试过使用两种方法,但都没有提供完整的网站源代码,我正在寻找。我正试图从下面提供的网站URL中获取新闻标题。 URL:"https://www.todayonline.com/" 这是我尝试过但失败的两种方法。 请帮忙。我试着抓取其他新闻网站,这要容易得多。谢谢你。

  • 我正在抓取一个网站,该网站在A-Z选项卡中按字母顺序列出数据,每个字母选项卡还包含多个页面。我如何从中提取所有URL? 公共静态void main(字符串[]args)引发异常{