合众百科 > 影视 > bs4解析豆瓣电影top250

bs4解析豆瓣电影top250

2024-10-24 12:23:56影视

今天合众百科就给我们广大朋友来聊聊豆瓣电影top250,以下关于观点希望能帮助到您找到想要的答案。

如何用python爬取豆瓣读书的数据

如何用python爬取豆瓣读书的数据

这两天爬了豆瓣读书的十万条左右的书目信息,用时将近一天,现在趁着这个空闲把代码总结一下,还是菜鸟,都是用的最简单最笨的方法,还请路过的不吝赐教。

第一步,先看一下我们需要的库:

import requests                       #用来请求网页

from bs4 import BeautifulSoup         #解析网页

import time          #设置延时时间,防止爬取过于频繁被封IP号

import re            #正则表达式库

import pymysql       #由于爬取的数据太多,我们要把他存入MySQL数据库中,这个库用于连接数据库

import random        #这个库里用到了产生随机数的randint函数,和上面的time搭配,使爬取间隔时间随机

这个是豆瓣的网址:x-sorttags-all

我们要从这里获取所有分类的标签链接,进一步去爬取里面的信息,代码先贴上来:

import requests

from bs4 import BeautifulSoup       #导入库

url="httom/tag/icn=index-nav"

wb_data=requests.get(url)                #请求网址

soup=BeautifulSoup(wb_data.text,"lxml")  #解析网页信息

tags=soup.select("#content > div > div.article > div > div > table > tbody > tr > td > a")

#根据CSS路径查找标签信息,CSS路径获取方法,右键-检查-copy selector,tags返回的是一个列表

for tag in tags:

tag=tag.get_text()    #将列表中的每一个标签信息提取出来

helf="hom/tag/"

#观察一下豆瓣的网址,基本都是这部分加上标签信息,所以我们要组装网址,用于爬取标签详情页

url=helf+str(tag)

print(url)    #网址组装完毕,输出

我们便爬取了所有标签下的网址,我们将这个文件命名为channel,并在channel中创建一个channel字符串,放上我们所有爬取的网址信息,等下爬取详情页的时候直接从这里提取链接就好了,如下:

channel='''

tag/程序

'''

现在,我们开始第二个程序。

QQ图片20160915233329.png

标签页下每一个图片的信息基本都是这样的,我们可以直接从这里提取到标题,作者,出版社,出版时间,价格,评价人数,以及评分等信息(有些外国作品还会有译者信息),提取方法与提取标签类似,也是根据CSS路径提取。

我们先用一个网址来实验爬取:

url="htt/tag/科技"

wb_data = requests.get(url)

soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")

tag=url.split("")[0].split("/")[-1]    #从链接里面提取标签信息,方便存储

detils=soup.select("#subject_list > ul > li > div.info > div.pub")  #抓取作者,出版社信息,稍后我们用spite()函数再将他们分离出来

scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums")   #抓取评分信息

persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl")    #评价人数

titles=soup.select("#subject_list > ul > li > div.info > h2 > a")   #书名

#抓取的都是我们需要的html语言标签信息,我们还需要将他们一一分离出来

for detil,scor,person,title in zip(detils,scors,persons,titles):

#用一个zip()函数实现一次遍历

#因为一些标签中有译者信息,一些标签中没有,为避免错误,所以我们要用一个try来把他们分开执行

try:

author=detil.get_text().split("/",4)[0].split()[0]     #这是含有译者信息的提取办法,根据“/”  把标签分为五部分,然后依次提取出来

yizhe= detil.get_text().split("/", 4)[1]

publish=detil.get_text().split("/", 4)[2]

time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]   #时间我们只提取了出版年份

price=ceshi_priceone(detil)        #因为价格的单位不统一,我们用一个函数把他们换算为“元”

scoe=scor.get_text() if True else ""    #有些书目是没有评分的,为避免错误,我们把没有评分的信息设置为空

person=ceshi_person(person)      #有些书目的评价人数显示少于十人,爬取过程中会出现错误,用一个函数来处理

title=title.get_text().split()[0]  

#当没有译者信息时,会显示IndexError,我们分开处理

except IndexError:

try:

author=detil.get_text().split("/", 3)[0].split()[0]

yizhe=""         #将detil信息划分为4部分提取,译者信息直接设置为空,其他与上面一样

publish=detil.get_text().split("/", 3)[1]

time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]

price=ceshi_pricetwo(detil)

scoe=scor.get_text() if True else ""

person=ceshi_person(person)

title=title.get_text().split()[0]

except (IndexError,TypeError):

continue  

#出现其他错误信息,忽略,继续执行(有些书目信息下会没有出版社或者出版年份,但是数量很少,不影响我们大规模爬取,所以直接忽略)

except TypeError:

continue

#提取评价人数的函数,如果评价人数少于十人,按十人处理

def ceshi_person(person):

try:

person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])

except ValueError:

person = int(10)

return person

#分情况提取价格的函数,用正则表达式找到含有特殊字符的信息,并换算为“元”

def ceshi_priceone(price):

price = detil.get_text().split("/", 4)[4].split()

if re.match("USD", price[0]):

price = float(price[1]) * 6

elif re.match("CNY", price[0]):

price = price[1]

elif re.match("A$", price[0]):

price = float(price[1:len(price)]) * 6

else:

price = price[0]

return price

def ceshi_pricetwo(price):

price = detil.get_text().split("/", 3)[3].split()

if re.match("USD", price[0]):

price = float(price[1]) * 6

elif re.match("CNY", price[0]):

price = price[1]

elif re.match("A$", price[0]):

price = float(price[1:len(price)]) * 6

else:

price = price[0]

return price

实验成功后,我们就可以爬取数据并导入到数据库中了,以下为全部源码,特殊情况会用注释一一说明。

import requests

from bs4 import BeautifulSoup

import time

import re

import pymysql

from channel import channel   #这是我们第一个程序爬取的链接信息

import random

def ceshi_person(person):

try:

person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])

except ValueError:

person = int(10)

return person

def ceshi_priceone(price):

price = detil.get_text().split("/", 4)[4].split()

if re.match("USD", price[0]):

price = float(price[1]) * 6

elif re.match("CNY", price[0]):

price = price[1]

elif re.match("A$", price[0]):

price = float(price[1:len(price)]) * 6

else:

price = price[0]

return price

def ceshi_pricetwo(price):

price = detil.get_text().split("/", 3)[3].split()

if re.match("USD", price[0]):

price = float(price[1]) * 6

elif re.match("CNY", price[0]):

price = price[1]

elif re.match("A$", price[0]):

price = float(price[1:len(price)]) * 6

else:

price = price[0]

return price

#这是上面的那个测试函数,我们把它放在主函数中

def mains(url):

wb_data = requests.get(url)

soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")

tag=url.split("")[0].split("/")[-1]

detils=soup.select("#subject_list > ul > li > div.info > div.pub")

scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums")

persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl")

titles=soup.select("#subject_list > ul > li > div.info > h2 > a")

for detil,scor,person,title in zip(detils,scors,persons,titles):

l = []  #建一个列表,用于存放数据

try:

author=detil.get_text().split("/",4)[0].split()[0]

yizhe= detil.get_text().split("/", 4)[1]

publish=detil.get_text().split("/", 4)[2]

time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]

price=ceshi_priceone(detil)

scoe=scor.get_text() if True else ""

person=ceshi_person(person)

title=title.get_text().split()[0]

except IndexError:

try:

author=detil.get_text().split("/", 3)[0].split()[0]

yizhe=""

publish=detil.get_text().split("/", 3)[1]

time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]

price=ceshi_pricetwo(detil)

scoe=scor.get_text() if True else ""

person=ceshi_person(person)

title=title.get_text().split()[0]

except (IndexError,TypeError):

continue  

except TypeError:

continue

l.append([title,scoe,author,price,time,publish,person,yizhe,tag])

#将爬取的数据依次填入列表中

sql="INSERT INTO allbooks values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"  #这是一条sql插入语句

cur.executemany(sql,l)   #执行sql语句,并用executemary()函数批量插入数据库中

conn.commit()

#主函数到此结束

# 将Python连接到MySQL中的python数据库中

conn = pymysql.connect( user="root",password="123123",database="python",charset='utf8')

cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS allbooks')   #如果数据库中有allbooks的数据库则删除

sql = """CREATE TABLE allbooks(

title CHAR(255) NOT NULL,

scor CHAR(255),

author CHAR(255),

price CHAR(255),

time CHAR(255),

publish CHAR(255),

person CHAR(255),

yizhe CHAR(255),

tag CHAR(255)

)"""

cur.execute(sql)  #执行sql语句,新建一个allbooks的数据库

start = time.clock()   #设置一个时钟,这样我们就能知道我们爬取了多长时间了

for urls in channel.split():

urlss=[urls+"start={}&type=T".format(str(i)) for i in range(0,980,20)]   #从channel中提取url信息,并组装成每一页的链接

for url in urlss:

mains(url)       #执行主函数,开始爬取

print(url)        #输出要爬取的链接,这样我们就能知道爬到哪了,发生错误也好处理

time.sleep(int(format(random.randint(0,9))))   #设置一个随机数时间,每爬一个网页可以随机的停一段时间,防止IP被封

end = time.clock()

print('Time Usage:', end - start)    #爬取结束,输出爬取时间

count = cur.execute('select * from allbooks')

print('has %s record' % count)       #输出爬取的总数目条数

# 释放数据连接

if cur:

cur.close()

if conn:

conn.close()

这样,一个程序就算完成了,豆瓣的书目信息就一条条地写进了我们的数据库中,当然,在爬取的过程中,也遇到了很多问题,比如标题返回的信息拆分后中会有空格,写入数据库中会出现错误,所以只截取了标题的第一部分,因而导致数据库中的一些书名不完整,过往的如果有什么办法,还请指教一二。

等待爬取的过程是漫长而又欣喜的,看着电脑上一条条信息被刷出来,成就感就不知不觉涌上心头;然而如果你吃饭时它在爬,你上厕所时它在爬,你都已经爬了个山回来了它还在爬时,便会有点崩溃了,担心电脑随时都会坏掉(还是穷学生换不起啊啊啊啊~)

所以,还是要好好学学设置断点,多线程,以及正则,路漫漫其修远兮,吾将上下而求索~共勉~

人们很难接受与已学知识和经验相左的信息或观念,因为一个人所学的知识和观念都是经过反复筛选的。合众百科关于豆瓣电影top250介绍就到这里,希望能帮你解决当下的烦恼。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息储存空间服务,不拥有所有权,不承担相关法律责任。如有发现本站涉嫌抄袭侵权/违法违规的内容,请发送邮件,一经查实,本站将立刻删除。

猜你喜欢

  • 电影兵临绝境-电影兵临绝境简介影视

    电影兵临绝境-电影兵临绝境简介

    杀手情的演员介绍最佳答案生于1967年3月,湖北枝城县人。1985年,同时考入中央戏剧学院表演系和武汉音乐学院声乐系,她进入中央戏剧学院学习。1989年毕...

    2024-10-24 127
  • 变形金刚4电影片段影视

    变形金刚4电影片段

    变形金刚4答我在电影院看的首映,时间比较长了,具体几分几秒记不清了,但可以给你说下大概时刻。就是香港被一群变形金刚入侵那一截,来了好多外星...

    2024-10-24 107
  • 明星大4影视

    明星大4

    明星大侦探第四季每期嘉宾名单?最佳答案明星大侦探第四季每期嘉宾名单如下:1. 第四季马丽——马媳妇,魏晨——晨老大。2. E10:奇幻游乐园:撒贝宁...

    2024-10-24 50
  • 妈妈的朋友1韩国电影影视

    妈妈的朋友1韩国电影

    韩国影片 一位男孩寄宿在妈妈的女朋友家里最佳答案片名:母亲的朋友 The mother of friends时间:2015国家:韩国电影类型:剧情片语言:韩语字幕:暂无字幕...

    2024-10-24 52
  • 电影片头背景—电影片头音乐叫什么影视

    电影片头背景—电影片头音乐叫什么

    令人难以忘怀怦然心动的影视配乐都有哪些?答1.《My Heart Will Go On》这首《泰坦尼克号》电影主题曲由好莱坞主流电影著名作曲家詹姆斯·霍纳(James Horn...

    2024-10-24 149
  • 制作成本高达1亿美元的战争片《决战中途岛》,为什么还会被影迷指钱花少了?影视

    制作成本高达1亿美元的战争片《决战中途岛》,

    制作成本高达1亿美元的战争片《决战中途岛》,为什么还会被影迷指钱花少了?优质回答因为好莱坞大片的制作成本本来就很高,是我们普通人难以想象的...

    2024-10-24 77
  • 求奇幻电影介绍,近两年的影视

    求奇幻电影介绍,近两年的

    求奇幻电影介绍,近两年的优质回答神奇动物在哪里、佩小姐的奇幻城堡、奇幻森林、神战权力之眼、猎神冬日之战、灰姑娘、第七子、小飞侠幻梦起航、...

    2024-10-24 112
  • 欧美电影经典接吻镜头中都有哪些电影啊影视

    欧美电影经典接吻镜头中都有哪些电影啊

    欧美电影经典接吻镜头中都有哪些电影啊优质回答十大经典电影接吻镜头最催人泪下之吻----《人鬼情未了》年轻的银行职员萨姆与未婚妻美莉正在进行结婚...

    2024-10-24 165
  • 林心如主演的电影全部__林心如主演的电影全部名字影视

    林心如主演的电影全部__林心如主演的电影全部名

    林心如演过的电影答电影:(时间映年份为准)《倾城》2009饰演:秦肖雄 合作演员:黄觉、丁勇岱《非常完美》2009饰演:陆小夕(Lucy) 合作演员:章子怡、...

    2024-10-24 186
  • 路人甲的电影影视

    路人甲的电影

    《我是路人甲》这部电影里的男主女主现在怎么样了?答一部《我是路人甲》让大家了解到真实的普通横漂的生活。里面的男女主人公为万国鹏和王婷。很...

    2024-10-24 176
  • 中东反恐电影战地影视

    中东反恐电影战地

    12部经典反恐电影---恐怖袭击,惊天营救(下)答1:《93航班》豆瓣评分7.893航班的剧情简介  · · · · · ·用另一个角度,另一段历史,来怀缅9•...

    2024-10-24 197
  • 镜头下的爱情电影有哪些影视

    镜头下的爱情电影有哪些

    重口味爱情电影有哪些?答《生吃》这部电影讲述了一个素食主义女孩在机缘巧合的情况下发掘了自己内心野兽般嗜血的欲望,从而引发的一系列事故,从...

    2024-10-24 96
  • 电影尸体解剖影视

    电影尸体解剖

    有谁看过《尸体解剖》这部电影吗?优质回答刚看完偏血腥一点把,我觉得还好走的是一贯的路线,在荒郊野外没有支援,女主角只靠自己有几幕比较刺激...

    2024-10-24 115
  • bs4解析豆瓣电影top250影视

    bs4解析豆瓣电影top250

    如何用python爬取豆瓣读书的数据答这两天爬了豆瓣读书的十万条左右的书目信息,用时将近一天,现在趁着这个空闲把代码总结一下,还是菜鸟,都是用的...

    2024-10-24 57
  • 周润发特异功能电影:周润发科幻电影影视

    周润发特异功能电影:周润发科幻电影

    有一部老电影周润发演的有点科幻,周润发眼一瞪狗都爆了.叫什么名字答赌神导演: 王晶编剧: 王晶主演: 周润发 / 刘德华 / 王祖贤 / 张敏 / 向华...

    2024-10-24 51
  • 厦门时光影业影视

    厦门时光影业

    对你不止是喜欢小说简介答《对你不止是喜欢》小说讲述了鬼马精灵的新人编剧唐馨和高冷傲娇制片人唐域,两个人如何从暗恋到追妻的浪漫甜宠故事。小...

    2024-10-24 104
  • 电视电影征服.电影《征服》 有一段刘华强 砸那谁的游戏厅那是第几集啊影视

    电视电影征服.电影《征服》 有一段刘华强 砸那

    电影《征服》 有一段刘华强 砸那谁的游戏厅那是第几集啊优质回答第十一集韩宝山找到了某网络公司总经理何老六。何老六供述,当年他开游戏厅时,曾...

    2024-10-24 102
  • 张柏芝章子怡电视剧影视

    张柏芝章子怡电视剧

    章子怡张柏芝演的完美关系好看吗最佳答案好看。由章子怡张柏芝演的《完美关系》电视剧,已经共51集。讲述的是女孩江达琳(章子怡)从没干过一天公...

    2024-10-24 159
  • 三十极夜1电影!美国有一部恐怖电影里的几个女的都是畸形还很怕热的是什么恐怖片影视

    三十极夜1电影!美国有一部恐怖电影里的几个女

    美国有一部恐怖电影里的几个女的都是畸形还很怕热的是什么恐怖片最佳答案关键词:恐怖Ⅰ之僵尸代表作:《生化危机》系列1.《群尸玩过界》—提起这...

    2024-10-24 66
  • 安娜妮可史密斯主演电影影视

    安娜妮可史密斯主演电影

    安娜·妮可·史密斯是谁来的?答安娜·妮可·史密斯(Anna Nicole Smith,1967-2007),原名维基·琳·霍根(Vickie Lynn Hogan),美国德克萨斯州人,模特、演员,...

    2024-10-24 157