用 Python 搜刮 Craigslist:完整指南

评论: 0

在数字时代,像 Craigslist 这样的广告平台仍然具有现实意义。收集器有助于自动从广告中提取信息,尤其是直接从网站上获取数据。多亏了 BeautifulSoup 和 Requests 等灵活而强大的库,我们才能高效地完成数据收集工作。本教程主要介绍使用 python 进行 Craigslist scraping,重点介绍 BeautifulSoup、Requests 和代理轮换以避免僵尸检测。

现在,我们将逐步介绍如何搜索 Craigslist。

使用 Python 抓取 Craigslist 数据的基本步骤

现在,我们将从向特定网页发送 HTTP 请求、分割所需页面、收集所需数据并以预定格式保存数据开始,详细介绍 Craigslist 的网络搜刮步骤。

设置环境

必须下载并安装以下软件包:


pip install beautifulsoup4
pip install requests

向 Craigslist 页面发送 HTTP 请求

要从网页中抓取数据,首先需要向要抓取的 URL 发送 HTTP 请求。使用请求库,您可以发送 GET 请求来获取 HTML 内容,然后对其进行处理,提取所需的信息。


import requests

# 要搜索的 Craigslist URL 列表
urls = [
    "link",
    "link"
]

for url in urls:
    # 向 URL 发送 GET 请求
    response = requests.get(url)
    
    # 检查请求是否成功(状态代码 200)
    if response.status_code == 200:
        # 从响应中提取 HTML 内容
        html_content = response.text
        
    else:
        # 如果请求失败,则打印带有状态代码的错误信息
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

使用 BeautifulSoup 解析 HTML 内容

有了 BeautifulSoup,你就可以通过 HTML 从 Craigslist 挑选出你需要的部分。它能让你找到标签、获取文本,并抓取链接或价格等内容。这是一种从凌乱的网页中提取有用信息的简单方法。


from bs4 import BeautifulSoup

# 遍历列表中的每个 URL
for url in urls:
    # 向 URL 发送 GET 请求
    response = requests.get(url)
    
    # 检查请求是否成功(状态代码 200)
    if response.status_code == 200:
        # 从响应中提取 HTML 内容
        html_content = response.text
        
        # 使用 BeautifulSoup 解析 HTML 内容
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # 如果请求失败,则打印带有状态代码的错误信息
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

利用 BeautifulSoup 库收获数据

获取 HTML 内容后,下一步是使用 BeautifulSoup 库进行解析。我们使用函数来执行 Craigslist 数据抓取,例如物品标题和价格等列表。这就好比有了一个工具,可以帮助你从凌乱的代码中快速高效地筛选出有用的部分。


from bs4 import BeautifulSoup

# 遍历列表中的每个 URL
for url in urls:
    # 向 URL 发送 GET 请求
    response = requests.get(url)
    
    # 检查请求是否成功(状态代码 200)
    if response.status_code == 200:
        # 从响应中提取 HTML 内容
        html_content = response.text
        
        # 使用 BeautifulSoup 解析 HTML 内容
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # 提取特定数据点
        # 查找列表标题
        title = soup.find('span', id='titletextonly').text.strip()
        
        # 查找挂牌价格
        price = soup.find('span', class_='price').text.strip()
        
        # 查找列表描述(可能包含多个段落)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # 打印提取的数据(用于演示)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # 如果请求失败,则打印带有状态代码的错误信息
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

标题

1.png

价格

2.png

说明

3.png

将抓取的数据保存为 CSV 文件

提取 Craigslist 数据后,确保将其存储为 CSV 格式,以方便日后使用或分析,并与其他应用程序互通。


import csv

# 定义 CSV 文件路径和字段名称
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# 将数据写入 CSV 文件
try:
    # 以 UTF-8 编码的写模式打开 CSV 文件
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        # 用指定的字段名创建 CSV DictWriter 对象
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # 在 CSV 文件中写入标题行
        writer.writeheader()
        
        # 迭代搜索数据列表中的每个项目
        for item in scraped_data:
            # 将每个项目作为一行写入 CSV 文件
            writer.writerow(item)
        
    # 将数据写入 CSV 文件后打印成功信息
    print(f"Data saved to {csv_file}")

except IOError:
    # 如果在写入 CSV 文件时出现 IOError,则打印错误信息
    print(f"Error occurred while writing data to {csv_file}")

如何使用 Craigslist Api Python

如果你想自动收集 Craigslist 网站上的列表,最简单的方法之一就是通过库使用非官方 API。它可以让你查询网站,按类别、城市、价格、关键词等过滤结果。

首先安装程序库:


pip install python-craigslist


下面是一个搜索纽约公寓出租的简单示例:


from craigslist import CraigslistHousing

cl_h = CraigslistHousing(site='newyork', category='apa', filters={'max_price': 2000})
for result in cl_h.get_results(limit=10):
    print(result['name'], result['price'], result['url'])

此代码可从纽约市公寓/住房出租部分获取前 10 条价格低于 2000 美元的房源信息。

该库还支持工作、汽车、待售物品等类别,以及各种过滤器。它是快速构建基于 Python 的工具(如机器人、列表跟踪器或市场分析)的绝佳工具。

处理潜在障碍

在网络搜刮(尤其是 Craigslist)时,可能会面临一些额外的挑战。它采用 IP 拦截和验证码挑战来防止刮削尝试。要避免这些问题,可以在轮换用户代理的同时实施代理。

使用代理:

使用代理和轮换用户代理是一种聪明的方法,可以在不被发现的情况下继续进行刮擦。


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}

response = requests.get(url, proxies=proxies)

用户代理轮换是指更改每次请求时刮擦程序发送的浏览器标识。如果你总是使用同一个用户代理,看起来就很可疑。在不同的用户代理之间切换,会让你的刮擦程序看起来更像正常用户,从而有助于避免拦截:


import random

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # 根据需要添加更多用户代理
]

headers = {
    'User-Agent': random.choice(user_agents)
}

response = requests.get(url, headers=headers)

完整代码

整合本教程中讨论的所有模块,就能开发出一个功能齐全的 Python Craigslist scraper。该程序可以提取、解析和浏览大量 URL,并检索所需的数据。


import requests
import urllib3
from bs4 import BeautifulSoup
import csv
import random
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# 要搜索的 Craigslist URL 列表
urls = [
    "link",
    "link"
]

# 用户代理和代理
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
]

proxies = [
    {'http': 'http://your_proxy_ip1:your_proxy_port1', 'https': 'https://your_proxy_ip1:your_proxy_port1'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
]

# 用于存储刮擦数据的列表
scraped_data = []

# 循环浏览列表中的每个 URL
for url in urls:
    # 每次请求时轮流使用用户代理,以避免被检测到
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # 为每个请求使用不同的代理,以避免 IP 屏蔽
    proxy = random.choice(proxies)

    try:
        # 向 Craigslist URL 发送带标头和代理的 GET 请求
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # 检查请求是否成功(状态代码 200)
        if response.status_code == 200:
            # 解析响应的 HTML 内容
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # 从解析的 HTML 中提取数据
            title = soup.find('span', id='titletextonly').text.strip()
            price = soup.find('span', class_='price').text.strip()
            description = soup.find('section', id='postingbody').get_text(strip=True, separator='\n')  # 提取说明

            # 以字典形式在列表中添加刮擦数据
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # 如果请求失败,则打印错误信息
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # 如果刮擦过程中出现错误,则打印异常信息
        print(f"Exception occurred while scraping {url}: {str(e)}")

# 设置 CSV 文件以存储刮擦数据
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# 将搜索到的数据写入 CSV 文件
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # 在 CSV 文件中写入页眉行
        writer.writeheader()

        # 遍历 scraped_data 列表,并将每个项目写入 CSV 文件
        for item in scraped_data:
            writer.writerow(item)

    # 如果数据保存成功,则打印成功信息
    print(f"Data saved to {csv_file}")
except IOError:
    # 如果在写入 CSV 文件时出现 IOError,则打印错误信息
    print(f"Error occurred while writing data to {csv_file}")

使用 Python 进行 Craigslist 搜索:最终想法

既然你已经了解了网络搜刮的工作原理,就不难理解为什么它如此方便--无论你是在分析市场还是在寻找线索。网站上有大量有价值的信息,而 BeautifulSoup 和 Requests 等工具可以让提取数据变得非常简单。本指南还介绍了一些重要的技巧,如处理动态内容和使用旋转代理以保持低调。如果使用得当,使用 Python 进行刮擦确实可以帮助企业和人们在各个领域做出更明智的决策。

评论:

0 评论