在数字时代,像 Craigslist 这样的广告平台仍然具有现实意义。收集器有助于自动从广告中提取信息,尤其是直接从网站上获取数据。多亏了 BeautifulSoup 和 Requests 等灵活而强大的库,我们才能高效地完成数据收集工作。本教程主要介绍使用 python 进行 Craigslist scraping,重点介绍 BeautifulSoup、Requests 和代理轮换以避免僵尸检测。
现在,我们将逐步介绍如何搜索 Craigslist。
现在,我们将从向特定网页发送 HTTP 请求、分割所需页面、收集所需数据并以预定格式保存数据开始,详细介绍 Craigslist 的网络搜刮步骤。
必须下载并安装以下软件包:
pip install beautifulsoup4
pip install requests
要从网页中抓取数据,首先需要向要抓取的 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 从 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}")
获取 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}")
标题
价格
说明
提取 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。它可以让你查询网站,按类别、城市、价格、关键词等过滤结果。
首先安装程序库:
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}")
既然你已经了解了网络搜刮的工作原理,就不难理解为什么它如此方便--无论你是在分析市场还是在寻找线索。网站上有大量有价值的信息,而 BeautifulSoup 和 Requests 等工具可以让提取数据变得非常简单。本指南还介绍了一些重要的技巧,如处理动态内容和使用旋转代理以保持低调。如果使用得当,使用 Python 进行刮擦确实可以帮助企业和人们在各个领域做出更明智的决策。
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
评论: 0