c语言sscanf函数的用法是什么
283
2022-11-18
利用pyhton爬虫(案例3)--X房网的小房子们
写了个小案例,顺便复习一下以前学的知识点。 PS:复试之前绝不写爬虫案例了(对于现在的我来说,费脑又花时间),再写我吃XX.
文章目录
爬取X房网二手房信息
爬取步骤URL特征查看HTML页面源代码Xpath语句开始敲python代码mysql数据查询
爬取X房网二手房信息
要求:由用户输入需要的城市名、小区名称和页数,爬取相关信息,再将结果存入mysql
备注:用input方法输入城市名称,小区名称和页数。
爬取步骤
查看URL特征研究HTML页面结构编写xpath语句敲python代码(将数据存入数据库)在mysql中按条件查询数据
URL特征
①不同城市URL地址特征
南京二手房URL:
LOGCLICKDATA,为了避免有其他class属性值,我们再观察一下其他页面源代码,发现,果然还有一些li节点的class属性值为clear LOGVIEWDATA LOGCLICKDATA。
我们打开li节点,查看二手房信息的HTML结构。
二手房名称:
价格:
通过观察这些HTML页面源代码,我们可以开始写Xpath语句了。
Xpath语句
大节点:
//ul/li[@class='clear LOGCLICKDATA'] | //ul/li[@class='clear LOGVIEWDATA LOGCLICKDATA']
二手房名称:
./div[@class='info clear']/div[@class='title']/a/text()
价格:
./div[@class='info clear']//div[@class='totalPrice']/span/text()
二手房信息:
./div[@class='info clear']//div[@class='houseInfo']/text()
在敲代码之前,我们现在mysql中构建一个数据表house_table,用于存储数据:
create table house_table(id int primary key auto_increment,name varchar(50) not null,price int default 0,info varchar(200) default 'None');
开始敲python代码
敲代码:
# -*- coding: utf-8 -*-import requestsfrom lxml import etreeimport pymysqlimport randomimport timefrom urllib import parsefrom my_user_agent_list import user_agentimport mathclass PagenumError(Exception): def __init__(self, msg, page_value): super().__init__(msg) self.page_value = page_valueclass HouseSpider: def __init__(self): self.url = ' self.user_agent = user_agent self.page = 1 self.db = pymysql.connect(host = '127.0.0.1', port = 3306, user = 'root', password = '19970928', database = 'datacup', charset = 'utf8') self.cur = self.db.cursor() #获取html页面 def get_page(self, url): try: res = requests.get(url, headers = {'User-Agent':random.choice(self.user_agent)}) #print(res.url) #print(res.content.decode('utf-8')) except Exception as e: print('连接错误,请检查输入城市首字母是否正确...') = -1 html = 'None' return (html) else: html = res.content.decode('utf-8') = res.status_code return (html) #解析HTML页面 def parse_page(self, html): parse_html = etree.HTML(html) li_xpath = "//ul/li[@class='clear LOGCLICKDATA'] | //ul/li[@class='clear LOGVIEWDATA LOGCLICKDATA']" li_list = parse_html.xpath(li_xpath) data_list = [] for item in li_list: name = item.xpath("./div[@class='info clear']/div[@class='title']/a/text()") price = item.xpath("./div[@class='info clear']//div[@class='totalPrice']/span/text()") info = item.xpath("./div[@class='info clear']//div[@class='houseInfo']/text()") if not name: name = ['None'] if not price: price = ['0'] if not info: info = ['None'] info = [i for i in info[0].split('|') if i.strip()] data_list.append((name[0], price[0], ','.join(info))) self.write_page(data_list) #写出数据 def write_page(self, data_list): sql = 'insert into house_table(name, price, info) \ values(%s, %s, %s);' try: self.cur.executemany(sql, data_list) self.db.commit() except Exception as e: self.db.rollback() print('错误信息:', e) #主函数 def main(self): while True: this_page = 1 city = input('输入城市名首字母(如北京则输入bj):') region = input('输入中文格式的小区名(若查询整个城市,则输入z):') count_inpute_page = 0 while True: count_inpute_page +=1 try: my_page = math.ceil(int(input('输入查询页数:'))) if my_page <= 0: raise PagenumError('为非正数', my_page) except ValueError as e1: print('输入的不是数据') except PagenumError as e2: print('错误信息:', e2.page_value, e2.args[0]) except Exception as e: print('未知错误...') print(e.args) else: break if count_inpute_page >= 3: qtx = input('是否退出,若退出,只查询第1页信息(q):') if qtx == 'q': my_page = 1 break input_city = city.lower().strip() if region.strip() == 'z': input_region = '' url = self.url.format(input_city, 1, input_region) else: input_region = parse.quote(region) url = self.url.format(input_city, 1, input_region) (html) = self.get_page(url) #print(html) if == -1: qtx = input('是否退出(q),不退出则再查询一次(c):') if qtx == 'q': break else: continue else: for page in range(1, my_page + 1): url = self.url.format(input_city,page, input_region) (html) = self.get_page(url) self.parse_page(html) print('共爬取%d页' % self.page) print('本次爬取%d页' % this_page) self.page += 1 this_page += 1 time.sleep(random.randint(1, 3)) qtx = input('本次查询完成,是否退出(q),不退出则再查询一次(c):') if qtx == 'q': break self.cur.close() self.db.close() if __name__ == '__main__': start = time.time() spider = HouseSpider() spider.main() end = time.time() print('执行时间:%.2f' % (end-start))
控制台输出:
输入城市名首字母(如北京则输入bj):nj输入中文格式的小区名(若查询整个城市,则输入z):z输入查询页数:2共爬取1页本次爬取1页共爬取2页本次爬取2页本次查询完成,是否退出(q),不退出则再查询一次(c):c输入城市名首字母(如北京则输入bj):mas输入中文格式的小区名(若查询整个城市,则输入z):珍珠园输入查询页数:1共爬取3页本次爬取1页本次查询完成,是否退出(q),不退出则再查询一次(c):q执行时间:48.10
mysql数据查询
我们查看一下mysql中导入的数据。
Mysql Workbench执行语句输出(一共90条):
15:48:54 select * from house_table LIMIT 0, 1000 90 row(s) returned 0.000 sec / 0.000 sec
查询结果(部分):
# id, name, price, info'271', '绿地悦峰公馆 中等装修 满两年', '165', '2室2厅 , 68.62平米 , 南 , 简装 , 低楼层(共18层) , 2017年建 , 板楼''272', '应天花园双卧朝南东边户 南北通透采光佳 满五年诚售', '199', '3室1厅 , 79.27平米 , 南 北 , 简装 , 高楼层(共7层) , 1999年建 , 板楼''273', '安德门商圈 南北通透 户型方正 交通便利', '305', '2室1厅 , 86.99平米 , 南 北 , 简装 , 中楼层(共11层) , 2007年建 , 板楼''274', '万科金域蓝湾 边户南北通透 中间楼层 超大楼间距', '348', '3室2厅 , 84.57平米 , 南 北 , 精装 , 中楼层(共33层) , 2015年建 , 板楼''275', '应天大街 虹苑新寓 中间楼层 采光好 满五年', '207', '2室1厅 , 59.49平米 , 南 北 , 简装 , 高楼层(共6层) , 1996年建 , 板楼'
嗯!数据基本都导入了,爬取成功了!
我们在数据库中筛选价格大于450万的房子。
Mysql Workbench执行语句输出:
16:22:20 select * from house_table where price >= 400 LIMIT 0, 1000 8 row(s) returned 0.000 sec / 0.000 sec
查询结果:
# id, name, price, info'277', '此房满2年 正规2居室 三南户型 中间楼层 视野开阔', '440', '2室2厅 , 82.72平米 , 南 , 精装 , 中楼层(共30层) , 2017年建 , 板楼''279', '海德前排 全南户型 高楼层 视野好 景观棒 环境棒', '498', '3室1厅 , 100.01平米 , 南 , 精装 , 中楼层(共33层) , 2006年建 , 塔楼''286', '上海路 五台山 广州路 二十九中 龙蟠里', '418', '2室1厅 , 59.86平米 , 南 北 , 精装 , 高楼层(共6层) , 1990年建 , 板楼''295', '鲁能公馆 南北通透小三房 看房随时 中高楼层视野佳', '430', '3室2厅 , 89平米 , 南 北 , 精装 , 低楼层(共31层) , 2018年建 , 板楼''302', '此房南北通透 婚房装修 居住舒适', '430', '3室2厅 , 131.62平米 , 南 北 , 精装 , 中楼层(共10层) , 2009年建 , 板楼''303', '龙江 4号线 宝船公园旁 电梯改善 三房 有车位', '588', '3室1厅 , 125.67平米 , 南 , 精装 , 中楼层(共28层) , 2006年建 , 板楼''324', '地铁口 南农大旁 精装修 诚心卖', '425', '2室2厅 , 95.46平米 , 南 , 精装 , 低楼层(共6层) , 2004年建 , 板楼''325', '广州路 省人民 胸科医院旁精装修两房', '480', '2室1厅 , 51.83平米 , 南 , 精装 , 高楼层(共7层) , 1985年建 , 板塔结合'
OK!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~