scrapy 二手房
时间: 2023-11-02 14:06:09 浏览: 70
Scrapy是一个基于Python的开源网络爬虫框架,它可以用于抓取网站并从中提取结构化的数据。而在这个问题中,引用提到了基于Scrapy编写的爬虫,可以爬取城市二手房的各种信息,比如房价、面积、所处位置等。同时,引用也提到了如何创建一个Scrapy爬虫项目,可以根据需要进行设置和修改。因此,可以使用Scrapy框架来爬取二手房信息,并且可以根据需要进行自定义设置和修改。
相关问题
scrapy爬虫二手房
Scrapy是一个用Python编写的应用框架,用于爬取网站数据并提取结构化数据。通过Scrapy框架,您可以构建一个爬虫来抓取链家重庆主城九区的二手房数据,并将这些数据存储到MySQL数据库中。
在Scrapy中,您可以定义一个Item类来定义要抓取的数据字段,如名称、链接、关注人数、发布时间、地址、房屋情况、总价格、每平米价格等等。您可以在items.py文件中创建一个PythonQmItem类,使用scrapy.Field()来定义每个字段。
Scrapy的流程是基于请求-响应模式的。您可以编写一个Spider类,定义起始的URL和如何解析和提取数据的规则。Spider类会发送请求并接收响应,然后通过解析响应提取所需的数据。
Scrapy的系统结构包括调度器(Scheduler)、下载器(Downloader)、中间件(Middleware)和管道(Pipeline)。调度器负责管理请求队列,下载器负责下载网页内容,中间件可以对请求和响应进行预处理和后处理,管道负责处理和存储提取到的数据。
基于Scrapy爬取二手房
### 使用 Scrapy 框架爬取二手房数据
为了实现使用 Scrapy 框架来爬取二手房信息,以下是详细的说明和代码示例。
#### 创建项目结构
首先创建一个新的 Scrapy 项目并进入该项目目录:
```bash
scrapy startproject secondhand_housing
cd secondhand_housing
```
#### 定义 Item 类
在 `items.py` 文件中定义用于存储抓取到的数据项。基于提供的字段需求,可以这样设置:
```python
import scrapy
class SecondHandHousingItem(scrapy.Item):
price = scrapy.Field()
mode = scrapy.Field()
area = scrapy.Field()
floor = scrapy.Field()
age = scrapy.Field()
location = scrapy.Field()
district = scrapy.Field()
```
此部分描述了待提取的具体属性[^1]。
#### 编写 Spider 脚本
接下来,在 spiders 文件夹下新建 Python 文件作为 spider 实现逻辑。假设目标网站为安居客,则可命名为 `anjuke_spider.py`:
```python
import scrapy
from ..items import SecondHandHousingItem
class AnjukeSpider(scrapy.Spider):
name = "anjuke"
allowed_domains = ["anjuke.com"]
start_urls = [
'http://www.anjuke.com/sy-city.html', # 替换成实际的URL地址
]
def parse(self, response):
for href in response.css('a::attr(href)').getall():
yield response.follow(href, self.parse_list)
def parse_list(self, response):
houses = response.xpath('//div[@class="house-title"]')
for house in houses:
item = SecondHandHousingItem()
item['price'] = house.xpath('.//span[@class="unit-price"]/text()').extract_first().strip()
item['mode'] = house.xpath('.//dd[contains(@class,"huxing")]/text()').re(r'\d室\d厅')[0].strip()
item['area'] = house.xpath('.//dd[contains(@class,"mianji")]/text()').re(r'(\d+\.?\d*)平米')[0].strip()
item['floor'] = house.xpath('.//dd[contains(@class,"louceng")]/text()').extract_first().strip()
item['age'] = house.xpath('.//dd[contains(@class,"jianzhu-nianfen")]/text()').extract_first().strip()
item['location'] = house.xpath('.//address/text()').extract_first().strip()
item['district'] = house.xpath('.//p[@class="content__title--wrap"]/a[last()]/text()').extract_first().strip()
yield item
next_page = response.css('li.next a::attr("href")').get()
if next_page is not None:
yield response.follow(next_page, callback=self.parse_list)
```
这段脚本实现了对页面链接解析以及具体房源详情页的内容抽取过程。
#### 设置中间件与下载器配置
编辑 settings.py 来调整一些必要的参数以优化性能或规避反爬机制:
```python
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 3
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
ITEM_PIPELINES = {
'secondhand_housing.pipelines.SecondhandHousingPipeline': 300,
}
FEED_EXPORT_ENCODING = 'utf-8'
LOG_LEVEL='INFO'
CONCURRENT_REQUESTS=16
COOKIES_ENABLED=False
RETRY_HTTP_CODES=[500, 502, 503, 504, 400, 403, 404, 408]
DOWNLOADER_MIDDLEWARES={
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware':400,
}
```
这些设定有助于提高效率的同时减少被封禁的风险[^2]。
#### 数据处理管道 Pipeline
最后一步是在 pipelines.py 中编写自定义 pipeline 将获取的数据存入 MySQL 或其他形式持久化储存介质内:
```python
import mysql.connector
class SecondhandHousingPipeline(object):
def __init__(self):
self.conn = mysql.connector.connect(
host='localhost',
user='root',
passwd='',
db='housing_data'
)
self.cur = self.conn.cursor()
def process_item(self, item, spider):
try:
sql_query = """INSERT INTO housing_info (
price,
mode,
area,
floor,
age,
location,
district) VALUES (%s,%s,%s,%s,%s,%s,%s);"""
values=(item["price"],
item["mode"],
item["area"],
item["floor"],
item["age"],
item["location"],
item["district"])
self.cur.execute(sql_query,values)
self.conn.commit()
except Exception as e:
print(f"Error inserting into database {e}")
return item
def close_spider(self,spider):
self.cur.close()
self.conn.close()
```
通过上述操作即完成了整个流程的设计与实施。
阅读全文
相关推荐















