如何使用python和beautifulsoup4循环抓取网站中多个页面的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用python和beautifulsoup4循环抓取网站中多个页面的数据相关的知识,希望对你有一定的参考价值。
我正试图从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网站的搜索有多个页面,网址遵循以下模式:
http://www.pga.com/golf-courses/search?page=1 # Additional info after page parameter here
这意味着您可以阅读页面内容,然后将页面值更改为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
如果你还读这篇文章,你也可以尝试这个代码....
from urllib.request import urlopen
from bs4 import BeautifulSoup
file = "Details.csv"
f = open(file, "w")
Headers = "Name,Address,City,Phone,Website\n"
f.write(Headers)
for page in range(1,5):
url = "http://www.pga.com/golf-courses/search?page={}&searchbox=Course%20Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0".format(page)
html = urlopen(url)
soup = BeautifulSoup(html,"html.parser")
Title = soup.find_all("div", {"class":"views-field-nothing"})
for i in Title:
try:
name = i.find("div", {"class":"views-field-title"}).get_text()
address = i.find("div", {"class":"views-field-address"}).get_text()
city = i.find("div", {"class":"views-field-city-state-zip"}).get_text()
phone = i.find("div", {"class":"views-field-work-phone"}).get_text()
website = i.find("div", {"class":"views-field-website"}).get_text()
print(name, address, city, phone, website)
f.write("{}".format(name).replace(",","|")+ ",{}".format(address)+ ",{}".format(city).replace(",", " ")+ ",{}".format(phone) + ",{}".format(website) + "\n")
except: AttributeError
f.close()
写入范围(1,5)只是将其更改为0,到最后一页,您将获得CSV中的所有详细信息,我非常努力地以正确的格式获取您的数据,但这很难:)。
你正在链接到一个页面,它不会自己迭代每个页面。
第1页:
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"
第2页:
http://www.pga.com/golf-courses/search?page=1&searchbox=Course%20Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0
页面907:http://www.pga.com/golf-courses/search?page=906&searchbox=Course%20Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0
因为你正在为第1页运行,所以你只能得到20.你需要创建一个贯穿每个页面的循环。
您可以从创建一个执行一个页面的函数开始,然后迭代该函数。
在网页上的search?
之后,从第2页开始,page=1
开始增加,直到第907页,它是page=906
。
以上是关于如何使用python和beautifulsoup4循环抓取网站中多个页面的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中使用 beautifulsoup4 来抓取标签中的内容
使用python和beautifulsoup4抓取网页后重复数据
Python爬虫开发第1篇beautifulSoup4解析器