安居客重庆市房价爬虫
时间: 2024-12-27 15:20:41 浏览: 4
### 编写安居客重庆房价数据抓取爬虫
#### 准备工作
为了成功抓取安居客网站上的重庆市房价信息,需先确保已安装必要的Python库。可以通过`pip`命令完成这些依赖项的安装:
```bash
pip install requests beautifulsoup4 scrapy
```
以上命令会分别安装用于发送HTTP请求、解析HTML/XML文档以及提供强大功能框架的支持工具。
#### 使用BeautifulSoup抓取网页数据
对于简单的网页抓取需求,可以采用如下方式利用BeautifulSoup实现对目标页面的数据提取[^2]:
```python
import requests
from bs4 import BeautifulSoup
url = "https://cq.fang.anjuke.com/loupan/s?p=1"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
items = []
for item in soup.select('.item-mod'):
title = item.find('a', class_='items-name').get_text(strip=True)
price_per_square_meter = item.find('p', class_='price-average').span.get_text(strip=True).replace('元/m²', '')
info_dict = {"title": title, "price_per_square_meter": float(price_per_square_meter)}
items.append(info_dict)
else:
print(f"Failed to fetch data with status code {response.status_code}")
```
这段代码展示了如何向指定URL发起GET请求,并通过设置合理的头部信息模拟浏览器行为以绕过某些反爬机制;接着创建了一个`BeautifulSoup`对象来进行DOM树遍历操作,最终实现了对特定元素的选择与内容读取。
#### 构建Scrapy项目进行更复杂的抓取任务
当面对更加复杂的需求时,则推荐使用Scrapy框架来构建完整的爬虫应用。以下是基于Scrapy的一个简单例子,该实例旨在持续翻页直至无法再找到新的房源列表为止[^4]:
首先初始化一个新的Scrapy工程并定义Spider类:
```shell
scrapy startproject anjuke_spider
cd anjuke_spider/
scrapy genspider chongqing_house_price cq.fang.anjuke.com
```
编辑生成后的spiders/chongqing_house_price.py文件,使其看起来像这样:
```python
import scrapy
class ChongqingHousePriceSpider(scrapy.Spider):
name = 'chongqing_house_price'
allowed_domains = ['cq.fang.anjuke.com']
start_urls = ["https://cq.fang.anjuke.com/loupan/s?p={}".format(i) for i in range(1, 11)]
custom_settings = {
'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
def parse(self, response):
for house_item in response.css(".item-mod"):
yield {
'name': house_item.css("a.items-name::text").get().strip(),
'average_price': int(house_item.css("p.price-average span::text").re(r'\d+')[0])
}
next_page = response.xpath('//div[@id="content"]/div[last()]/ul/li/a[contains(text(),"下一页")]/@href').extract_first()
if next_page is not None and "?p=11" not in next_page: # 假设最多只查看前10页的结果
yield response.follow(next_page, self.parse)
```
此段脚本不仅完成了单个页面内所有条目的解析工作,还加入了自动跳转至下一页继续处理的功能,直到遇到预设的最大页数限制为止。
阅读全文