新手,整个程序还有很多瑕疵。

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-新手爬取安居客新房房源的更多相关文章

  1. python爬虫爬取安居客并进行简单数据分析

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...

  2. Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

  3. python爬取安居客二手房网站数据(转)

    之前没课的时候写过安居客的爬虫,但那也是小打小闹,那这次呢, 还是小打小闹 哈哈,现在开始正式进行爬虫书写 首先,需要分析一下要爬取的网站的结构: 作为一名河南的学生,那就看看郑州的二手房信息吧! 在 ...

  4. PyCharm+Scrapy爬取安居客楼盘信息

    一.说明 1.1 开发环境说明 开发环境--PyCharm 爬虫框架--Scrapy 开发语言--Python 3.6 安装第三方库--Scrapy.pymysql.matplotlib 数据库--M ...

  5. 【scrapy实践】_爬取安居客_广州_新楼盘数据

    需求:爬取[安居客—广州—新楼盘]的数据,具体到每个楼盘的详情页的若干字段. 难点:楼盘类型各式各样:住宅 别墅 商住 商铺 写字楼,不同楼盘字段的名称不一样.然后同一种类型,比如住宅,又分为不同的情 ...

  6. python3 [爬虫实战] selenium 爬取安居客

    我们爬取的网站:https://www.anjuke.com/sy-city.html 获取的内容:包括地区名,地区链接: 安居客详情 一开始直接用requests库进行网站的爬取,会访问不到数据的, ...

  7. python3 爬虫之爬取安居客二手房资讯(第一版)

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Author;Tsukasa import requests from bs4 import Beau ...

  8. python爬取博客圆首页文章链接+标题

    新人一枚,初来乍到,请多关照 来到博客园,不知道写点啥,那就去瞄一瞄大家都在干什么好了. 使用python 爬取博客园首页文章链接和标题. 首先当然是环境了,爬虫在window10系统下,python ...

  9. python大规模爬取京东

    python大规模爬取京东 主要工具 scrapy BeautifulSoup requests 分析步骤 打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点 我们可以看到这个页面 ...

随机推荐

  1. NPM 使用介绍(包管理工具,解决NodeJS代码部署上的很多问题)

    引用地址:http://www.runoob.com/nodejs/nodejs-npm.html NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问 ...

  2. MongoDB错误记录

    文章目录 mongoDB启动报错 mongoDB启动报错 在bin目录下执行 ./mongod 报错如下 F CONTROL [main] Failed global initialization: ...

  3. day 51 阿里iconfont的使用

    阿里iconfont的使用   1. 找到阿里巴巴图标库 2.找到图标 3.搜索你想要的图标 4.将图标添加到购物车 5.点击右上角的购物车按钮,我这里添加了两个. 6.提示你登陆,不需要花钱,找其中 ...

  4. Loadrunner 性能测试工具笔记

    性能的是的基础知识 什么是负载? 系统实际用户:可能会有很多人使用同一个系统,但并不是所有用户都回同时使用该系统,所以系统的实际用户是一个容量问题,而不是负载的问题 系统在线用户:当系统用户对系统进行 ...

  5. QVaraint类

    一.QVaraint简介     QVaraint类作为一个包含了大多数Qt普通类型的的联合体类.因为c++联合体没有构造函数和析构函数的,许多继承的Qt类不能够在联合体当中使用.(联合体当中的变量共 ...

  6. JavaScript变量名与函数名的命名规范

    JavaScrip变量名与函数名的命名规范严格遵循以下5条: (1)首字符必须是字母.下划线.$,后跟任意的字母.数字.下划线.$ (2)严格区分大小写 (3)不能使用系统的关键字和保留字 (4)命名 ...

  7. Django关于migrate无效的问题

    目录 django关于manage.py migrate无效的问题解决 django关于manage.py migrate无效的问题解决 问题描述: 对于django已有的model,修改之后,想重新 ...

  8. JavaScript中数组的集合和映射

    集合 集合(set)是在ES6中引入的一种数据结构,用于表示唯一值的集合,所以它不能包含重复值.接 下来这一小节,就让我们具体来看一下这种新的数据结构. Set集合是一种无重复元素的列表,这是这种数据 ...

  9. 杂项-VOD:VOD(视频点播)

    ylbtech-杂项-VOD:VOD(视频点播) 视频点播是二十世纪90年代在国外发展起来的,英文称为“Video on Demand”,所以也称为“VOD”.顾名思义,就是根据观众的要求播放节目的视 ...

  10. Struts2中param的作用

    1.页面传参与配置传参的区别:如果页面Form表单的参数在Action类中有相应的setter方法,则会优先取页面Form表单传过来的值,如果页面没有该属性同名的参数,则会从配置文件中取同名的参数值作 ...