翼度科技»论坛 编程开发 python 查看内容

Python多线程爬取链家房源,保存表格,实现数据可视化分析!

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
使用Python来爬取二手房源数据,并保存表格,实现数据分析!
软件环境

Python 3.8
Pycharm
代码展示

模块
  1. # 数据请求模块 --> 第三方模块, 需要安装 pip install requests
  2. import requests
  3. # 解析数据模块 --> 第三方模块, 需要安装 pip install parsel
  4. import parsel
  5. # csv模块
  6. import csv
复制代码
 
创建文件
  1. f = open('data.csv', mode='w', encoding='utf-8', newline='')
  2. csv_writer = csv.DictWriter(f, fieldnames=[
  3.     '标题',
  4.     '小区',
  5.     '区域',
  6.     '售价',
  7.     '单价',
  8.     '户型',
  9.     '面积',
  10.     '朝向',
  11.     '装修',
  12.     '楼层',
  13.     '年份',
  14.     '建筑类型',
  15.     '详情页',
  16. ])
  17. csv_writer.writeheader()
复制代码
 
发送请求, 模拟浏览器 对于 url地址 发送请求
模拟浏览器
  1. headers = {
  2.     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
  3. }
复制代码
 
请求网址/网站
  1. url = 'https://cs.lianjia.com/ershoufang/'
  2. # 完整源码,视频讲解直接+这个扣裙:279199867 免费领取
复制代码
 
发送请求
  1. response = requests.get(url=url, headers=headers)
  2. # <Response [200]> 响应对象 200 状态码 表示请求成功
  3. print(response)
复制代码
 
获取数据, 获取网页源代码
解析数据, 提取我们想要的数据内容
解析方法:

  • re: 对于字符串数据直接进行解析提取
  • css: 根据标签属性提取数据内容
  • xpath: 根据标签节点提取数据内容
使用css: 根据标签属性提取数据内容
把获取到html字符串数据, 转成可解析对象
  1. selector = parsel.Selector(response.text)
复制代码
 
获取所有房源信息所在li标签
  1. lis = selector.css('.sellListContent li.clear')
复制代码
 
for循环遍历
  1. for li in lis:
  2.     """<br>
  3.     提取具体房源信息: 标题 / 价格 / 位置 / 户型...
  4.     .title a --> 表示定位class类名为title下面a标签
  5.     """
  6.     title = li.css('.title a::text').get()  # 标题
  7.     info_list = li.css('.positionInfo a::text').getall()
  8.     area = info_list[0]  # 小区名字
  9.     area_1 = info_list[1]  # 地区
  10.     totalPrice = li.css('.totalPrice span::text').get()  # 售价
  11.     unitPrice = li.css('.unitPrice span::text').get().replace('元/平', '').replace(',', '')  # 单价
  12.     houseInfo = li.css('.houseInfo::text').get().split(' | ')  # 信息
  13.     houseType = houseInfo[0]  # 户型
  14.     houseArea = houseInfo[1].replace('平米', '')  # 面积
  15.     houseFace = houseInfo[2]  # 朝向
  16.     fitment = houseInfo[3]  # 装修
  17.     fool = houseInfo[4]  # 楼层
  18.     if len(houseInfo) == 7 and '年' in houseInfo[5]:
  19.         year = houseInfo[5].replace('年建', '')
  20.     else:
  21.         year = ''
  22.     house = houseInfo[-1]  # 建筑类型
  23.     href = li.css('.title a::attr(href)').get()  # 详情页
  24.     dit = {
  25.         '标题': title,
  26.         '小区': area,
  27.         '区域': area_1,
  28.         '售价': totalPrice,
  29.         '单价': unitPrice,
  30.         '户型': houseType,
  31.         '面积': houseArea,
  32.         '朝向': houseFace,
  33.         '装修': fitment,
  34.         '楼层': fool,
  35.         '年份': year,
  36.         '建筑类型': house,
  37.         '详情页': href,
  38.     }
  39.     csv_writer.writerow(dit)
  40.     print(dit)
  41.     # print(title, area, area_1, totalPrice, unitPrice, houseType, houseArea, houseFace, fitment, fool, year, house, href)
复制代码
 
多线程

导入模块
  1. import requests
  2. import parsel
  3. import re
  4. import csv
  5. # 线程池模块
  6. import concurrent.futures
  7. import time
复制代码
 
发送请求函数
  1. def get_response(html_url):
  2. :param html_url:
  3. :return:
  4. """
  5. headers = {
  6.     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
  7. }
  8. response = requests.get(url=html_url, headers=headers)
  9. return response
复制代码
 
获取数据函数
  1. def get_content(html_url):
  2.     """
  3.     :param html_url:
  4.     :return:
  5.     """
  6.     response = get_response(html_url)
  7.     html_data = get_response(link).text
  8.     selector = parsel.Selector(response.text)
  9.     select = parsel.Selector(html_data)
  10.     lis = selector.css('.sellListContent li')
  11.     content_list = []
  12.     for li in lis:
  13.         title = li.css('.title a::text').get()  # 标题
  14.         area = '-'.join(li.css('.positionInfo a::text').getall())  # 小区
  15.         Price = li.css('.totalPrice span::text').get()  # 总价
  16.         Price_1 = li.css('.unitPrice span::text').get().replace('元/平', '')  # 单价
  17.         houseInfo = li.css('.houseInfo::text').get()  # 信息
  18.         HouseType = houseInfo.split(' | ')[0]  # 户型
  19.         HouseArea = houseInfo.split(' | ')[1].replace('平米', '')  # 面积
  20.         direction = houseInfo.split(' | ')[2].replace(' ', '')  # 朝向
  21.         renovation = houseInfo.split(' | ')[3]  # 装修
  22.         floor_info = houseInfo.split(' | ')[4]
  23.         floor = floor_info[:3]  # 楼层
  24.         floor_num = re.findall('(\d+)层', floor_info)[0]  # 层数
  25.         BuildingType = houseInfo.split(' | ')[-1]
  26.         string = select.css('.comments div:nth-child(7) .comment_text::text').get()
  27.         href = li.css('.title a::attr(href)').get()  # 详情页
  28.         if len(houseInfo.split(' | ')) == 6:
  29.             date = 'None'
  30.         else:
  31.             date = houseInfo.split(' | ')[5].replace('年建', '')  # 日期
  32.         print(string)
  33.         dit = {
  34.             '标题': title,
  35.             '内容': string,
  36.             '小区': area,
  37.             '总价': Price,
  38.             '单价': Price_1,
  39.             '户型': HouseType,
  40.             '面积': HouseArea,
  41.             '朝向': direction,
  42.             '装修': renovation,
  43.             '楼层': floor,
  44.             '层数': floor_num,
  45.             '建筑日期': date,
  46.             '建筑类型': BuildingType,
  47.             '详情页': href,
  48.         }
  49.         content_list.append(dit)
  50.     return content_list
复制代码
 
主函数
  1. def main(page):
  2.     """
  3.     :param page:
  4.     :return:
  5.     """
  6.     print(f'===============正在采集第{page}页的数据内容===============')
  7.     url = f'https:///ershoufang/yuelu/p{page}/'
  8.     content_list = get_content(html_url=url)
  9.     for content in content_list:
  10.         csv_writer.writerow(content)
  11. if __name__ == '__main__':
  12.     time_1 = time.time()
  13.     link = 'http://******/article/149'
  14.     # 创建文件
  15.     f = open('data多线程.csv', mode='a', encoding='utf-8', newline='')
  16.     csv_writer = csv.DictWriter(f, fieldnames=[
  17.         '标题',
  18.         '内容',
  19.         '小区',
  20.         '总价',
  21.         '单价',
  22.         '户型',
  23.         '面积',
  24.         '朝向',
  25.         '装修',
  26.         '楼层',
  27.         '层数',
  28.         '建筑日期',
  29.         '建筑类型',
  30.         '详情页',
  31.     ])
  32.     csv_writer.writeheader()
  33.     # 线程池执行器 max_workers 最大线程数
  34.     exe = concurrent.futures.ThreadPoolExecutor(max_workers=10)
  35.     for page in range(1, 11):
  36.         exe.submit(main, page)
  37.     exe.shutdown()
  38.     time_2 = time.time()
  39.     use_time = int(time_2 - time_1)
  40.     # 总计耗时: 9
  41.     print('总计耗时:', use_time)
复制代码
 

来源:https://www.cnblogs.com/hahaa/p/17406006.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具