Python-新手爬取安居客新房房源
新手,整个程序还有很多瑕疵。
1.房源访问的网址为城市的拼音+后面统一的地址。需要用到xpinyin库
2.用了2种解析网页数据的库bs4和xpath(先学习的bs4,学了xpath后部分代码改成xpath)
遇到的问题:
1.在解析页面时,鼠标点击过位置的div的class属性值有变化,没有注意,导致浪费很长时间。下图,点击后的div的class属性值的空格没有了。

2.基础学习还要加强,字符串和列表基本命令和转换使用不熟练。
3.没有真正理解 new_list = [i for i in list if i != ''] #删除列表里的空值 这条语句的意思,只是照搬过来用。
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
from xpinyin import Pinyin
import time
from lxml import etree
import json class anjuk_spider(object):
url = '.fang.anjuke.com/loupan/all/'
def __init__(self,city):
self.city = city
#建一个空列表,存放所有的房源信息
self.items = [] #把输入的城市转换成拼音
def citypinyin(self,city):
p = Pinyin()
return p.get_pinyin(self.city,'')
#构建请求体
def handle_request(self,city_url,page_num):
city_url = city_url + 'p' + str(page_num + 1) + '/'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
}
request = urllib.request.Request(city_url, headers=headers)
return request #解析价格
def price(self,item):
temp = item.xpath('.//a[@class="favor-pos"]/p[1]/text()')[0]
if temp == '售价待定':
temp = temp + " 周边均价:" + item.xpath('.//a[@class="favor-pos"]/p/span/text()')[0] + "元/㎡"
else:
temp = temp + item.xpath('.//a[@class="favor-pos"]/p/span/text()')[0] + "元/㎡"
return temp #解析户型
def huxing(self,item):
temp = item.xpath('.//a[@class="huxing"]//text()')
# 第1步,先建立个空列表。整理爬下来的列表,去掉空格,换行等
list = []
for item in temp:
item = item.replace("\n", "").replace("\t", "").replace("\xa0", "").replace("/", "").replace(" ", "")
list.append(item)
# 删除列表里的空值
new_list = [i for i in list if i != '']
# 把整理好的列表转换成新字符串
item_huxing = "/".join(new_list)
return item_huxing
#解析位置
def address(self,item):
temp = item.xpath('.//a[@class="address"]//span[@class="list-map"]/text()')[0]
end_item_address = temp.find("]")
item_address = temp[end_item_address + 2:]
return item_address #解析数据
def parse_content(self,content):
#利用xpath提取数据
tree = etree.HTML(content)
div_list = tree.xpath('//div[@class="key-list imglazyload"]//div[@class="item-mod "]')
for item in div_list:
try:
#小区名称
item_name = item.xpath('.//h3//span[@class="items-name"]/text()')[0]
#小区位置
item_address = self.address(item)
#小区户型
item_huxing = self.huxing(item)
# 小区价格
item_Price = self.price(item)
#把数据存放到字典中
dict = {
"小区名称":item_name,
"小区位置":item_address,
"户型面积":item_huxing,
"价格":item_Price,
}
#每条字典更新到列表中
self.items.append(dict)
print("小区名称:%s | 位置:%s" %(item_name,item_address))
print("%s|价格:%s" %(item_huxing,item_Price))
print("******************************************************************************")
time.sleep(1)
# print("小区名称:%s | 小区位置:%s |价格:%s" % (item_name,item_address,item_Price))
except:
print("读取出现问题!") def run(self):
# 先要取得请求网址,请求网址的组合为城市拼音+上后面的网址
citypinyin = self.citypinyin(self.city)
#输入的城市请求网址
city_url = 'https://' + citypinyin + self.url
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
}
#请求体
city_request = urllib.request.Request(city_url,headers = headers)
# 发送请求
content = urllib.request.urlopen(city_request).read().decode()
#处理响应数据,提取当前房源数量,判断应读取几页数据
#创建bs4对象
soup = BeautifulSoup(content,'lxml')
temp_page = int(soup.select('.list-results > .key-sort > .sort-condi > span > em')[0].text)
#用取得的房源数量,计算需要读取多少页数据
#每页有60条数据,如果能整除,那就有总数/60页,如果不能整除,那么就总数/60取整+1页。
if temp_page <= 60:
page = 1
if (temp_page % 60) == 0:
page = temp_page / 60
else:
page = (temp_page // 60) + 1 #发送请求
for page_num in range(page):
#输入网址,页数,反回请求数据
request = self.handle_request(city_url,page_num)
content = urllib.request.urlopen(request).read().decode()
#解析数据
self.parse_content(content)
time.sleep(2)
#转成json格式
string = json.dumps(self.items,ensure_ascii=False)
#将数据写入文本中
with open('安居客房价.txt','w',encoding='utf-8') as f:
f.write(string)
print("存入文本!") def main():
city = input("请输入城市名字:")
#创建对象,开始爬取数据
spider = anjuk_spider(city)
spider.run() if __name__ == '__main__':
main()
Python-新手爬取安居客新房房源的更多相关文章
- python爬虫爬取安居客并进行简单数据分析
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...
- Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据
目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...
- python爬取安居客二手房网站数据(转)
之前没课的时候写过安居客的爬虫,但那也是小打小闹,那这次呢, 还是小打小闹 哈哈,现在开始正式进行爬虫书写 首先,需要分析一下要爬取的网站的结构: 作为一名河南的学生,那就看看郑州的二手房信息吧! 在 ...
- PyCharm+Scrapy爬取安居客楼盘信息
一.说明 1.1 开发环境说明 开发环境--PyCharm 爬虫框架--Scrapy 开发语言--Python 3.6 安装第三方库--Scrapy.pymysql.matplotlib 数据库--M ...
- 【scrapy实践】_爬取安居客_广州_新楼盘数据
需求:爬取[安居客—广州—新楼盘]的数据,具体到每个楼盘的详情页的若干字段. 难点:楼盘类型各式各样:住宅 别墅 商住 商铺 写字楼,不同楼盘字段的名称不一样.然后同一种类型,比如住宅,又分为不同的情 ...
- python3 [爬虫实战] selenium 爬取安居客
我们爬取的网站:https://www.anjuke.com/sy-city.html 获取的内容:包括地区名,地区链接: 安居客详情 一开始直接用requests库进行网站的爬取,会访问不到数据的, ...
- python3 爬虫之爬取安居客二手房资讯(第一版)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Author;Tsukasa import requests from bs4 import Beau ...
- python爬取博客圆首页文章链接+标题
新人一枚,初来乍到,请多关照 来到博客园,不知道写点啥,那就去瞄一瞄大家都在干什么好了. 使用python 爬取博客园首页文章链接和标题. 首先当然是环境了,爬虫在window10系统下,python ...
- python大规模爬取京东
python大规模爬取京东 主要工具 scrapy BeautifulSoup requests 分析步骤 打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点 我们可以看到这个页面 ...
随机推荐
- vue.js出现cannot get /错误
config中的index.js 原来是 assetsPublicPath: './', 改为 assetsPublicPath: '/',
- mysql用户和权限
1.创建用户 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码" mysql>grant all privileges o ...
- mysql的建表约束
主键约束(primary key) 主键约束能够唯一确定一张表中的记录,也就是可以通过某个字段添加约束,就可以是的该字段不重复,且不为空 create table user (id int prima ...
- angularJs FileUpload插件上传同一文件无效问题记录
参考:https://blog.csdn.net/qq_34829447/article/details/83780392 问题:使用FileUpload插件进行文件上传时,发现无法上传与上个文件相同 ...
- springcloud Eureka Finchley.RELEASE 版本
创建一个父项目cloud-demo pom.xml <?xml version="1.0" encoding="UTF-8"?> <proje ...
- Android 开发 MediaRecorder使用Camera1配合录制视频
前言 MediaRecorder可以不依靠Camera API 实现视频的录制,但是如果需要切换摄像头/设置对焦/选择分辨率等等就需要Camera来参与配合录制视频.这篇博客将介绍使用Camera1来 ...
- [转]Entity Framework 的实体关系
通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?“血”的教训啊,刚开始使用 Entity Framework ...
- python+selenium中webdriver相关资源
Chrome chrome的webdriver : http://chromedriver.storage.googleapis.com/index.html chrome的webdriver需要对 ...
- (转载)——Centos下安装Redis(原文地址:http://www.nnzhp.cn/archives/169)
原文地址:http://www.nnzhp.cn/archives/169 今天介绍一下redis,重点介绍一下redis的安装. Redis 是一个基于内存的高性能key-value数据库,数据都保 ...
- 并发和多线程(九)--AbstractQueuedSynchronizer排他锁基本原理
AbstractQueuedSynchronizer简称为AQS,AQS是ReentrantLock.CountdownLatch.CycliBarrier等并发工具的原理/基础,所以了解AQS的原理 ...