前言
摸个鱼现在没什么事干,浅浅的来个python的爬虫项目之一的介绍,可视化爬虫一直是我们追求的目标,但是内卷严重的现在如何进行可视化爬虫是我们面临的一大难题,在此之下这款内卷神器就诞生了。受害者网站是链家,因为确实链家的网站反爬措施比较人性化,而且数据都是有较高的规律,我们能高效地爬取数据。废话不多说,下面进行展示,如果符合您的眼缘记得打赏一个赞。
一、来吧展示
今天来介绍下初级版本:
自己做的tk界面找不到了,但是qt界面并不影响,主要是看代码,有兴趣可以接着往下面看。
二、如何实现爬取
1.首先观察受害者
可以发现无论在链家怎么点击变换,很显而易见的是变化的只有前面城市的缩写以及后面页码的变换,也就是图例中cq(重庆)以及后面pg1(页码)
所以这是我们注意的点,我们可以利用这点进行下手写出
url=‘https://’+city+‘.lianjia.com/ershoufang/pg{}/’.format(page)来便于操作
2.进行爬取
有了1步骤的帮助,接下来,我们对网站进行爬取
代码如下(示例):
city = input("请输入城市首字母:")
start_page = input("请输入爬取起始页:")
end_page = input("请输入爬取结束页:")
for page in range(int(start_page), int(end_page)+1):
print('===========================正在下载第{}页数据================================'.format(page))
time.sleep(1)
#获取爬取的页面
url = 'https://'+city+'.lianjia.com/ershoufang/pg{}/'.format(page)
#伪装浏览器,导入的UserAgent库中有许多User-Agent,每次随机生成一个,预防被反爬虫
headers = {
'User-Agent': str(UserAgent().random)
}
response = requests.get(url=url, headers=headers)
要注意,受害者反爬不是没有,你可以在底下加上
print(response.text)
//来观察到底有没有爬取成功如果有接着下面步骤
可以发现房子名价格等都在li节点中,现在我们要想方设法从li节点对数据进行爬取清洗筛选,现在动手
#解析文本文件,选择出来每一个li节点,每个节点中含有一条信息的全部内容
lis = selector.css('.sellListContent li')
dit = {}
for li in lis:#向字典中存储信息
#获取其中的文字内容的title,以下类似
title = li.css('.title a::text').get()
dit['标题'] = title
positionInfo = li.css('.positionInfo a::text').getall()
info = '-'.join(positionInfo)
dit['开发商'] = info
houseInfo = li.css('.houseInfo::text').get()
dit['房子信息'] = houseInfo
followInfo = li.css('.followInfo::text').get()
dit['发布周期'] = followInfo
Price = li.css('.totalPrice span::text').get()
dit['售价/万'] = Price
unitPrice = li.css('.unitPrice span::text').get()
dit['单价'] = unitPrice
csv_writer.writerow(dit)
cities_price.append(float(dit['售价/万']))
print(dit)
如图这是效果,当然爬取的数据是需要保存的,我们先可以保存在csv数据库中方便覆盖和重写
f = open('二手房信息.csv', mode='a', encoding='utf-8-sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '开发商', '房子信息', '发布周期', '售价/万', '单价'])
csv_writer.writeheader()
总结
整体代码如下:
cities_price = []
#写csv表头
f = open('二手房信息.csv', mode='a', encoding='utf-8-sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '开发商', '房子信息', '发布周期', '售价/万', '单价'])
csv_writer.writeheader()
#目前这些城市有链家:北京、天津、大连、河北、青岛、济南、烟台、沈阳、上海、南京、杭州、苏州、厦门、广州、深圳、中山、佛山、惠州、东莞、珠海、成都、重庆、武汉、长沙
city = input("请输入城市首字母:")
start_page = input("请输入爬取起始页:")
end_page = input("请输入爬取结束页:")
for page in range(int(start_page), int(end_page)+1):
print('===========================正在下载第{}页数据================================'.format(page))
time.sleep(1)
#获取爬取的页面
url = 'https://'+city+'.lianjia.com/ershoufang/pg{}/'.format(page)
#伪装浏览器,导入的UserAgent库中有许多User-Agent,每次随机生成一个,预防被反爬虫
headers = {
'User-Agent': str(UserAgent().random)
}
#获取网页的get响应
response = requests.get(url=url, headers=headers)
#用css选择器先将,获取到的html放到选择器中
selector = parsel.Selector(response.text)
#解析文本文件,选择出来每一个li节点,每个节点中含有一条信息的全部内容
lis = selector.css('.sellListContent li')
dit = {}
for li in lis:#向字典中存储信息
#获取其中的文字内容的title,以下类似
title = li.css('.title a::text').get()
dit['标题'] = title
positionInfo = li.css('.positionInfo a::text').getall()
info = '-'.join(positionInfo)
dit['开发商'] = info
houseInfo = li.css('.houseInfo::text').get()
dit['房子信息'] = houseInfo
followInfo = li.css('.followInfo::text').get()
dit['发布周期'] = followInfo
Price = li.css('.totalPrice span::text').get()
dit['售价/万'] = Price
unitPrice = li.css('.unitPrice span::text').get()
dit['单价'] = unitPrice
csv_writer.writerow(dit)
cities_price.append(float(dit['售价/万']))
print(dit)
下一次将介绍分析的功能实现以及进一步完善,可以点一个关注哦