python+xpath+csv爬虫

今天给大家分享一个python爬虫的小项目,具体的代码已经放在下面了,注释也写的比较多,希望大家可以从中学到一些新知识。

'''
需求:
58同城-租房类目,前五页
一级页面
    房屋信息及其详情页链接
二级页面
    租金 租赁方式 房屋类型 朝向楼层 所在小区 所属区域 详细地址
    并将数据持久化到58tongcheng.csv
'''

'''
地址:
第一页:https://jh.58.com/chuzu/?PGTID=0d3090a7-0021-316e-5f54-f61c85a3febd&ClickID=2
第二页:https://jh.58.com/chuzu/pn2/?PGTID=0d3090a7-0021-3b54-1ddc-59da60977cae&ClickID=2
第三页:https://jh.58.com/chuzu/pn3/?PGTID=0d3090a7-0021-38cc-310c-c280fe87ee07&ClickID=2
...
https://jh.58.com/chuzu/pn{}
'''

import requests
import csv
from lxml import etree
import time
import random

class tongchengSpider():
    def __init__(self):
        '''初始化方法,给成员属性赋值'''
        # 请求地址
        self.url = "https://jh.58.com/chuzu/pn{}"
        # 重新配置信息头
        # 该部分属于伪装部分,所以User-Agent需要百度一个
        self.total_url='https://movie.douban.com/j/chart/top_list_count?type=25&interval_id=100%3A90'
        self.headers={
            'User-Agent':'''这里大家自行百度一个,然后复制粘贴在这里即可''',        
        }
        self.f = open('58tongcheng.csv', 'w', newline='', encoding='UTF-8-sig')  # 打开文件
        self.writer = csv.writer(self.f)  # 创建csv对象

    def get_html(self,url):
        '''爬虫,获取页面的方法'''
        html = requests.get(url=url,headers=self.headers).text
        return html

    def parse_one_html(self,html1):
        '''解析,将数据从页面上解析下来'''
        # 解析一级页面
        eobj = etree.HTML(html1)
        #xpath()方法的返回值是一个列表
        house_list=eobj.xpath('//ul[@class="house-list"]/li[not(@id="pager_wrap")]')
        # 遍历一级页面获取到的所有信息
        for house in house_list:
            item={}
            #房屋信息
            title_list = house.xpath('.//a[@class="strongbox"]/text()')
            item['房屋信息'] = title_list[0].strip() if title_list else None
            #详情页链接
            href_list = house.xpath('.//div[@class="des"]/h2/a/@href')
            item['详情页链接'] = href_list[0].strip() if href_list else None

            # print(item)
            # 直接调用解析二级页面的函数
            self.parse_two_html(item)


    def parse_two_html(self,item):
        #解析二级页面
        two_url = item['详情页链接']  # 二级页面的地址
        two_html = self.get_html(two_url)  # 二级页面的html
        eobj_2 = etree.HTML(two_html)
        house_2_list = eobj_2.xpath('//div[@class="house-desc-item fl c_333"]')
        # 遍历二级页面获取到的所有信息
        for house_2 in house_2_list:
            item_2={}
            # 把item放到item_2,然后一起输出
            item_2['房屋信息'] = item['房屋信息']
            item_2['详情页链接'] = item['详情页链接']
            #租金 租赁方式 房屋类型 朝向楼层 所在小区 所属区域 详细地址
            # 租金
            ZJ_list = house_2.xpath('.//span[@class="c_ff552e"]/b/text()')
            item_2['租金'] = ZJ_list[0].strip()

            # 租赁方式
            ZLFS_list = house_2.xpath('.//ul[@class="f14"]/li[1]/span[2]/text()')
            item_2['租赁方式'] = ZLFS_list[0].strip()

            # 房屋类型
            FWLX_list = house_2.xpath('.//ul[@class="f14"]/li[2]/span[2]/text()')
            item_2['房屋类型'] = FWLX_list[0].strip()

            # 朝向楼层
            CXLC_list = house_2.xpath('.//ul[@class="f14"]/li[3]/span[2]/text()')
            item_2['朝向楼层'] = CXLC_list[0].strip()

            # 所在小区
            SZXQ_list = house_2.xpath('.//ul[@class="f14"]/li[4]/span[2]/a/text()')
            item_2['所在小区'] = SZXQ_list[0].strip()

            # 所属区域
            SSQY_list = house_2.xpath('.//ul[@class="f14"]/li[5]/span[2]/a/text()')
            item_2['所属区域'] = SSQY_list[0].strip()

            # 详细地址
            XXDZ_list = house_2.xpath('.//ul[@class="f14"]/li[6]/span[2]/text()')
            item_2['详细地址'] = XXDZ_list[0].strip()

            print(item_2)  # 打印二级页面信息
            item_2=list(item_2.values())
            self.writer.writerow(item_2)

    def run(self):
        for page in range(1,6):#爬取五页
            page_url = self.url.format(page)#拼接地址
            html = self.get_html(page_url)#获取一级页面
            self.parse_one_html(html)#解析一级页面
            time.sleep(random.uniform(1,3))#控制频率

if __name__=='__main__':
    spider = tongchengSpider()
    spider.run()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值