草庐IT

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

逢笔生辉 2023-10-07 原文

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://upload-images.jianshu.io/upload_images/27567275-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()![屏幕截图

结果显示

有关第一种办法爬取豆瓣——普通版的更多相关文章

  1. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  2. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  3. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  4. ruby - 如何跳过 CSV 文件的第一行并将第二行作为标题 - 2

    有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|

  5. ruby - 在 factory_girl 中有没有办法获取 attributes_for 并为同一个实例元素创建? - 2

    如果我想使用“create”构建策略创建和实例,然后想使用“attributes_for”构建策略进行验证,是否可以这样做?如果我在工厂中使用序列?在Machinistgem中有可能吗? 最佳答案 不太确定我是否完全理解。而且我不是机械师的用户。但听起来您只是想做这样的事情。@attributes=FactoryGirl.attributes_for(:my_object)my_object=MyObject.create(@attributes)my_object.some_property.should==@attributes

  6. arrays - 在一行中选择数组的第一个和最后一个元素 - 2

    我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,

  7. ruby-on-rails - Ruby 或 Rails 有只将第一个字符大写的方法吗? - 2

    或者好像我必须自己写方法?(保持DHA不变):ruby-1.9.2-p180:001>s='omega-3(DHA)'=>"omega-3(DHA)"ruby-1.9.2-p180:002>s.capitalize=>"Omega-3(dha)"ruby-1.9.2-p180:003>s.titleize=>"Omega3(Dha)"ruby-1.9.2-p180:005>s[0].upcase+s[1..-1]=>"Omega-3(DHA)" 最佳答案 如果我的回答只是垃圾,我深表歉意(我不做ruby)。但我相信我已经为您找到了答

  8. ruby - gsub 删除第一个逗号前的所有内容 - 2

    我有这个字符串:auteur="comtedeFlandreetHainaut,Baudouin,Jacques,Thierry"我想删除第一个逗号之前的所有内容,即在这种情况下保留“Baudouin,Jacques,Thierry”试过这个:nom=auteur.gsub(/.*,/,'')但这会删除最后一个逗号之前的每个逗号,只保留“Thierry”。 最佳答案 auteur.partition(",").last#=>"Baudouin,Jacques,Thierry" 关于rub

  9. ruby-on-rails - Order Hash 并删除第一个键值对 - 2

    我有一个以时间戳为键的哈希。hash={"2016-05-31T22:30:58+02:00"=>{"path"=>"/","method"=>"GET"},"2016-05-31T22:31:23+02:00"=>{"path"=>"/tour","method"=>"GET"},"2016-05-31T22:31:05+02:00"=>{"path"=>"/contact_us","method"=>"GET"}}我订购了这个系列并得到了第一双这样的:hash.sort_by{|k,_|k}.first.first但是我该如何删除它呢?删除方法requiresyou知道key的准确

  10. arrays - 字符串数组中字符串第一部分的总和 - 2

    我有一个字符串数组,我需要从中提取第一个单词,将它们转换为整数并获得它们的总和。示例:["5Apple","5Orange","15Grapes"]预期输出=>25我的尝试:["5","5","15"].map(&:to_i).sum 最佳答案 我从你的问题中找到了答案。["5Apple","5Orange","15Grapes"].map(&:to_i).sum在数组中,如果存在任何整数可转换值,那么它将自动转换为整数。 关于arrays-字符串数组中字符串第一部分的总和,我们在Sta

随机推荐