未使用 python 从给定网站正确抓取数据

Data not properly being scraped from a given website using python

我正在尝试从 "thegolfcourse.net" 网站提取高尔夫球场信息。我的目标是从网站上收集美国 18000 多个高尔夫球场的名称、地址和 phone 数量。我 运行 我的脚本,但它不会生成网站的所有数据。有 18000 多个高尔夫球场,但我只从该网站下载了大约 200 多个站点。我不知道我的循环是否错误,或者我没有根据我的代码访问所有数据,而且我的数据中有空格,我想知道如何正确提取数据。

这是我的脚本:

import csv
import requests 
from bs4 import BeautifulSoup

courses_list = []

for i in range(56):
 url="http://www.thegolfcourses.net/page/{}?ls&location&orderby=title".format(i)
 r = requests.get(url)
 soup = BeautifulSoup(r.content)


g_data2=soup.find_all("article")


for item in g_data2:
  try:
    name = item.contents[5].find_all("a")[0].text
    print name
  except:
        name=''      
  try:
    phone= item.contents[13].find_all("p",{"class":"listing-phone"})[0].text
  except:
      phone=''
  try:
    address= item.contents[13].find_all("p",{"class":"listing-address"})[0].text
  except:
      address=''

  course=[name,phone,address]
  courses_list.append(course)


with open ('PGN.csv','a') as file:
  writer=csv.writer(file)
  for row in courses_list:
          writer.writerow([s.encode("utf-8") for s in row])

首先,您的代码没有抓取所有内容,因为您将 运行ge 设置为 56。这对于测试来说很好,但如果您想抓取所有内容,则需要设置

for i in range(1907):

这会转到 1907,因为由于将 .format(i+1) 添加到 URL 部分,它将在 1907 停止。

此外,您的 for 循环中有几个错误。当您发布到 Whosebug 时,这些可能是问题,但我还是清理了它们。

当我 运行 你的代码时,我第一次看到 'spacing' 是什么。当您解析 HTML 时,您解析它是为了寻找 article 标签,但该标签也在处理在您的示例 link 中显示 "Listings found for "" near "" 的第一个搜索结果.你可以像我在这里做的那样在网络抓取时缩小你的范围:

g_data2 = soup.find_all("article",{"itemtype":"http://schema.org/Organization"})

这将使您更容易抓取在包含 articleitemtype = http://schema.org/Organization" 的标签内找到的数据。这足够独特,幸运的是所有条目都符合该格式。

我还将您的 csvwritera 更改为 wb,每次脚本 运行 并且不附加到它时都会启动一个新的 CSV。

这是最终脚本:

import csv
import requests
from bs4 import BeautifulSoup

courses_list = []

for i in range(1907):
    url="http://www.thegolfcourses.net/page/{}?ls&location&orderby=title".format(i+1)
    r = requests.get(url)
    soup = BeautifulSoup(r.text)
    #print soup
    g_data2 = soup.find_all("article",{"itemtype":"http://schema.org/Organization"})

    for item in g_data2:
        try:
            name = item.find_all("h2",{'class':'entry-title'})[0].text
            print name
        except:
            name=''
            print "No Name found!"
        try:
            phone= item.find_all("p",{"class":"listing-phone"})[0].text
        except:
            phone=''
            print "No Phone found!"
        try:
            address= item.find_all("p",{"class":"listing-address"})[0].text
        except:
            address=''
            print "No Address found!"
        course=[name,phone,address]
        courses_list.append(course)

with open ('PGN.csv','wb') as file:
    writer=csv.writer(file)
    for row in courses_list:
        writer.writerow([s.encode("utf-8") for s in row])