panison 发表于 2021-3-25 09:29

爬取哈尔滨国土资源局土地招拍挂信息,并导出为CSV

本帖最后由 panison 于 2021-3-25 12:08 编辑

有一位营销部门的哥们,需要统计哈尔滨国土局的土地招拍挂信息,而从网上粘贴复制信息很麻烦。当时只会Excel,帮不了他多少忙。
在学了Python几个月后,发现可以通过Python解决这个问题。

附源代码:


import re
import requests_html

session = requests_html.HTMLSession()

# 获取累计页数

url = "http://xxgk.harbin.gov.cn/module/xxgk/search.jsp"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"}
params = {"divid": "div11574", "infotypeId": "TDZPGX", "jdid": "2", "area": "002277134"}

request = session.post(url=url, headers=headers, params=params)
request.encoding = "utf-8"

pattern = r"共\d+页"

pages = int(re.findall(pattern, request.text))

# 建立字典,存放土地使用权出让的url,title

land_urls = dict()

# 每页获取页面中的土地使用权出让的url, title

for page in range(1, pages + 1):
    params = {
      "divid": "div11574",
      "infotypeId": "TDZPGX",
      "jdid": "2",
      "area": "002277134",
      "currpage": str(page)
    }
    request_page = session.post(url=url, headers=headers, params=params)
    request_page.encoding = "utf-8"
    titles = request_page.html.xpath("//li/a/@title")
    hrefs = request_page.html.xpath("//li/a/@href")

    page_urls = dict(zip(titles, hrefs))

    for key in list(page_urls.keys()):
      if key[-4:] == "出让公告":
            land_urls = page_urls


# 获取每个土地出让公告的信息,并将信息存入列表land_bid_info
land_bid_info = list()
land_bid_info.append([
    "地块编号",
    "宗地位置",
    "用地性质",
    "出让方式",
    "用地面积(平方米)",
    "规划建筑面积(平方米)",
    "出让年限",
    "容积率",
    "出让起始价(元)",
    "竞买保证金(元)",
    "公告网址"
])
print("========================================获取土地出让记录========================================")

for url in list(land_urls.values()):
    print("指定URL:" + "{: <64}".format(url), end=",")
    request_url = session.get(url=url, headers=headers)
    request_url.encoding = "utf-8"
    # 根据表头金额标题的文本确定金额单位是元还是万元
    money = "".join(request_url.html.xpath("//div[@id='zoom']/table/tbody/tr/td/p/span/text()"))
    if "万元" in money:
      flag = False
    else:
      flag = True

    # 遍历表体的每一行记录
    trs = request_url.html.xpath("//div[@id='zoom']/table/tbody/tr")
    for tr in trs:
      line = list()

      # 遍历每一行记录信息的每个字段(出让起始价、竞拍保证金除外)
      for td in tr.xpath("//td"):
            txt = ""
            for string in td.xpath("//text()"):
                txt = txt + string.replace(",", ",")# 防止csv多余的逗号
            line.append(txt)

      # 获取出让起始价、竞拍保证金,且全部转换金额单位为元。
      money_1 = "".join(tr.xpath("//td/p/span/text()")).replace(" ", "")
      money_2 = "".join(tr.xpath("//td/p/span/text()")).replace(" ", "")
      if flag:
            txt_1 = money_1
            txt_2 = money_2
      else:
            txt_1 = str(int(money_1)*10000)
            txt_2 = str(int(money_2)*10000)
      line.append(txt_1)
      line.append(txt_2)
      line.append(url)

      # 一条记录获取完毕,添加到列表land_bid_info
      land_bid_info.append(line)
    print("指定URL的土地出让记录获取完毕!")

print("=====================================将土地出让记录写入csv文件:=====================================")

# 将土地出让记录写入csv文件
with open("哈尔滨土地出让公告.csv", 'w+', encoding="utf-8") as f:
    for line in land_bid_info:
      f.write(",".join(line) + "\n")

print("=====================================土地出让记录已写入csv文件!=====================================")


说明一下:土地招拍挂信息都是依法需要公开的信息。放心使用即可。

panison 发表于 2021-3-30 15:27

叫我小王叔叔 发表于 2021-3-30 12:22
大佬,为嘛我导出来的是乱码,print r.html是正常的

导出来的是utf-8字符编码的CSV文件,由于中文Excel打开文件的字符编码默认不是utf-8,因此不能直接用中文Excel打开。可以在Excel中,数据选项卡--获取外部数据--自文本……,涉及到编码时选择utf-8即可。

ciker_li 发表于 2021-3-25 09:51

感谢分享

airdear 发表于 2021-3-25 09:51

学习了~~~~~

Z_X_Y__ 发表于 2021-3-25 09:53

能帮忙爬下湖北省宜昌市的土地招拍挂信息嘛{:1_893:}

日月与你 发表于 2021-3-25 10:32

python真利器啊

上单小鳄鱼 发表于 2021-3-25 10:39

高手 学习一下

kosaku 发表于 2021-3-25 11:28

学以致用,知行合一,向楼主学习~~!

王争光 发表于 2021-3-25 11:43

离监狱更进一步!

52poeji131 发表于 2021-3-25 11:47

爬虫用得好 牢饭吃得饱

DestinyUkiyo 发表于 2021-3-25 13:08

从入门到入狱系列:lol
页: [1] 2
查看完整版本: 爬取哈尔滨国土资源局土地招拍挂信息,并导出为CSV