最近在学习python爬虫,下面是一个简单的爬虫案例。
使用的库有:requests、parsel、csv
后期可以引入sql库将爬取出来的结果导入到数据库及可视化展示。
========================代码段===========================
#爬虫案例的一般步骤:
#1、找到数据所对应的链接地址
#2、发送指定链接地址的请求(代码) request
#3、解析出我们需要的数据 parsel
#4、数据的保存
#----------------------------------------------#
import requests
import parsel
import csv
#1、找到数据所对应的链接地址
print("和平、南开、河西")
name = input("请输入您要查询的区域:")
if name == "和平":
print("对不起,暂时还未编写抓取代码")
elif name == "南开":
print("对不起,暂时还未编写抓取代码")
elif name == "河西":
for page in range(1, 101): # 定义一个for循环,控制页数,1-100页,名字叫page 负责翻页 在range范围呢(in range(1,1010))
# 从1到101,因为左开右闭原则100页不包含100所以是101页
# 然后还需要将下面所有的代码都放在for循环里面(全选,tab就行)
print(f"\n===========正在爬取第{page}页数据==========")
# 获取网页
url = f"https://tj.lianjia.com/ershoufang/hexi/pg{page}/"
# 每次翻页https://tj.lianjia.com/ershoufang/hexi/pg1/就会改变,所以就用占位符hexi/pg{page},并赋值给f,f再赋值给url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
# 2、发送指定链接地址的请求(代码) request
response = requests.get(url=url, headers=headers)
html_data = response.text
# print(html_data)
# 3、解析出我们需要的数据 parsel
# 3.1 首先转换数据类型
selector = parsel.Selector(html_data)
# 用parsel模块的selector方法将提取出来的html_data数据进行转换,并赋值给selector
# print(selector)
lis = selector.css('.clear.LOGCLICKDATA')
# 这里是使用selector.css方法提取网页统一的li标签,并赋值给lis。
# 网页css里li标签<class="clear LOGCLICKDATA" 需要经过处理,空格改为.
# 这里进行for循环提取网页内容
for li in lis: # 网页里有多个li标签,这里使用for循环遍历每一个li标签
title = li.css('.title a::text').get() # get方法只能取一个标签 #取房子标题
# 每一个标签都使用css进行数据的二次提取,提取网页源码里的class="title"类标签,
# 然后提取类标签里的a标签也就是房子名称,我们需要a标签里的值,所以需要使用text处理
# 简单说就是我先取title类标签,然后取类标签里的a标签,最后我再取a标签里的文本内容,并用gat方法处理好赋值给title
# 最后处理好了要用get方法赋予给title值,也就是定义的房源名称
address = li.css('.flood a::text').getall() # 取房子地址 因为网页里有多个标签所以用getall
address = '- '.join(address) # 这里将提取出来的数据用- 分割
introduce = li.css('.houseInfo::text').get() # 房子介绍
star = li.css('.followInfo::text').get() # 房子关注
tags = li.css('.tag span::text').getall() # 房子标签
tags = ' | '.join(tags)
totaLprice = li.css('.priceInfo .totalPrice span::text').get() + "万元" # 总价
unitprice = li.css('.unitprice span::text').get() # 单价
print(title, address, introduce, star, tags, totaLprice, unitprice, sep="---")
# 这里print要放到for循环里打印,不然就只能打印出来一条数据
# 使用 sep="---" 方法对每项结果使用---进行分割
# 数据保存
import csv
with open('lianjia.csv', mode='a', encoding='utf-8', newline='') as f:
# 用with打开一个xxx.csv的文件,mode写入方式,a为追加。设置编码写入方式.写入文件的数据需要用newline关键字参数解决数据空行。然后as f:文件对象
csv_write = csv.writer(f)
csv_write.writerow([title, address, introduce, star, tags, totaLprice, unitprice])
else:
print("没有这个地址")
评论 (0)