今天给大家分享一个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()