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

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. day20_函数的闭包 与 装饰器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # # 一些文章 # https://www.cnblogs.com/Vae1242/p/6944338.ht ...

  2. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  3. MongoDB特性及使用场景

    概述 MongoDB(Humongous Database),中文意思就是巨大无比的数据库,顾名思义,MongoDB就是为处理大数据而生,以解决海量数据的存储和高效查询使用为使命.MongoDB是一款 ...

  4. 零基础入门学习python--第二章 用Python设计第一个游戏

    知识点汇总1. 什么是BIF? BIF(Built-in Functions)内置函数,共68个,可直接调用,方便程序员快速编写脚本程序.输入dir(__builtins__)即可查看所有内置函数,h ...

  5. P1020 导弹拦截 /// DP Dilworth定理 LIS、LDS优化

    题目大意: https://www.luogu.org/problemnew/show/P1020 Dliworth有两个互相对偶的定理:U的链划分使用的最少集合数,等于它的最大反链长度.(1)U的反 ...

  6. USACO 2007 February Silver The Cow Lexicon /// DP oj24258

    题目大意: 输入w,l: w是接下来的字典内的单词个数,l为目标字符串长度 输入目标字符串 接下来w行,输入字典内的各个单词 输出目标字符串最少删除多少个字母就能变成只由字典内的单词组成的字符串 Sa ...

  7. 调试存储过程与declare语句差异

     当应用有调用存储过程,而节点有几十个或者上百个,找错是不是一个很麻烦的事情,这个时候,我建议写到数据库中,下面是我做的一个demo. 1. 建立错误日志记录表 drop table PUB_PROC ...

  8. java关于lombok(包括父类参数)

    java关于lombok对bean对象进行自动设置 使用说明 使用方式 注释类型 @NonNull @Data(常用) @NoArgsConstructor(常用)/@RequiredArgsCons ...

  9. html--div里让图片水平居中

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 我喜欢Mouding

    我Smily喜欢Mouding