项目实战四:豆瓣首页-热点区域

接下来要制作的就是热点区域了,首先是间隔性的背景颜色的改变,这里考虑用nth-child(even)

.section:nth-child(even){
    background-color: #f7f7f7;
}

nth-child(even) 常见问题:前面的元素干扰顺序问题

这里要注意一个问题,在数section是第几个子元素时,它会先找section的元素,从同等级的div子元素开始数,不是从有section类名的div中数,要解决这个问题,可以将有section的div全都包裹在另一个div盒子里,这样有section的子元素的类名全是section,就不会因为前面的div而影响顺序。

制作两栏或三栏布局

在这里我们可以为左边栏右边栏设置统一的类名,为其设置统一的样式,用到时只需添加类名即可

<div class="aside-left">
                    左边栏
                </div>
                <div class="aside-right">
                    右边栏
                </div>
                <div class="main">
                    主区域
                </div>

注意设置主区域时要为主区域设置BFC,使其达到避开浮动盒子自动适应的效果 

.aside-left{
    float: left;
    width: 100px;
    margin-right: 20px;
}
.aside-right{
    float: right;
    width: 265px;
    margin-left: 30px;
}
.main{
    /* 创建BFC,自适应,避开浮动盒子 */
    overflow: hidden;
}

 接下来就是右边栏的设置了,右边栏包括广告图片(adv),部分标题(section-title)以及列表内容(hot-list),adv里又包含a元素,a元素里又嵌套一个img元素,可以统一设置广告图片的样式为宽度撑满,display为块盒(去掉白边),section-title中有可以包括一个h3元素和a元素,a元素前后又有一个括号,上括号和下括号均可使用伪元素选择器(before和after)

因为鼠标移入a元素时,括号背景颜色不变,因此不能在a元素上设置伪元素,此时可以在a元素外面再添加一个span设置span伪元素即可

<span class="link">
                             <!-- ( -->
                        <a href="">
                            去话题广场
                        </a>
                        <!-- ) -->
                        </span>

热门话题后的省略号同理也可使用伪元素选择器

.section-title .title::after{
    content: " · · · · · · ";
}

有时候热点后会加上一个标签,例如广告同理这里也可使用伪元素选择器

.adv-tag::after{
    content: "广告";
    font-size: 13px;
    color: #c9c9c9;
}

host-list中也可分为两个部分,一个为标题,一个为描述(desc),描述中又有两个span元素,两个span元素之间隔有一些距离,可以设置span元素的margin-right,也可设置除第一个span元素之外其他span的margin-left

设置子元素出第一个之外的其他元素

除第一个之外的其他span元素,n从0开始 
.hot-list li .desc span:nth-child(n+2){

}

接着设置各个部分文字颜色等细节即可

热门区域代码:

.hot-list{
    line-height: 1.5;
}
.hot-list li{
    margin-bottom: 15px;
}
.hot-list li .title{
    font-size: 14px;
}
.hot-list li .desc{
    font-size: 13px;
    color: #aaa;
}

首页通用样式代码:

.container {
    width: 950px;
    margin: 0 auto;
}
.section{
    padding: 35px 0;
}
/* 遇到双数的section时,设置以下样式 */
.section:nth-child(even){
    background-color: #f7f7f7;
}
.aside-left{
    float: left;
    width: 100px;
    margin-right: 20px;
}
.aside-right{
    float: right;
    width: 265px;
    margin-left: 30px;
}
.main{
    /* 创建BFC,自适应,避开浮动盒子 */
    overflow: hidden;
}
.adv img{
    width: 100%;
    /* 去掉白边 */
    display: block;
}
.section-title{
    margin: 12px 0;
}
.section-title .title{
    /* 水平排列,不独占一行 */
    display: inline;
    color: #072;
    font-size: 15px;
}
.section-title .title::after{
    content: " · · · · · · ";
}
.section-title .link{
    font-size: 12px;
}
.section-title .link::before{
    content: "(";
}
.section-title .link::after{
    content: ")";
}
.adv-tag::after{
    content: "广告";
    font-size: 13px;
    color: #c9c9c9;
}
/* 首页通用样式结束 */

还有要注意的一点,右边栏中已经定款宽,热点标题如果太长应有换行效果,

全英文换行效果

如果全英文(无空格),则最终效果不会换行,故要给ul设置word-break:break-all(可在单词内部截断)

接着设置主区域的内容,主区域里又有section-title和hot-main,hot-main里又有向左浮动的区域,以及向右浮动的区域,向左浮动的区域里有四个ul,每个ul里有两部分,一个为照片(img),另一个为文字(words),照片是li加a加img,words里有两部分,一个a,一个span元素,观察一下这四个ul的排列方式

目前制作出来的效果如下:

两个两个排列在一行,此时最好不要用浮动,要频繁的解决高度坍塌问题,在这里我们将li元素定宽且变成一个行块盒,即可达到效果

接下来要让每一行中的li适应宽度排列,这里我们可以用到text-align的一个属性justify,即为分散对齐,但最后一行不会实现分散对齐,要想让最后一行实现该效果,可在最后一个li后面加上一个li宽度撑满成为最后一行,因为其高度为0,所以不会影响样式,也可以不添加元素,直接用样式解决,给ul设置一个伪元素即可。

.hot-main ul::after {
    content: "";
    display: inline-block;
    width: 100%;
}

接下来就该float-right了,注意设置其宽度,防止宽度太宽导致浮动元素换行,接着设置细节部分即可

<div class="float-left">
                            <ul>
                                <li>
                                    <div class="img">
                                        <a href="">
                                            <img src="./imgs/热点1.webp" alt="">
                                        </a>
                                    </div>
                                    <div class="words">
                                        <a href="">
                                            我们仍未知道那天所看见的论文的意义
                                        </a>
                                        <span>76张照片</span>
                                    </div>
                                </li>
                                <li>
                                    <div class="img">
                                        <a href="">
                                            <img src="./imgs/热点1.webp" alt="">
                                        </a>
                                    </div>
                                    <div class="words">
                                        <a href="">
                                            我们仍未知道那天所看见的论文的意义
                                        </a>
                                        <span>76张照片</span>
                                    </div>
                                </li>
                                <li>
                                    <div class="img">
                                        <a href="">
                                            <img src="./imgs/热点1.webp" alt="">
                                        </a>
                                    </div>
                                    <div class="words">
                                        <a href="">
                                            我们仍未知道那天所看见的论文的意义
                                        </a>
                                        <span>76张照片</span>
                                    </div>
                                </li>
                                <li>
                                    <div class="img">
                                        <a href="">
                                            <img src="./imgs/热点1.webp" alt="">
                                        </a>
                                    </div>
                                    <div class="words">
                                        <a href="">
                                            我们仍未知道那天所看见的论文的意义
                                        </a>
                                        <span>76张照片</span>
                                    </div>
                                </li>
                                <!-- <li style="width: 100%;"></li> -->
                            </ul>
                        </div>
                        <div class="float-right">
                            <ul>
                                <li>
                                    <a href="">城市失忆症</a>
                                    <div class="title">
                                        菠萝的日记
                                    </div>
                                    <div class="desc">
                                        从小家教比较严格,高中之前几乎杜绝了一切电子产品,没有手机,也没有电脑,去同学家玩还要胆战心惊。好处是读书几乎成为了唯一的娱乐,买书从来不会被限制,坏处是,小镇...
                                    </div>
                                </li>
                                <li><a href="">Lorem ipsum dolor sit.</a></li>
                                <li><a href="">Error numquam minima praesentium.</a></li>
                                <li><a href="">Aperiam quidem atque eveniet.</a></li>
                                <li><a href="">Impedit nisi temporibus aut!</a></li>
                                <li><a href="">Ut iusto tempore recusandae.</a></li>
                                <li><a href="">Sequi reiciendis aut esse.</a></li>
                                <li><a href="">Ex voluptate enim reprehenderit!</a></li>
                                <li><a href="">Corrupti recusandae esse ab!</a></li>
                                <li><a href="">Voluptatem animi assumenda itaque!</a></li>
                                <li><a href="">Ipsum reiciendis similique blanditiis.</a></li>
                            </ul>
                        </div>
.hot-list {
    line-height: 1.5;
}

.hot-list li {
    margin-bottom: 15px;
}

.hot-list li .title {
    font-size: 14px;
}

.hot-list li .desc {
    font-size: 13px;
    color: #aaa;
}

/* 除第一个之外的其他span元素,n从0开始 */
/* .hot-list li .desc span:nth-child(n+2){

} */
.hot-list li .desc span {
    margin-right: 4px;
}

.hot-main .float-left {
    width: 350px;
}

.hot-main ul::after {
    content: "";
    display: inline-block;
    width: 100%;
}

.hot-main .float-left li {
    display: inline-block;
    width: 170px;
    font-size: 12px;
    margin: 10px 0;
    vertical-align: top;
}

.hot-main .float-left ul {
    /* 分散对齐 */
    text-align: justify;
    line-height: 1.5;
}
.hot-main .float-left li .img img{
    width: 100%;
    display: block;
}
.hot-main .float-left li .words span{
    color: #c9c9c9;
}
.hot-main .float-right{
    width: 275px;
    font-size: 12px;
}
.hot-main .float-right li{
    margin-bottom: 12px;
}
.hot-main .float-right  li .title{
color: #999;
}
.hot-main .float-right li .desc{
    color: #666;
}

 

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
豆瓣是一个非常流行的社交网站,它包含了电影、图书、音乐等各种文化娱乐信息。本文将介绍如何使用Scrapy爬虫框架,构建一个豆瓣电影爬虫,爬取豆瓣电影排行榜中的电影信息。 1. 创建Scrapy项目 首先,我们需要创建一个Scrapy项目。在命令行中执行以下命令: ``` scrapy startproject douban ``` 这将创建一个名为douban的Scrapy项目项目结构如下: ``` douban/ scrapy.cfg douban/ __init__.py items.py middlewares.py pipelines.py settings.py spiders/ __init__.py ``` 其中,scrapy.cfg是Scrapy的配置文件;douban文件夹是我们创建的项目名称,它包含了项目的配置、管道、中间件等设置;spiders文件夹是我们用来编写爬虫代码的地方。 2. 编写爬虫代码 在spiders文件夹中创建一个名为douban_spider.py的文件,编写如下代码: ```python import scrapy from douban.items import DoubanItem class DoubanSpider(scrapy.Spider): name = 'douban' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): item = DoubanItem() movies = response.css('.grid_view .item') for movie in movies: item['rank'] = movie.css('.pic em::text').get() item['title'] = movie.css('.title a::text').get() item['rating'] = movie.css('.rating_num::text').get() item['quote'] = movie.css('.inq::text').get() yield item next_page = response.css('.next a::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 上述代码中,我们定义了一个名为DoubanSpider的爬虫类,继承自Scrapy的Spider类。我们设置了爬虫的名称、待爬取的域名和起始URL。在parse函数中,我们使用CSS选择器提取电影信息,并使用yield关键字将结果返回。同时,我们还提取了下一页的URL,并使用response.follow方法跟进到下一页。 在douban文件夹中创建一个名为items.py的文件,定义数据项: ```python import scrapy class DoubanItem(scrapy.Item): rank = scrapy.Field() title = scrapy.Field() rating = scrapy.Field() quote = scrapy.Field() ``` 3. 配置管道 在douban文件夹中的settings.py文件中,我们需要配置管道,以便将爬取的数据保存到本地文件中。 ```python ITEM_PIPELINES = { 'douban.pipelines.DoubanPipeline': 300, } FEED_FORMAT = 'json' FEED_URI = 'result.json' ``` 上述配置将数据保存为JSON格式,保存路径为result.json文件。 在douban文件夹中创建一个名为pipelines.py的文件,定义管道实现: ```python import json class DoubanPipeline(object): def __init__(self): self.file = open('result.json', 'w', encoding='utf-8') def process_item(self, item, spider): line = json.dumps(dict(item), ensure_ascii=False) + '\n' self.file.write(line) return item def close_spider(self, spider): self.file.close() ``` 上述代码实现了数据的保存功能,将数据保存为JSON格式文件。 4. 运行爬虫 在命令行中,进入douban项目的根目录,执行以下命令即可启动爬虫: ``` scrapy crawl douban ``` 爬虫会自动从豆瓣电影排行榜网页中爬取电影信息,并将结果保存到本地文件中。可以通过修改settings.py文件中的FEED_URI配置来改变保存路径。 5. 结果展示 爬虫执行完毕后,我们可以打开result.json文件查看数据结果。例如,下面是rank为1的电影信息: ```json {"rank": "1", "title": "\u8096\u7533\u514b\u7684\u6551\u8d4e", "rating": "9.7", "quote": "\u4eba\u751f\u82e6\u77ed\uff0c\u4f60\u5fc5\u987b\u559c\u6b22\u5b83\uff0c\u8fd9\u5c31\u662f\u5b83\u7684\u7f8e\u4e3d\u3002"} ``` 我们可以看到,爬虫成功地爬取了电影排行榜中的电影信息,并将结果保存到本地文件中。 6. 总结 本文介绍了如何使用Scrapy爬虫框架,构建一个豆瓣电影爬虫,爬取豆瓣电影排行榜中的电影信息。我们首先创建了一个Scrapy项目,然后编写了爬虫代码,使用CSS选择器提取电影信息,并使用管道将结果保存到本地文件中。最后,我们运行了爬虫,并查看了结果。这个例子展示了Scrapy框架的基本使用方法,希望对初学者有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值