使用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
'''