首先导入之前安装的库:
from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
要从网站提取数据,我们需要配置 WebDriver 使用 Chrome 浏览器来加载页面。为此,只需指定 chromedriver 的路径即可。请注意,路径末尾必须包含可执行文件的名称,而不仅仅是路径!
driver = webdriver.Chrome('your/path/here/chromedriver')
除了卧室和卫生间的数量,我们还可以提取地址、价格,甚至房产面积。信息越全面,选择新家就越容易。
声明变量并设置待抓取网站的 URL。
prices = []
beds = []
baths = []
sizes = []
addresses = []
driver.get('https://www.realtor.com/realestateandhomes-search/New-York_NY')
我们需要从网站中提取数据,正如之前所述,这些数据位于嵌套的标签中。查找具有前述属性的标签,并将数据存储在上面声明的变量中。请记住,我们只希望保存至少有两间卧室和一间浴室的房产!
content = driver.page_source
soup = BeautifulSoup(content, features='html.parser')
for element in soup.findAll('li', attrs={'class': 'component_property-card'}):
price = element.find('span', attrs={'data-label': 'pc-price'})
bed = element.find('li', attrs={'data-label': 'pc-meta-beds'})
bath = element.find('li', attrs={'data-label': 'pc-meta-baths'})
size = element.find('li', attrs={'data-label': 'pc-meta-sqft'})
address = element.find('div', attrs={'data-label': 'pc-address'})
if bed and bath:
nr_beds = bed.find('span', attrs={'data-label': 'meta-value'})
nr_baths = bath.find('span', attrs={'data-label': 'meta-value'})
if nr_beds and float(nr_beds.text) >= 2 and nr_baths and float(nr_baths.text) >= 1:
beds.append(nr_beds.text)
baths.append(nr_baths.text)
if price and price.text:
prices.append(price.text)
else:
prices.append('No display data')
if size and size.text:
sizes.append(size.text)
else:
sizes.append('No display data')
if address and address.text:
addresses.append(address.text)
else:
addresses.append('No display data')
太棒了!我们已经获取了所需的所有信息,但该将它们存储在哪里呢?这时 pandas 库就派上用场了,它能帮助我们将数据整理成 CSV 文件,以便日后使用。
df = pd.DataFrame({'Address': addresses, 'Price': prices, 'Beds': beds, 'Baths': baths, 'Sizes': sizes})
df.to_csv('listings.csv', index=False, encoding='utf-8')
运行代码后,系统将生成一个名为“listings.csv”的文件,其中就包含我们珍贵的数据!
我们成功了!我们创建了自己的网页抓取工具!现在让我们直接进入正题,看看使用抓取工具需要遵循哪些步骤,以及需要修改哪些代码行。