美文网首页
第一种办法爬取豆瓣——普通版

第一种办法爬取豆瓣——普通版

作者: 逢笔生辉 | 来源:发表于2023-03-08 15:31 被阅读0次

    from parsel import Selector

    # 正则表达式

    import re

    # Excel表格操作

    import csv

    # 获取URL得到html文件

    import requests

    # 设置单独全局变量,如需更加规范,也可以将电影信息封装成一个class类 比如 class Movie: ...

    # 电影名称

    find_name = re.compile(r'<span class="title">(.*?)</span>')

    # 电影播放地址链接

    find_link = re.compile(r'<a href="(.*?)">')

    # 电影封面的地址链接,re.S让换行符包含在字符中

    find_imgSrc = re.compile(r'<img.*src="(.*?)"', re.S)

    # 电影评分

    find_score = re.compile(r'<span class="rating_num".*>(.*?)</span>')

    # 评分人数

    find_num = re.compile(r'<span>(\d*人)评价</span>')

    # 名句

    find_inq = re.compile(r'<span class="inq">(.*?)</span>')

    def get_data(base_url,i):

        # 获得多有页面有价值的信息,然后集中存放与data_list列表中

        data_list = []

        # 循环遍历,修改?start=起始排行序号,获取不同分页的豆瓣top信息,url分页格式去豆瓣换页内容试试

        # 例如第一页第 top 0-24,第二页是top 25-49条 ?start=25 这个参数,会让服务器响应第二页的25条信息

        url = base_url + str(i)

        # 获取html保存在本地,方便之后爬虫操作,因为频繁爬取可能被豆瓣发现异常

        html = ask_url(url)

        bs=Selector(text=html)

        f_list = bs.css('div.item').getall()

        for f in f_list:

            data = []

            # 将正则表达式提取的内容赋值给自定义变量

            file_name = set_film(find_name, str(f))

            file_num = set_film(find_num, str(f))

            file_link = set_film(find_link, str(f))

            file_img_src = set_film(find_imgSrc, str(f))

            file_score = set_film(find_score, str(f))

            file_inq = set_film(find_inq, str(f))

            # 将所有需要的数据保存到data列表

            data.append(file_name)

            data.append(file_score)

            data.append(file_num)

            data.append(file_link)

            data.append(file_img_src)

            data.append(file_inq)

            data_list.append(data)

        return data_list

    def set_film(file, content):

        # 检查查找内容的长度,如果不为0,说明查找到内容,则将内容转换成字符串类型

        if len(re.findall(file, content)) != 0:

            film = str(re.findall(file, content)[0])

        else:

            film = ""

        return film

    def ask_url(url):

        # 设置传给服务器的header头部信息,伪装自己是正规浏览器访问

        headers = {

            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0"

        }

        # 用于保存获取的html文件

        html = ""

        # 最好用 try-except 捕捉异常

        try:

            # 封装一个Request对象,将自定义的头部信息加入进去

            res =requests.get(url, headers=headers)

            html=res.text

            # 向指定的url获取响应信息,设置超时,防止长时间耗在一个页面

        # 如果出错,就捕捉报错信息并打印出,这里使用Exception 泛泛的意思一下

        except Exception as error:

            # 出现异常时候,打印报错信息

            print("Ask_url is Error : " ,error)

        # 将获得的html页面信息返回

        return html

    def save_data_txt(datas, save_file):

        # 打开文本选择写模式,并指定编码格式

        file = open(save_file, 'a+', encoding='utf-8')

        # 不能直接写入list,所以通过遍历一条条写入

        for data in datas:

            for dat in data:

                file.write(dat[0]+'\n'+dat[1]+'\n'+dat[2]+'\n'+dat[3]+'\n'+dat[4]+'\n'+dat[5]+'\n')

            file.write(split(10) + '\n')

    def split(num):

        str1 = ""

        for i in range(1, num):

            # print("------------", end='')

            str1 += "------------"

        return str1

    def csv_store(z):

    # 引用csv模块。

        csv_file = open(r"C:\Users\29258\Desktop\data\movie.csv", 'w', newline='', encoding='gbk')

        # 调用open()函数打开csv文件,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='gbk'

        writer = csv.writer(csv_file)

        # 用csv.writer()函数创建一个writer对象。

        writer.writerow(['file_name',

                'file_num',

                'file_link',

                'file_img_src',

                'file_score',

                'file_inq'])

        for data in z:

            print(data)

            writer.writerows(data)

        # 调用writer对象的writerow()方法,可以在csv文件里写入一行文字 “电影”和“豆瓣评分”。

        # 在csv文件里写入一行文字 “喜羊羊与灰太狼”和“9.9”

        # 在csv文件里写入一行文字 “熊出没之夺宝熊兵”和“10.0”

        csv_file.close()

    # 关闭文件

    def qishi():

        base_url = "https://movie.douban.com/top250?start="

        for i in range(0, 75, 25):

            c=get_data(base_url,i)

            yield c

    def main():

        m=qishi()

    ![屏幕截图 2023-03-09 152920.png](https://img.haomeiwen.com/i27567275/0bdc992f8eeacc1e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

        save_txt_path =r"C:\Users\29258\Desktop\data\top250.txt"

        # save_data_txt(m,save_txt_path)

        csv_store(m)

        #

        # z=get_data(base_url)

        #

        # save_data_txt(z, save_txt_path)

    if __name__=='__main__':

        main()![屏幕截图

    结果显示

    相关文章

      网友评论

          本文标题:第一种办法爬取豆瓣——普通版

          本文链接:https://www.haomeiwen.com/subject/vfdoldtx.html