前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 爬取租房信息存储至mysql数据库

python 爬取租房信息存储至mysql数据库

作者头像
小末快跑
发布2019-07-03 17:21:00
1.7K0
发布2019-07-03 17:21:00
举报
文章被收录于专栏:日常撸知识日常撸知识

利用python requests库获取网页信息;

利用bs库解析网页内容;

pymysql用于操作mysql数据库;

将获取的信息存储至mysql数据库。

效果如图:

1.导入需要的库,并建立数据库连接。需要先安装好mysql数据库在本机上。

import requests from bs4 import BeautifulSoup

import re

import pymysql connect=pymysql.connect(user='root',password='root',host='localhost',port=3306,db='python',charset='utf8') conn=connect.cursor() conn.execute("create database if not exists Ganjizufang character set utf8;") conn.execute("use Ganjizufang;") sql="""create table if not exists roominfo (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(200),price VARCHAR(200),room_type VARCHAR(200),room_size VARCHAR(200),room_direction VARCHAR(200), room_total_floor VARCHAR(200),elecator VARCHAR(200),room_fixtures VARCHAR(200),viliage_name VARCHAR(200),raiway_distance VARCHAR(300),url VARCHAR(200))""" conn.execute('drop table if exists roominfo;') conn.execute(sql)

2.获取主网页信息。加上headers,利用requests.get()方法访问网页,用BeautifulSoup和lxml解析;

代码语言:javascript
复制
for i in range(1,20):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'}

    link='http://cd.ganji.com/fang1/ditie/m1o'+str(i)+'l21s2298/'
    r = requests.get(link, headers=headers)
    print 'The page is:',i
    soup = BeautifulSoup(r.text, 'lxml')
    house_list = soup.find_all('div', class_="f-list-item ershoufang-list")

3.获取子网页信息。主网页对room 信息只有很少的描述,需要获取子网页链接,访问子网页获取很多的room信息。获取href可获取子网页链接。

代码语言:javascript
复制
for house in house_list:
    next_link=house.find('dd',class_="dd-item title").find('a',class_='js-title value title-font')
    # find the next level link
    link1='http://cd.ganji.com'+str(next_link['href'])
    r1=requests.get(link1,headers=headers)
    soup1=BeautifulSoup(r1.text,'lxml')
    title=soup1.find('p',class_='card-title').text.strip()
    price=soup1.find('ul',class_='card-pay f-clear').find('li',class_='price').find('span',class_='num').text.strip()
    # how to handle the same tag
    room_type=soup1.find('ul',class_='er-list f-clear').contents[1].text.strip()
    room_size=soup1.find('ul',class_='er-list f-clear').contents[3].text.strip()
    room_direction=soup1.find('ul',class_='er-list f-clear').contents[5].text.strip()
    room_total_floor=soup1.find('ul',class_='er-list f-clear').contents[7].text.strip()
    elecator=soup1.find('ul',class_='er-list f-clear').contents[9].text.strip()
    try:
        room_fixtures=soup1.find('ul',class_='er-list f-clear').contents[11].text.strip()
    except:
        room_fixtures='no info'
    try:
        viliage_name=soup1.find('ul',class_='er-list-two f-clear').find('a',class_='blue').text.strip()
    except:
        viliage_name='no info'
    raiway_distance=soup1.find('div',class_='subway-wrap').find('span',class_='content').text.strip()
代码语言:javascript
复制
    try:
        address=soup1.find('ul',class_='er-list-two f-clear').contents[5].text.strip()
    except:
    #address='No info'
        phone=soup1.find('div',class_='card-info f-fr').find('div',class_='c_phone f-clear')
# how match the phone bunber, or use the click solution.
        phone_number=re.search(r'[0-9]+',phone)
上面try--except因为某些room的信息不全,无法获取对应的信息,程序会报错。将没有的信息给定为‘no info’.
4.每获取一条信息,将该信息存储至mysql数据库;用insert into将信息插入到数据库;
代码语言:javascript
复制
conn.execute("insert into roominfo(title,price,room_type,room_size,room_direction,room_total_floor,elecator,room_fixtures,viliage_name,raiway_distance,url) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')"%(title,price,room_type,room_size,room_direction,room_total_floor,elecator,room_fixtures,viliage_name,raiway_distance,link1))
conn.commit()
5.也可以将数据存储为text或者csv文件在本地。
代码语言:javascript
复制
with open('Ganjizufang.csv', 'a+') as f:
    f.write(title.encode('utf-8')+',')
    f.write(price.encode('utf-8') + ',')
    f.write(room_type.encode('utf-8') + ',')
    f.write(room_size.encode('utf-8') + ',')
    f.write(room_direction.encode('utf-8') + ',')
    f.write(room_total_floor.encode('utf-8') + ',')
    f.write(elecator.encode('utf-8') + ',')
    f.write(room_fixtures.encode('utf-8') + ',')
    f.write(viliage_name.encode('utf-8') + ',')
    f.write(raiway_distance.encode('utf-8') + ',')
    #f.write(address.encode('utf-8') + ',')
    f.write(link1.encode('utf-8') + ',')
    #f.write(price.encode('utf-8'))
    f.write('\n')
    f.close()

6.每获取一页内容,暂停两秒。最后关闭数据库。

代码语言:javascript
复制
    time.sleep(2)
conn.close()
connect.close()
保存csv效果如图:
代码语言:javascript
复制
 7.结语:访问量过多会被网站禁用ip,要求输入验证码后才能继续访问。可以建立代理池或者用代理服务器的方法伪装ip进行访问。
------------------------------------------------
8.附加:本地mysql数据库操作,以上面写入的数据数据为例。
1.将安装好的mysql添加至path环境变量里;
2.windows+R输入cmd进入命令行,输入mysql;输入密码;
3.connect Ganjizufang;
use Ganjizufang;
select * from roominfo;获取roominfo所有的信息;
select * from roominfo where price<2000;获取价格小于2000的房屋信息。
select title,price,room_type,room_size from roominfo where price<2000;只抓取部分信息。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小末快跑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档