Python批量爬取各地方房价走势

本文介绍了一个Python网络爬虫项目,该项目能够批量爬取不同城市的房价涨跌情况,并采用Xpath和PyQuery两种方法进行数据解析。最终将结果保存为文本文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

  • 为了更好的掌握数据处理的能力,因而开启Python网络爬虫系列小项目文章。小项目小需求驱动,每篇文章会使用两种以上的方式(Xpth、Bs4、PyQuery、正则)获取想要的数据。
  • 博客系列完结后,将会总结各种方式。

一、需求

  • 批量爬取各城市房价top10涨跌小区
  • 记录到.txt中

二、分析

页面数据显示

在这里插入图片描述

查看网页源代码

在这里插入图片描述

  • 网页源代码即可获取数据,通过数据解析方式(Xpath、Bs4、Pyquery即可获取)

三、处理

Xpath处理

# -*- encoding:utf-8 -*-
__author__ = "nick"
__created_date__ = "2022/10/7"


"""
批量爬取各城市房价走势涨幅top10和跌幅top10
"""

from lxml import etree
import requests


HEADERS = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"}
INDEX = "https://bj.fangjia.com/zoushi"


def process_index(url):
    """
    首页处理
    @param url: url
    @return: 返回首页源代码
    """
    res = requests.request("GET", url=url, headers=HEADERS)
    res.encoding = "utf-8"
    return res.text


def process_city(html):
    """
    各城市首页url获取
    @param html: 源代码
    @return: 返回各城市名和url
    """
    parse = etree.HTML(html)
    text = parse.xpath('//div[@class="tab_content"]/div')
    city_name = []
    city_url = []
    for i in text:
        city_name.extend(i.xpath("./a/text()"))
        city_url.extend(i.xpath("./a/@href"))
    city_info = dict(zip(city_name,city_url))
    return city_info


def process_trend(html):
    """
    各城市小区涨跌top处理
    @param html: 网页源码
    @return: 各城市小区名,房价基本信息
    """
    parse = etree.HTML(html)
    area = parse.xpath('//div[@class="trend trend03"]/div/div//tbody/tr')
    plot_name = []
    info = []
    for tr in area:
        plot_name.extend(tr.xpath("./td/a/text()"))
        plot_info = tr.xpath("./td/text()")
        base_info = ','.join(plot_info)
        info.append(base_info)
    plot_intend = dict(zip(plot_name,info))
    return plot_intend



if __name__ == '__main__':
    index_html = process_index(INDEX)
    city_dict = process_city(index_html)
    # 记录到文件中
    f = open('全国各城市房价小区涨跌top10_by_xpath.txt',"w", encoding="utf-8")
    # 批量获取各城市房价涨跌幅top10
    for city_name, city_url in city_dict.items():
        # 城市首页处理
        city_html = process_index(city_url)
        # 房价涨跌top10
        plot_intend = process_trend(city_html)
        if bool(plot_intend):
            for k,value in plot_intend.items():
                f.write(f"城市{city_name}----小区名--{k}---房价基本信息{value}\n")
                print(f"城市{city_name}----小区名{k}下载完毕....")
        else:
            f.write(f"城市{city_name}无涨幅小区top10\n")
        f.write(f"-------------------城市{city_name}分隔线--------------------------\n")
    f.close()

Pyquery 处理

# -*- encoding:utf-8 -*-
__author__ = "nick"
__created_date__ = "2022/10/7"


"""
批量爬取各城市房价走势涨幅top10和跌幅top10
"""

from pyquery import PyQuery as pq
import requests


HEADERS = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"}
INDEX = "https://bj.fangjia.com/zoushi"


def process_index(url):
    """
    首页处理
    @param url: url
    @return: 返回首页源代码
    """
    res = requests.request("GET", url=url, headers=HEADERS)
    res.encoding = "utf-8"
    return res.text


def process_city(html):
    """
    各城市首页url获取
    @param html: 源代码
    @return: 返回各城市名和url
    """
    doc = pq(html)
    tab = doc(".tab_content")
    a = tab("a")
    city_name = []
    city_url = []
    for info in a.items():
        city_name.append(info.text())
        city_url.append(info.attr("href"))
    city_info = dict(zip(city_name,city_url))
    return city_info


def process_trend(html="https://ak.fangjia.com/zoushi"):
    """
    各城市小区涨跌top处理
    @param html: 网页源码
    @return: 各城市小区名,房价基本信息
    """
    doc = pq(html)
    tab = doc(".trend03")
    plot_name = []
    info = []
    for tr in tab.items():
        for n in tr("tr a").items():
            name = n.text()
            plot_name.append(name)
        for td in tr("tr").items():
            house_info = td("td").text()
            house_info.strip("\n")
            info.append(house_info)
    plot_intend = dict(zip(plot_name,info))
    return plot_intend



if __name__ == '__main__':
    index_html = process_index(INDEX)
    city_dict = process_city(index_html)
    # 记录到文件中
    f = open('全国各城市房价小区涨跌top10_by_pyquery.txt',"w", encoding="utf-8")
    # 批量获取各城市房价涨跌幅top10
    for city_name, city_url in city_dict.items():
        # 城市首页处理
        city_html = process_index(city_url)
        # 房价涨跌top10
        plot_intend = process_trend(city_html)
        if bool(plot_intend):
            for k,value in plot_intend.items():
                f.write(f"城市{city_name}----小区名--{k}---房价基本信息{value}\n")
                print(f"城市{city_name}----小区名{k}下载完毕....")
        else:
            f.write(f"城市{city_name}无涨幅小区top10\n")
        f.write(f"-------------------城市{city_name}分隔线--------------------------\n")
    f.close()

四、运行效果

请添加图片描述

### 使用Python实现快手视频批量爬取 利用Python进行快手视频的批量爬取涉及多个方面,包括但不限于发送HTTP请求获取网页数据、解析HTML文档提取所需链接以及下载文件等操作。考虑到目标网站可能存在的反爬机制,建议采用合理的策略来规避检测。 对于此类任务,`requests`库用于发起网络请求非常合适[^1]。为了模拟浏览器行为并处理JavaScript渲染的内容,Selenium也是一个不错的选择。不过,在本案例中假设不需要执行复杂的页面交互,则更推荐轻量级方案——仅依靠`requests`加上正则表达式或其他解析器如BeautifulSoup即可完成大部分工作。 下面是一个简单的例子展示如何通过Python脚本来抓取指定用户的公开发布作品列表: ```python import requests from bs4 import BeautifulSoup as soup def get_video_urls(user_id): base_url = f"https://www.kuaishou.com/profile/{user_id}/video" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', } response = requests.get(base_url, headers=headers) page_content = response.text parsed_html = soup(page_content,"html.parser") video_elements = parsed_html.find_all('a', class_='thumbnail') # 假设类名为'thumbnail' urls = [] for element in video_elements: href_value = element['href'] full_link = "https:" + href_value if not href_value.startswith("http") else href_value urls.append(full_link) return urls ``` 需要注意的是,上述代码仅为示意目的编写,并未针对实际API接口做优化调整。真实环境中应当仔细研究官方提供的开发者指南或者逆向工程APP内部通信协议以获得更加稳定可靠的数据源。此外,频繁访问服务器可能会触发安全防护措施,因此务必遵循robots.txt规则并适当设置延时间隔以免给对方造成负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值