使用xpath解析爬取链家

使用xpath解析爬取链家

爬取链家

from urllib import request
from time import sleep
from lxml import etree
import csv
import redis
import re

# 1 数据抓取
# 定义一个函数,用于将页码,城市等信息转化为一个Request对象
def request_from(url,page,city):
	
	#    请求头
	headers = {
		'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
	}
	
	# 拼接url
	page_url = url %(city,page)
	
	# 创建请求对象
	return request.Request(url=page_url,headers=headers)
	
	
# 定义一个函数,抓取页面信息(根据城市名,起始页和终止页)

def fetch_pages(url,city,start,end):
	for page in range(int(start),int(end)+1):
		# 创建请求对象
		req=request_from(url=url,city=city,page=page)
		
		# 发起请求
		res=request.urlopen(req)
		
		# 将res中的响应体读取处理,并且放入生成器中
		
		# sleep(1)
		# print(res.read())  #测试能不能获取页面
		#
		sleep(1)
		yield res.read().decode('utf-8')

	
	
# 2 数据的解析
def analysis_pages(pages):
	
	for page in pages:
		# 把每个html页面创建出一个节点树
	
		page_tree = etree.HTML(page)
		#将html字符串转化成节点树
		
		hoose_list = page_tree.xpath("//li[starts-with(@class,'clear')]")
		# print(hoose_list)
		for house in hoose_list:
			#创建一个字典,用于整合每个房屋的具体信息
			item = {}
			# 标题
			item['tiele'] = house.xpath(".//div[@class='title']//a/text()")[0]
			# 房屋信息
			item['houseInfo'] = "".join(house.xpath(".//div[@class='houseInfo']//text()"))
			# 地址信息
			item['positionInfo'] = "".join(house.xpath(".//div[@class='positionInfo']//text()"))
			# 单价
			item['unitPrice'] = re.findall(pattern=r"\d+",string=house.xpath(".//div[@class='unitPrice']//text()")[0])[0]
			# 总价
			item['totalPrice'] = house.xpath(".//div[@class='totalPrice']//span/text()")[0]
			# 图片链接
			item['picUrl'] = house.xpath(".//img[@class='lj-lazy']/@data-original")[0]
			
			# print(item)
			yield item
			
		


# 3 数据的存储
def write_to_csv(data):
	#打开一个csv表格文件
	fp = open('ershoufang.csv','a+',newline='')#用追加的方式打开
	#创建一个csv的写对象
	writer = csv.writer(fp)
	writer.writerow(['title','houseInfo','positionInfo','unitPrice','totalPrice','picUrl'])
	# 写内容

	for house in data:
		values=[]
		for k,v in house.items():
			values.append(v)
		writer.writerow(values)
	fp.close()






if __name__ == '__main__':
	url = 'https://%s.lianjia.com/ershoufang/pg%d'
	city = input('请输入城市的代号:')
	start = input('请输入起始页码:')
	end = input('请输入终止页码:')
	pages = fetch_pages(url=url,city=city,start=start,end=end)
	house_list = analysis_pages(pages)
	write_to_csv(house_list)

将数据存储到redis

在第三步存储数据中加入一个函数,同时导入一下json模块

# 存储到redis数据库
def write_to_redis(data):
	#创建一个redis链接           主机名         端口号    数据库
	rds = redis.StrictRedis(host='127.0.0.1',port=6379,db=6)
	for house in data:
		rds.lpush('ershoufang',json.dumps(house))
# 最后在 if __name__ == '__main__':下还要加入
 write_to_redis(house_list)

redis可视化工具链接
链接:https://pan.baidu.com/s/1Ioa0Oaw_IL8wXGjeyy7RPg
提取码:0vgf

在这里插入图片描述
先安装redis数据库,再安装可视化工具
安装按照默认步骤一步步来即可
安装完后,可在终端输入命令查看

redis-server
redis-cli

创建一个redis数据库
在这里插入图片描述

运行.py文件然后查看redis
可以发现数据存入进来了
在这里插入图片描述

顺带一提,爬取链家中北京的资源时会出现一些bug,某一段的数据会有大量重复

追加测试

'''
需求报告:
爬取以下城市:北京、上海、深圳、广州、天津、武汉、杭州、成都、西安、郑州
爬取的数据:标题、位置信息、房屋信息、单价、总价
存储数据都存到一张csv表中属性有:title、city、positionInfo、houseInfo、unitPrice、totalPrice
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值