Python爬虫2------(爬取房源信息实现多页面获取)

1.爬取任务

        获取南昌南昌二手房房源_南昌南昌二手房出售|买卖|交易信息(南昌链家) (lianjia.com)中的房源信息以及图片路径,且实现多个页面的爬取并进行下载至相对应的文件夹,实现多线程以及进度条加快和显示爬虫进度,将获取"房源标题", "房源位置", "房源描述", "房源关注", "房源链接", "房源价格", '房源单价'存入csv文件中,使得数据可视化度高,易于进行数据分析或其他操作。

2.使用技术

        爬取图片过程中使用的是BeautifulSoup进行解析html文本获取所需要的,使用了ThreadPoolExecutor进行多线程加速,使用tqdm实现下载进度显示,使用csv进行写入csv文件操作。

3.需要安装第三方库

import csv
import os
import requests
from bs4 import BeautifulSoup
import time
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor

4.源码

import csv
import os
import requests
from bs4 import BeautifulSoup
import time
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor


# 将房源信息写入csv中
def writeIntoCsv(list, csv_writer):
    for i in tqdm(list):
        title = i.div.a.text
        position = i.find_parent().find('div', class_='positionInfo').text
        desc = i.find_parent().find('div', class_='houseInfo').text
        concern = i.find_parent().find('div', class_='followInfo').text
        houseHref = i.div.a.attrs['href']
        housePrice = i.find_parent().find('div', class_='totalPrice totalPrice2').text
        unitPrice = i.find_parent().find('div', class_='unitPrice').text
        csv_writer.writerow([title, position, desc, concern, houseHref, housePrice, unitPrice])


# 进行主操作
def main(url, headers):
    startTime = time.time()
    response = requests.get(url=url, headers=headers)
    if response.status_code == 200:
        response1 = response.text
        soup = BeautifulSoup(response, 'lxml')
        list = soup.find_all('div', class_='info clear')
        houseDirectory = "csvfiles\\house"
        if not os.path.exists(houseDirectory):
            os.makedirs(houseDirectory)
        houseFilePath = houseDirectory + '\\链家南昌' + '房源信息' + '.csv'
        with open(houseFilePath, 'a', encoding='utf-8', newline="") as f:
            # 2. 基于文件对象构建 csv写入对象
            csv_writer = csv.writer(f)
            # 3. 构建列表头
            csv_writer.writerow(["房源标题", "房源位置", "房源描述", "房源关注", "房源链接", "房源价格", '房源单价'])
            # writeIntoCsv(list, csv_writer)
            endTime = time.time()
            print(f"第{i}页房源信息获取成功,耗时{endTime - startTime}s")


if __name__ == '__main__':
    mainStartTime = time.time()
    url = "https://peapix.com/bing/cn"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58'}
    with ThreadPoolExecutor(12) as pool:
        for i in tqdm(range(1, 11), desc="页面下载"):
            url = 'https://nc.lianjia.com/ershoufang/pg'
            url = url + str(i) + 'rs南昌/'
            pool.submit(main(url, headers))
    mainEndTime = time.time()
    print(f"所有房源下载成功,共耗时{mainEndTime - mainStartTime}s")

#  耗时情况使用多线程爬取50页共耗时44.71712136268616s  40.10211801528931s 40.3564076423645s
#  耗时情况不使用多线程爬取50页共耗时45.724690437316895s

5.实验总结

        使用BeautifulSoup更加清晰简单的进行定位,获取我们所需要的信息,并将信息写入文件,当然,由于获取的信息都在一个页面,以至于无需进行多次请求,一个页面仅需请求一次,并且采取了线程池来加快图片下载速率,总的来说,还是不错的,值得学习,欢迎小伙伴交流以及探讨,记得点个关注和赞哦!!!

猜你喜欢

转载自blog.csdn.net/m0_64238843/article/details/131491902