目录

使用  在数据搜刮中是很常见的事情。它使浏览器自动化,并允许你模拟真实的用户活动,以避免被屏蔽。在搜刮JavaScript动态生成的网站(如谷歌)时,它尤其有帮助。此外,它有助于避免任何形式的抓取保护,因为它基本上模拟真实客户的行为。

在这篇文章中,你将看到一个开发刮刀的分步教程,该刮刀将能够从谷歌地图中解析地方,即使在1000多个页面后也不会被封锁。

用Selenium抓取谷歌地图
用Selenium控制Chrome浏览器

我们需要什么来建造爬行器?

  1. Python 3+。
  2. 安装了Chrome浏览器。
  3. Selenium 3.141.0+(python包)。
  4. Chrome驱动(适用于你的操作系统)。
  5. Parsel或任何其他从HTML中提取数据的库,如Beautiful Soup。

构建谷歌地图提取器的分步教程

下载并保存ChromeDriver

要在谷歌浏览器上使用Selenium,你需要通过以下方式将Python代码链接到浏览器上 铬驱动器.

下载与您的浏览器版本和操作系统类型相匹配的ChromeDriver版本。您的Chrome浏览器的版本号可以在这里找到。Chrom -> 菜单图标(右上角) -> 帮助 -> 关于谷歌浏览器。

解除chromedriver文件的存档,并将其保存在你的系统中的某个地方(我们以后会用到它的路径)。在本教程的例子中,我们将该文件保存在项目文件夹中。

安装Selenium和Parsel软件包

通过运行以下命令安装Selenium和Parsel包。我们将在以后使用Parsel,当我们从HTML中解析内容时。

				
					pip install selenium
pip install parsel # to extract data from HTML using XPath or CSS selectors
				
			

初始化和启动Webdriver

在初始化Webdriver之前,请确保你已经完成了前面的步骤,并且你有chromedriver文件的路径。通过以下代码初始化驱动程序。你应该看到新的Chrome窗口打开。

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # use the path to the driver you downloaded from previous steps
driver = webdriver.Chrome(chromedrive_path)
				
			

在Mac上,你可能会看到以下内容。"chromedriver无法打开,因为无法验证开发者"。为了克服这个问题,请在Finder中控制点击chromedriver,从菜单中选择打开,然后在出现的对话框中点击打开。你应该在打开的终端窗口中看到 "ChromeDriver已成功启动"。关闭它,之后,你就可以从你的代码中启动ChromeDriver了。

下载谷歌地图页面

一旦你启动了驱动程序,你就可以准备打开一些页面。要打开任何页面,使用 "get "命令。

				
					url = 'https://www.google.com/maps/search/bars+near+NY,+USA/@40.7443439,-74.0197995,13z'
driver.get(url)
				
			

解析地图搜索内容

一旦你的页面被打开,你将在浏览器窗口中看到由你的python代码控制的页面。你可以运行以下代码,从ChromeDriver获取HTML页面内容。

				
					page_content = driver.page_source
				
			

为了舒适地看到HTML内容,请在Chrome浏览器中打开浏览器窗口右上角的Chrome菜单,选择更多工具>开发者工具,打开开发者控制台。现在你应该能够看到你的页面的元素。

谷歌地图的HTML解析
用开发者控制台找到我们想得到的元素的XPath

你可以通过使用你喜欢的解析工具来解析HTML页面的内容。我们将使用 帕索尔 在本教程中。

				
					from parsel import Selector

response = Selector(page_content)
				
			

遍历房源,获得每个地方的数据。

				
					results = []

for el in response.xpath('//div[contains(@aria-label, "Results for")]/div/div[./a]'):
    results.append({
        'link': el.xpath('./a/@href').extract_first(''),
        'title': el.xpath('./a/@aria-label').extract_first('')
    })
    
print(results)
				
			

从谷歌地图的地方输出(缩短)。

				
					[
  {
    'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
    'title': 'Black Iron Burger'
  },
  {
    'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
    'title': 'Fools Gold NYC'
  },
  {
    'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
    'title': '11th St. Bar'
  },
  ...
]
				
			

提取过程结束后停止驱动

在刮痧前后相应地启动和停止驱动器是很重要的。这就像你在上网前后打开和关闭浏览器一样。通过运行以下代码关闭驱动程序。

				
					driver.quit()
				
			

结论和关于扩大规模和使刮刀更坚固的建议

尽管谷歌地图的HTML结构很棘手,但通过Selenium和对XPath和CSS选择器的良好了解,你可以在搜刮中取得相当好的效果。这种使用浏览器模拟器的方法应该可以保护你不被阻止。但是,如果你要扩展你的应用程序,你可以考虑也使用代理,以避免一些意外的麻烦。

平行运行

在多进程中运行驱动程序是可能的(不是多线程),但每个驱动程序将消耗一个CPU。请确保你有足够的CPU。

企业规模的谷歌地图搜刮的终极方法

由于搜刮谷歌可能是一个相当大的挑战,许多公司和大企业希望开始搜刮数以百万计的网页,而不花时间开发和维护自己的爬虫。

最简单的方法是使用以下方法开始搜刮谷歌地图 Outscraper平台 (以获得CSV文件的结果)。 API,或 SDKs (以整合到代码中)。

开始使用谷歌地图的最简单方法

通过运行以下命令安装Outscraper的SDK。

				
					pip install google-services-api
				
			

初始化客户端,在谷歌上搜索房源,或通过发送地点ID来解析特定的房源。

*你可以从以下方面获得API令牌(SECRET_API_KEY): *你可以从以下方面获得API令牌(SECRET_API_KEY)。 个人资料页

				
					from outscraper import ApiClient

api_client = ApiClient(api_key='SECRET_API_KEY')

# Search for businesses in specific locations:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Get data of the specific place by id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Search with many queries (batching)
result = api_client.google_maps_search([
    'restaurants brooklyn usa',
    'bars brooklyn usa',
], language='en')

print(result)
				
			

结果输出(缩短)。

				
					[
  [
    {
      "name": "Colonie",
      "full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough": "Brooklyn Heights",
      "street": "127 Atlantic Ave",
      "city": "Brooklyn",
      "postal_code": "11201",
      "country_code": "US",
      "country": "United States of America",
      "us_state": "New York",
      "state": "New York",
      "plus_code": null,
      "latitude": 40.6908464,
      "longitude": -73.9958422,
      "time_zone": "America/New_York",
      "popular_times": null,
      "site": "http://www.colonienyc.com/",
      "phone": "+1 718-855-7500",
      "type": "American restaurant",
      "category": "restaurants",
      "subtypes": "American restaurant, Cocktail bar, Italian restaurant, Organic restaurant, Restaurant, Wine bar",
      "posts": null,
      "rating": 4.6,
      "reviews": 666,
      "reviews_data": null,
      "photos_count": 486,
      "google_id": "0x89c25a4590b8c863:0xc4a4271f166de1e2",
      "place_id": "ChIJY8i4kEVawokR4uFtFh8npMQ",
      "reviews_link": "https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=en&gl=US",
      "reviews_id": "-4277250731621359134",
      "photo": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
      "street_view": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
      "working_hours_old_format": "Monday: 5\\u20139:30PM | Tuesday: Closed | Wednesday: Closed | Thursday: 5\\u20139:30PM | Friday: 5\\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\\u20133PM,5\\u20139:30PM",
      "working_hours": {
        "Monday": "5\\u20139:30PM",
        "Tuesday": "Closed",
        "Wednesday": "Closed",
        "Thursday": "5\\u20139:30PM",
        "Friday": "5\\u20139:30PM",
        "Saturday": "11AM\\u20133PM,5\\u20139:30PM",
        "Sunday": "11AM\\u20133PM,5\\u20139:30PM"
      },
      "business_status": "OPERATIONAL",
      },
      "reserving_table_link": "https://resy.com/cities/ny/colonie",
      "booking_appointment_link": "https://resy.com/cities/ny/colonie",
      "owner_id": "114275131377272904229",
      "verified": true,
      "owner_title": "Colonie",
      "owner_link": "https://www.google.com/maps/contrib/114275131377272904229",
      "location_link": "https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
      ...
    },
   ...
  ]
]
				
			

额外的。开始使用谷歌评论的最简单方法

你可以通过运行以下代码来提取评论(假设你已经安装了python包并启动了客户端)。

				
					# Get reviews of the specific place by id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Get reviews for places found by search query
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Get only new reviews during last 24 hours
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())

result = api_client.google_maps_reviews(
    'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='en')
				
			

结果输出(缩短)。

				
					{
  "name": "Memphis Seoul",
  "address": "569 Lincoln Pl, Brooklyn, NY 11238, \\u0421\\u043f\\u043e\\u043b\\u0443\\u0447\\u0435\\u043d\\u0456 \\u0428\\u0442\\u0430\\u0442\\u0438",
  "address_street": "569 Lincoln Pl",
  "owner_id": "100347822687163365487",
  "owner_link": "https://www.google.com/maps/contrib/100347822687163365487",
  ...
  "reviews_data": [
    {
      "google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link": "https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
      "autor_name": "Eliott Levy",
      "autor_id": "112314095435657473333",
      "review_text": "Very good local comfort fusion food ! \\nKimchi coleslaw !! Such an amazing idea !",
      "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating": 5,
      "review_timestamp": 1560692128,
      "review_datetime_utc": "06/16/2019 13:35:28",
      "review_likes": null
    },
    {
      "google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link": "https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
      "autor_name": "fenwar1",
      "autor_id": "106144075337788507031",
      "review_text": "Great wings with several kinds of hot sauce. The mac and cheese ramen is excellent.\\nUPDATE:\\nReturned later to try the meatloaf slider, a thick meaty slice  topped with slaw and a fantastic sauce- delicious. \\nConsider me a regular.\\ud83d\\udc4d",
      "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating": 5,
      "review_timestamp": 1571100055,
      "review_datetime_utc": "10/15/2019 00:40:55",
      "review_likes": null
    },
    ...
  ]
}
				
			

常见问题

最常见的问题和答案

感谢Outscraper的SDK,它可以用Python Selenium刮取谷歌地图数据。查看Outscraper的Google Maps Places API文档,看看你能做什么。

使用Python和Selenium,可以实现从谷歌地图上刮取数据的自动化过程。Outscraper提供了一个 谷歌地图地点API 和SDK来简化这项任务。

使用Python和Selenium可以实现谷歌地图的自动搜刮。 Outscraper Google Maps Places API 和SDK允许你以最简单的方式来做这件事。

类别: 派顿

弗拉德

项目经理 领英

0 评论

发表回复

头像占位符