对链家北京二手房的部分信息提取--正则匹配

import csv
from urllib import request
import re
from time import sleep

【下载模块】

定义一个函数,用于将url处理成请求对象

def request_from(url, page):
# 首先要拼接url
page_url = url + str(page) + '/'
# 请求头
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
return request.Request(url=page_url, headers=headers)


def request_data(url, start, end):
# 这个函数用于将有start页到end页的url处理成响应字符串,然后放在容器中返回

# 对start到end进行遍历,
for page in range(start, end+1):
    # 创建请求对象
    req = request_from(url=url, page=page)
    # 发起请求
    res = request.urlopen(req)
    # 每请求一次,要让程序中断1s,主要防止后台误认为当前程序是爬虫
    print('当前正在打印%d页' % page)
    sleep(1)
    yield res.read().decode('utf-8')
    # yield 可以将一个函数变成生成器,生成器中的内容就是每一次yield后面的内容

【解析模块】

def analysis_data(data):
for html in data:
    # 解析html字符串
    pat = re.compile(r'
  • ', re.S) room_list = pat.findall(html) # 遍历所有的二手房信息 for room in room_list: # 用正则来匹配每个二手房中的内容,并且提取出来 # 提取每一个二手房中的内容 # 创建一个字典用于整合每一个二手房的相关内容 item = {} # 二手房主题信息 pat_fang = re.compile(r'
    (.*?)<', re.S) item['fang'] = pat_fang.findall(room)[0] # 二手房地址 pat_address = re.compile(r'(.*?)', re.S) item['address'] = pat_address.findall(room)[0] # 二手房简介 pat_content = re.compile(r'.* (.*?)
    ', re.S) item['content'] = pat_content.findall(room)[0] # 价格 pat_price = re.compile(r'
    (.*?)<', re.S) item['price'] = pat_price.findall(room)[0] # 楼层 pat_floor = re.compile(r'(\S+).*(.*?)<', re.S) item['position'] = pat_position.findall(room)[0] # 楼层+位置 # pat_floor = re.compile(r'(.*?)(.*?)<', re.S) # item['floor'] = pat_floor.findall(room)[0][0] + pat_floor.findall(room)[0][1] # print(item) yield item
  • 【存储模块】

    存csv二维表

    def write_to_csv(data):
    # 打开csv文件
    csvfile = open('./lianjia.csv', 'a+', encoding='utf-8', newline='')  # 以追加的方式打开csv文件
    
    # 根据打开的csv文件创建写对象
    writer = csv.writer(csvfile)
    
    # 写表头
    writer.writerow(['fang', 'content', 'address', 'price', 'floor', 'position'])
    
    # 将data中的存储的内容写入二维表中
    for item in data:
        # csv表中的每一行就是编程语言中的一个一维列表,
        row = []
        row.append(item['fang'])
        row.append(item['content'])
        row.append(item['address'])
        row.append(item['price'])
        row.append(item['floor'])
        row.append(item['position'])
        # row.append(item['pic']['url'])
        # row.append(item['pic']['filename'])
        # 将row列表写入csv中
        writer.writerow(row)
    

    主函数

    if __name__ == '__main__':
    url = 'https://bj.lianjia.com/ershoufang/'
    
    # 请求网页
    content_list = request_data(url=url, start=1, end=20)
    
    # 解析
    list = analysis_data(content_list)
    
    # 存储
    write_to_csv(list)
    

    你可能感兴趣的:(对链家北京二手房的部分信息提取--正则匹配)