用xpath爬取58二手房信息
时间: 2023-11-09 16:35:03 浏览: 106
爬取 58 二手房信息可以使用 XPath,具体步骤如下:
1. 确定目标网页的 URL,例如 https://bj.58.com/ershoufang/
2. 发送 HTTP 请求获取网页源代码。
3. 使用 XPath 选择器解析网页源代码,获取所需信息。
4. 处理获取到的数据,可以保存到本地文件或者数据库中。
在使用 XPath 解析网页源代码时,可以使用 Chrome 浏览器自带的开发者工具来方便地获取 XPath 选择器。具体方法是右键点击需要获取数据的元素,选择“检查”菜单,在开发者工具中选中对应的 HTML 元素,右键点击该元素,在弹出的上下文菜单中选择“Copy”->“Copy XPath”,即可获取该元素的 XPath 选择器。
需要注意的是,在爬取网页信息时需要遵守相关法律法规和网站的规定,不得进行恶意爬取和侵犯隐私等行为。
相关问题
使用xpath爬取58同城二手房的信息
好的,以下是使用Python和XPath爬取58同城二手房信息的示例代码:
```python
import requests
from lxml import etree
url = 'https://bj.58.com/ershoufang/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
html = etree.HTML(response.text)
# 获取所有房源的信息
house_list = html.xpath('//ul[@class="house-list-wrap"]/li')
for house in house_list:
# 获取房源标题
title = house.xpath('.//h2[@class="title"]/a/text()')[0]
# 获取房源价格
price = house.xpath('.//div[@class="price"]/p[@class="sum"]/b/text()')[0]
# 获取房源所在区域
area = house.xpath('.//p[@class="baseinfo"]/a[@class="district"]/text()')[0]
# 获取房源详细地址
address = house.xpath('.//p[@class="baseinfo"]/a[@class="addr"]/text()')[0]
print(title, price, area, address)
```
这段代码使用requests库发送GET请求获取页面内容,然后使用lxml库对页面进行解析,并使用XPath表达式获取所需信息。其中,`//`表示从根节点开始查找,`/`表示从当前节点的直接子节点开始查找,`.`表示当前节点,`..`表示当前节点的父节点,`@`表示获取节点的属性值。
请使用Scrapy爬取58同城二手房目标网站url地址为https://cq.58.com/ershoufang/。 1、要求爬取重庆挂牌出售的全部二手房信息信息。爬取信息包括卖点、楼盘、楼盘地址、房屋户型、楼层、建筑年代、每平单价、房屋总价。 2、将爬取信息存储在mysql数据库中。58同城二手房案例时需要重点关注分页以及网页深层数据爬取的实现。爬取页面如图1,2所示。
好的,我可以为您提供Scrapy爬取58同城二手房的代码。但是,请您注意,Scrapy的爬虫需要遵守网站的robots.txt协议,不得对网站进行恶意爬取,否则会对您的程序和IP地址产生不好的影响。此外,对于爬取到的信息,请您务必遵守相关法律法规,不得进行商业化利用或其他非法用途。
以下是Scrapy爬取58同城二手房的示例代码:
```python
import scrapy
from scrapy import Request
from scrapy.exceptions import CloseSpider
from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose, TakeFirst
from w3lib.html import remove_tags
import re
import pymysql
class Cq58ErshoufangSpider(scrapy.Spider):
name = 'cq_58_ershoufang'
allowed_domains = ['cq.58.com']
start_urls = ['https://cq.58.com/ershoufang/']
custom_settings = {
'ROBOTSTXT_OBEY': True,
'DOWNLOAD_DELAY': 1
}
def parse(self, response):
item_links = response.xpath('//ul[@class="house-list-wrap"]/li[@class="house-cell"]/div[@class="list-info"]/h2/a/@href')
for item_link in item_links:
yield Request(item_link.get(), callback=self.parse_item)
next_page_url = response.css('a.next::attr(href)').get()
if next_page_url is not None:
yield Request(next_page_url, callback=self.parse)
def parse_item(self, response):
item_loader = ItemLoader(item=Cq58ErshoufangItem(), response=response)
item_loader.default_output_processor = TakeFirst()
item_loader.add_xpath('title', '//div[@class="house-title"]/h1/text()')
item_loader.add_xpath('sell_point', '//div[@class="house-desc-item"]/div[1]/text()', MapCompose(remove_tags))
item_loader.add_xpath('community_name', '//div[@class="house-desc-item"]/div[2]/a/text()')
item_loader.add_xpath('community_address', '//div[@class="house-desc-item"]/div[2]/span/text()')
item_loader.add_xpath('room_type', '//ul[@class="house-desc-list"]/li[1]/text()')
item_loader.add_xpath('floor', '//ul[@class="house-desc-list"]/li[2]/text()')
item_loader.add_xpath('year_built', '//ul[@class="house-desc-list"]/li[3]/text()', MapCompose(self.extract_year_built))
item_loader.add_xpath('unit_price', '//div[@class="price"]/b/text()', MapCompose(remove_tags))
item_loader.add_xpath('total_price', '//div[@class="price"]/span[@class="price-det"]/text()', MapCompose(remove_tags))
yield item_loader.load_item()
def extract_year_built(self, value):
match = re.search(r'\d{4}', value)
if match:
return match.group(0)
else:
return None
class Cq58ErshoufangItem(scrapy.Item):
title = scrapy.Field()
sell_point = scrapy.Field()
community_name = scrapy.Field()
community_address = scrapy.Field()
room_type = scrapy.Field()
floor = scrapy.Field()
year_built = scrapy.Field()
unit_price = scrapy.Field()
total_price = scrapy.Field()
class Cq58ErshoufangPipeline:
def __init__(self, mysql_host, mysql_port, mysql_db, mysql_user, mysql_password):
self.mysql_host = mysql_host
self.mysql_port = mysql_port
self.mysql_db = mysql_db
self.mysql_user = mysql_user
self.mysql_password = mysql_password
@classmethod
def from_crawler(cls, crawler):
return cls(
mysql_host=crawler.settings.get('MYSQL_HOST'),
mysql_port=crawler.settings.get('MYSQL_PORT'),
mysql_db=crawler.settings.get('MYSQL_DB'),
mysql_user=crawler.settings.get('MYSQL_USER'),
mysql_password=crawler.settings.get('MYSQL_PASSWORD')
)
def open_spider(self, spider):
self.conn = pymysql.connect(
host=self.mysql_host,
port=self.mysql_port,
db=self.mysql_db,
user=self.mysql_user,
password=self.mysql_password,
charset='utf8mb4'
)
self.cursor = self.conn.cursor()
def close_spider(self, spider):
self.conn.close()
def process_item(self, item, spider):
sql = '''
INSERT INTO cq_58_ershoufang (
title, sell_point, community_name, community_address, room_type, floor, year_built, unit_price, total_price
) VALUES (
%s, %s, %s, %s, %s, %s, %s, %s, %s
)
'''
data = (
item['title'],
item['sell_point'],
item['community_name'],
item['community_address'],
item['room_type'],
item['floor'],
item['year_built'],
item['unit_price'],
item['total_price']
)
self.cursor.execute(sql, data)
self.conn.commit()
return item
```
在该示例代码中,我们使用了Scrapy框架进行网页爬取,并使用了XPath和CSS选择器对网页元素进行定位和提取。爬取到的信息存储在一个自定义的Item对象中,并使用ItemLoader对数据进行处理。最后,我们将爬取到的数据存储在MySQL数据库中,需要在settings.py文件中配置MySQL数据库的相关参数。
需要注意的是,该示例代码只是一个参考,具体的爬取需求和数据存储方式可能需要根据您的实际情况进行调整。另外,为了防止网站的反爬虫机制,我们在settings.py中设置了DOWNLOAD_DELAY参数,即每次请求之间的时间间隔,您可以根据需要进行调整。
阅读全文