5.链家网爬虫(包含,json,csv,数据库存储方式)

import json
from urllib import request, parse
from bs4 import BeautifulSoup
import csv
import pymysql # 先安装(pip install pymysql)

# 1. 请求页面
# 构造请求对象
def create_request(url,page,city):
    page_url = url%(city,page)
    # print(page_url)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
    }
    return request.Request(url=page_url, headers=headers)

# 发起请求
def request_data(req):
    res = request.urlopen(req)

    return res.read().decode('utf-8')

# 2. 解析页面
def anylasis_html(html):
    # 把html字符串初始化到soup对象中
    soup = BeautifulSoup(html,'lxml')
    # 选择所有的房屋信息
    house_list = soup.select('li.clear')
    # print(len(house_list))
    for house in house_list:
        # 定义一个字典,用于保存房屋信息
        item = {}
        # title
        item['title'] = house.select('.title a')[0].get_text()

        # 房屋信息
        item['house'] = house.select('.houseInfo')[0].get_text()

        # 位置信息
        item['positions'] = house.select('.positionInfo')[0].get_text()

        # 总价
        item['totalPrice'] = house.select('.totalPrice')[0].get_text()

        # 单价
        item['unitPrice'] = house.select('.unitPrice')[0].get_text()

        # 图片
        item['img'] = house.select('.lj-lazy')[0].get('data-original')

        yield item

# 3. 存储数据
# 1> 存入json
def write_to_json(data):
    # 把数据整合成json支持的类型
    json_list = []
    for houses in data:
        for house in houses:
            json_list.append(house)
    with open('lianjia.json','w') as fp:
        fp.write(json.dumps(json_list))

# 2> 存入csv
def write_to_csv(data):
    # 在写csv的时候,首先需要把data整合成一个二维列表
    # 定义一个大列表,用于存储所有的房屋信息
    csv_items = []
    for houses in data:
        for house in houses:
            # house是字典,按照键值得形成存储了每个房屋的信息,取出值
            item = []
            # 遍历house字典依次取出每一个值
            for k,v in house.items():
                item.append(v)
            csv_items.append(item)
    # 写入csv
    with open('lianjai.csv', 'w') as fp:
        # 用fp 来创建一个csv的写对象
        w = csv.writer(fp)
        # 写表头
        w.writerow(['title', 'house', 'position', 'totalPrice', 'unitPrice', 'img'])
        # 写数据
        w.writerow(csv_items)


# 3> 存入数据库
def write_to_mysql(data):
    # 创建一个mysql数据库的链接
    conn = pymysql.connect(host='127.0.0.1', port = 3306, user='root', password='root', db = 'lianjiadb', charset='utf8')
    # 创建一个游标,用于解析sql语句
    cursor = conn.cursor()
    # 创建sql语句
    for houses in data:
        for house in houses:
            sql = 'insert into ershoufang values(NULL , "%s", "%s","%s", "%s","%s", "%s")'%(house['title'],house['house'],house['positions'], house['totalPrice'],house['unitPrice'], house['img'])
            # print(sql)
            # 解析并提交sql语句
            cursor.execute(sql)
            conn.commit()
    # 关闭游标和数据库链接
    cursor.close()
    conn.close()


def main():
    # https://sz.lianjia.com/ershoufang/pg1/
    url = 'https://%s.lianjia.com/ershoufang/pg%d/'
    city = input('请输入城市:')
    start = input('请输入起始页:')
    end = input('请输入终止页:')
    # 创建一个空列表,用于整合
    house_list = []
    for page in range(int(start), int(end)+1):
        # 构造请求对象
        req = create_request(url=url,page=page,city=city)

        # 发起请求
        html = request_data(req)

        # 解析请求
        res = anylasis_html(html)

        # json数据需要在这里把生成器整合成json支持的格式
        house_list.append(res)

    # 存储数据
    # json数据的存储
    # write_to_json(house_list)

    # 存入csv
    # write_to_csv(house_list)

    # 存入数据库
    write_to_mysql(house_list)



if __name__ == '__main__':
    main()


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容