python爬虫入门训练-2

简介

这次的爬虫训练是对豆瓣top250信息的爬取,比较简单的静态页面的爬取,本人也是初学者,为了防止学习的困难,我尽量写的详细点,建议先把代码复制一遍,看能不能成功运行,再过来看,免得到时候全部看完了,代码不能运行,到时候自己解决也是蛮麻烦的,毕竟爬虫更新换代也是蛮快的

目标需求

对豆瓣top250所有信息进行爬取,包括影名、格言、评分,先存为.csv文件,最后转为excel表格存储

运用知识

requests库,lxml解析库,csv文件保存

分析

1.进入到豆瓣top250主界面,进行如下操作,基本得到了我们需要信息的源码
在这里插入图片描述
2.分析每一页的url,找出相应规律
第一页:
在这里插入图片描述
第二页:
在这里插入图片描述

我们发现start=0和start=25有所不同,其余都是一样的,我们陆续查看后面几页url,发现start的值以25递增,由此我们可以推出各页的url

源码部分

有部分注释

import requests
import csv
from lxml import etree

# 得到第i页的源代码
def get_resource(page): # 传入参数为页数
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    } # 设置请求头
    page_head=page*25
    page_url = 'https://movie.douban.com/top250?start=%d&filter=' % page_head # 得到每页的url
    try:
        response = requests.get(page_url, headers=headers)  # 加个请求头,伪装一下,否则会被识别出来,具体错误可看返回的状态码
        response.raise_for_status() # 若返回状态码不是200,则抛出异常
        response.encoding =response.apparent_encoding # 设置编码格式和网站编码格式相同,防止后面乱码
    except Exception as e:
        print('爬取失败')
    else:
        return response.text # 爬取成功,则返回该页源码信息

#信息处理,并写入csv文件
def handle_info(i,selector):
        selector = etree.HTML(selector) # 构造一个xpath解析对象
        number = selector.xpath('//em/text()')
        name = selector.xpath('//span[@class="title"][1]/text()')
        motto = selector.xpath('//span[@class="inq"]/text()')
        score = selector.xpath('//span[@class="rating_num"]/text()')

        # 多次调试后,发现第240,242,247,250个没有格言,我们把其设置为空,否则后面会乱
        # 第九页,它们的motto下标分别为 14,16,21,24
        if i==9:
            motto.insert(14, " ");
            motto.insert(16, " ");
            motto.insert(21, " ");
            motto.insert(24, " ");

        for m in range(25):
            all_info = [number[m], name[m], motto[m], score[m]] # 形成列表,后面插入
            with open('douban_top250.csv', 'a+', newline='', encoding='utf-8') as csvfile:
                writer = csv.writer(csvfile)
                writer.writerow(all_info) # 按行写入

if __name__=='__main__':
    # 写入第一行,确定每列名称
    with open('data.csv', 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['number', 'name', 'motto', 'score'])

    # 一共10页
    for i in range(0,10):
        selector=get_resource(i)
        handle_info(i,selector)

代码部分额外解释

  • name = selector.xpath(’//span[@class=“title”][1]/text()’):
    在这里插入图片描述
    在span标签,且其class属性值为title,有两个满足该条件的,我们取第一个,text()表示取其文本值
  • motto = selector.xpath(’//span[@class=“inq”]/text()’):
    在这里插入图片描述
    在span标签,且其class属性值为inq,text()表示取其文本值
  • with open(‘douban_top250.csv’, ‘a+’, newline=’’, encoding=‘utf-8’) as csvfile:该句中newline=’’,防止每写入一行,就插入一个空行,encoding='utf-8’保证编码格式的统一

实现效果

解决excel打开csv文件乱码,并保存为excel文件
pycharm中打开csv文件:
在这里插入图片描述
excel文件:
在这里插入图片描述

结语

本程序中对lxml未得到的格言,手动查找,以空格赋值,不是很恰当,我也是想不出什么好办法,才这么写的,有其他解决办法,望告知!

原创文章 6 获赞 7 访问量 545

猜你喜欢

转载自blog.csdn.net/jiuzhongxian_/article/details/106158925
今日推荐