爬虫豆瓣top250

  • 前言
    • 一.爬虫是什么
    • 二.爬取豆瓣的原因
    • 三.爬虫项目步骤
      • 1.准备工具
      • 2.学习python的相关知识
      • 3.爬虫过程讲析
    • 四.成果展示
    • 五.代码展示

前言


随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。

一.爬虫是什么


爬虫,即网络爬虫,大家可以理解为在网络上爬行的一只蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛,如果它遇到自己的猎物(所需要的资源),那么它就会将其抓取下来。 比如它在抓取一个网页,在这个网中他发现了一条道路,其实就是指向网页的超链接,那么它就可以爬到另一张网上来获取数据。

二.爬取豆瓣的原因

在忙碌了一周后的周末,想看电影但不知道看什么,可以通过python爬取豆瓣top250上的数据,瞅瞅有哪些高分的电影,用来度过无聊的周末,而且豆瓣是新手练习爬虫的必爬网站。

三.爬虫项目步骤

1.准备工具

爬虫就只需要一个工具那就是pycharm,学生用户可以通过学生邮箱绑定免费使用专业版一年。

2.学习python的相关知识

没错本人就是毕业于bilibili大学( •̀ ω •́ )✧

3.爬虫过程讲析

本项目引用了re库,SQLit3库,urlib库和BeautifulSoup库

Re库:正则表达式,用来匹配字符串,本项目中主要用来从原网页中提取我们需要的电影图片,片名,评分,评价人数,概况,和相关信息。

主函数:

从网页中提取数据:该模块利用了BeautifulSoup库和re库。我先获取到网页源码,利用bs函数查取想要的相关信息的标签和里面包括的内容并存进一个列表里,再利用正则表达式进行查找字符串,精确提取我需要的电影信息,并通过re的增删改查功能过滤掉无用信息和无法显示的字符(“\”和空格等),最后存入data列表中。


为了防止通过豆瓣的反爬系统,我通过抓取在访问网页时,浏览器向服务器发出的请求,找到了模拟浏览器访问的header文件:“User-Agent”并且写到项目中,通过urlbil进行访问豆瓣网站,在后续调试时通过多次访问过后,被豆瓣识别出异常,出现了404forbidden,需要登录才能查看页面,所以我通过登录后用相同方法抓取到了我的cookie并且加入到我的项目文件中,最后成功进入。

将我提取到和最终整理到的数据存入数据库中,我用到的是SQLit数据库


建表

四.成果展示

将爬取豆瓣top250的数据储存于数据库:SQLit3


用flask框架和网站模板制作了一个网页


用JavaScript脚本将爬取的数据可视化

五.代码展示

# -*- codeing = utf-8 -*-
# @Time : 21/11/2021 下午3:22
# @Author : lx
# @File : spider.py
# @Software: PyCharm
import re
import sqlite3
import urllib.request
from bs4 import BeautifulSoup
import xlwt# 视频链接
findLink = re.compile(r'<a href="(.*?)">')
# 图片
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
# 片名
findTitlle = re.compile(r'<span class="title">(.*)</span>')
# 评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>')
# 概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
# 找到影片的相关内容
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)def main():baseurl = "https://movie.douban.com/top250?start="datalist = getData(baseurl)dbpath = "movie.db"saveData2DB(datalist, dbpath)#爬取网页
def getData(baseurl):datalist = []for i in range(0,10):url = baseurl + str(i*25)html = askURL(url)#保存获取到的网页原码#逐一解析soup = BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"):   #查找复合要求的字符串行程列表#print(item)#全电影部信息data = [] #保存一部电影的所有信息item = str(item)#影片详情链接link = re.findall(findLink,item)[0]   #re通过正则表达式来查找字符串data.append(link)imgSrc = re.findall(findImgSrc,item)[0]data.append(imgSrc)titles = re.findall(findTitlle,item)if(len(titles) == 2):ctitle = titles[0]data.append(ctitle)otitle = titles[1].replace("/","").replace("\s+","")#去掉data.append(otitle)else:data.append(titles[0])data.append(' ')  #留空rating = re.findall(findRating,item)[0]data.append(rating)judgeNum = re.findall(findJudge,item)[0]data.append(judgeNum)inq = re.findall(findInq,item)#data.append(inq)if len(inq) !=0:inq = inq[0].replace("。","")#去掉句号data.append(inq)else:data.append(" ")bd = re.findall(findBd,item)[0]bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)#去掉/brbd = re.sub('/'," ",bd)bd = re.sub('\s+','',bd)data.append(bd.strip())#去掉前面的空格datalist.append(data)#放入listprint(data)#print(imag)return datalist#得到制定一个指定url的网页内容
def askURL(url):head ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36","cookie": 'douban-fav-remind=1; gr_user_id=2b182abb-21a6-4e01-bf15-94cffab535ca; bid=kTphEyGEmmk; __gads=ID=334554876a71cf90-220c8f78d9c50013:T=1611890753:RT=1611890753:R:S=ALNI_MY1aWv7EKmtd1lfQdCdDC5JjBFPrw; ll="118318"; __yadk_uid=fhQeosItbxkJWKANO3FEWb63Iqe5actg; _vwo_uuid_v2=D8388B9F467967FB71C723F95C05B144B|98103c6f09ba0be3758a3c3191ef672f; ap_v=0,6.0; __utmz=30149280.1640007497.13.6.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=30149280; __utma=30149280.1834268414.1574335688.1637744312.1640007497.13; __utmz=223695111.1640007497.5.5.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=223695111; dbcl2="251869304:pFZhfhymXbs"; ck=Qzbn; push_noty_num=0; push_doumail_num=0; __utmt=1; __utmv=30149280.25186; __utmb=30149280.4.10.1640007497; __utma=223695111.1918965793.1619793136.1640007497.1640011137.6; __utmb=223695111.0.10.1640011137; _pk_ref.100001.4cf6=["","",1640011137,"https://www.baidu.com/link?url=O-BjBB7GZ9YEpTJFkyoQzemJi3ZFWSXYMKGrXJAsQbc2nJuisdH6gLIli0ZvNTwE&wd=&eqid=9f9c8afc000acf740000000661c0873f"]; _pk_id.100001.4cf6=b7190c70f52d0409.1619793136.6.1640011137.1640009060.; _pk_ses.100001.4cf6=*'}request = urllib.request.Request(url,headers=head)html = ""try:response = urllib.request.urlopen(request)html = response.read().decode("utf-8")#print(html)except urllib.error.URLError as e:if hasattr(e,"code"):print(e.code)if hasattr(e,"reason"):print(e.reason)return html# 保存数据
# def savaData(datalist,savepath):
#
#     print("save...")
#     book = xlwt.Workbook(encoding="utf-8")#创建对象
#     sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)
#     col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评分数","概况","相关信息")
#     for i in range(0,8):
#         sheet.write(0,i,col[i])#列名
#     for i in range(0,250):
#         print("第%d条" %(i+1))
#         data = datalist[i]
#         for j in range(0,8):
#             sheet.write(i+1,j,data[j])
#
#
#     book.save('豆瓣.xls')def saveData2DB(datalist,dbpath):init_db(dbpath)conn = sqlite3.connect(dbpath)cur = conn.cursor()for data in datalist:for index in range(len(data)):if index == 4 or index == 5:continuedata[index] = '"'+str(data[index])+'"'sql = '''insert into movie250(info_link,pic_link,cname,ename,score,rated,instroduction,info)values(%s)'''%",".join(data)#'%s' %id for id in#print(sql)cur.execute(sql)conn.commit()cur.close()conn.close()def init_db(dbpath):sql = '''create table movie250(id integer primary key autoincrement,info_link text,pic_link text,cname varchar,ename varchar,score numeric,rated numeric,instroduction text,info text)'''conn = sqlite3.connect(dbpath)cur = conn.cursor()cur.execute(sql)conn.commit()conn.close()if __name__ == "__main__":main()print("爬取完毕")
from flask import Flask, render_template
import sqlite3
app = Flask(__name__)@app.route('/')
def index():  # put application's code herereturn render_template("temp.html")@app.route('/index')
def home():# return render_template("index.html")return index()@app.route('/movie')
def movie():datalist = []con = sqlite3.connect("movie.db")cur = con.cursor()sql = "select * from movie250"data = cur.execute(sql)for item in data:datalist.append(item)cur.close()con.close()return render_template("movie.html",movies = datalist)@app.route('/score')
def score():score = [] #评分num = [] #电影数con = sqlite3.connect("movie.db")cur = con.cursor()sql = "select score,count(score) from movie250 group by score"data = cur.execute(sql)for item in data:score.append(item[0])num.append(item[1])cur.close()con.close()return render_template("score.html",score= score,num= num)# @app.route('/word')
# def word():
#     return render_template("word.html")
#
# @app.route('/team')
# def team():
#     return render_template("index.html")if __name__ == '__main__':app.run()

可视化部分代码

<script type="text/javascript">var dom = document.getElementById("main");var myChart = echarts.init(dom);var app = {};var option;// prettier-ignorelet dataAxis = {{score}};// prettier-ignorelet data = {{num}};let yMax = 500;let dataShadow = [];for (let i = 0; i < data.length; i++) {dataShadow.push(yMax);}option = {title: {},xAxis: {data: dataAxis,axisLabel: {inside: true,color: '#000000'},axisTick: {show: false},axisLine: {show: false},z: 10},yAxis: {axisLine: {show: false},axisTick: {show: false},axisLabel: {color: '#999'}},dataZoom: [{type: 'inside'}],series: [{type: 'bar',showBackground: true,itemStyle: {color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#83bff6' },{ offset: 0.5, color: '#188df0' },{ offset: 1, color: '#188df0' }])},emphasis: {itemStyle: {color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#2378f7' },{ offset: 0.7, color: '#2378f7' },{ offset: 1, color: '#83bff6' }])}},data: data}]};// Enable data zoom when user click bar.const zoomSize = 6;myChart.on('click', function (params) {console.log(dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)]);myChart.dispatchAction({type: 'dataZoom',startValue: dataAxis[Math.max(params.dataIndex - zoomSize / 2, 0)],endValue:dataAxis[Math.min(params.dataIndex + zoomSize / 2, data.length - 1)]});});if (option && typeof option === 'object') {myChart.setOption(option);}</script>

爬虫豆瓣top250相关推荐

  1. 爬虫-豆瓣top250,东方财富网动态数据

    ~满满干货分享 一.豆瓣top250爬取过程 (学习视频:Python爬虫编程基础5天速成(2021全新合集)Python入门+数据分析_哔哩哔哩_bilibili) 1.爬取网页 def askUR ...

  2. 爬虫豆瓣TOP250电影数据

    今天是开通博客的第一天 目的 记录 爬取豆瓣TOP250电影数据 目的 我写博客的目的很简单,主要是想记录一些自己学习python的历程,后期包括一些其他方面的学习,目前在看唐松老师写的<Pyt ...

  3. 爬虫——豆瓣top250电影爬取实验

    1.获取头部 我们首先需要去到目标网址豆瓣top250上,点开'检查'选项,获取头部信息,具体见下图: 我们赋值user-agent和host的信息,这是一个爬虫隐身的最好方法. 于是有以下代码: h ...

  4. 《Forward团队-爬虫豆瓣top250项目-设计文档》

    队长博客:http://www.cnblogs.com/mazhuangmz/ 成员:马壮,李志宇,刘子轩,年光宇,邢云淇,张良 设计方案: 1.能分析HTML语言: 2.提取重要数据,并保存为文本文 ...

  5. Forward团队-爬虫豆瓣top250项目-设计文档

    组长地址:http://www.cnblogs.com/mazhuangmz/p/7603594.html 成员:马壮,李志宇,刘子轩,年光宇,邢云淇,张良 设计方案: 1.能分析HTML语言: 2. ...

  6. 爬虫——豆瓣Top250

    使用requset库和bs4解析,最后保存为csv文件 import requests from bs4 import BeautifulSoup import pandas as pd import ...

  7. Forward团队-爬虫豆瓣top250项目-模块开发过程

    项目托管平台地址:https://github.com/xyhcq/top250 开发模块功能: 写入文件功能 开发时间:3小时 实现将爬取到的信息写入到文件中的功能 实现过程: # 打开文件 f=o ...

  8. 团队-爬虫豆瓣top250项目-模块开发过程

    项目托管平台地址:https://gitee.com/ningshuyoumeng/TuanDui-PaChongDouBantop250XiangMu-MoKuaiKaiFa 开发模块功能: 功获取 ...

  9. 爬虫豆瓣top250项目-开发文档

    项目托管平台地址:https://github.com/gengwenhao/GetTop250.git 负责内容:1.使用python的request库先获取网页内容下来 2.再使用一个好用的lxm ...

  10. 团队-爬虫豆瓣top250项目-项目进度

    注: 正则表达式在线检测工具:http://tool.oschina.net/regex/ 进程: 1.源代码HTML #将url转换为HTML源码 def getHtml(url):     try ...

最新文章

  1. JavaScript采用append添加的元素错误
  2. browsersync php,用browserSync吞下4个php
  3. 科大星云诗社动态20210121
  4. java tree类子项的添加和删除_使用Java实现二叉树的添加,删除,获取以及遍历...
  5. BZOJ2333 [SCOI2011]棘手的操作 【离线 + 线段树】
  6. 主机连接wifi,如何设置虚拟机上网方式
  7. 流畅的python mobi_流畅的Python中文pdf_Python教程
  8. 模型预测控制路径跟踪python语言实现
  9. FC SAN - 光纤通道存储区域网络
  10. MacBook快捷键
  11. Linux 目录权限
  12. 云安全架构连载之一-Azure整体架构及安全亮点详解
  13. openharmony标准系统移植之适配hdc功能
  14. 多张图片怎么合成gif动图?电脑如何将静图转换动图?
  15. PyQt——1. 简单认识PyQt及Python3.7安装QtDesigner
  16. HTML5CSS3基础:HTML的图片、音频、视频(3)
  17. APUE学习的经验(引以为戒)
  18. 无线wifi丢包的解决办法
  19. AStyle2.02在VS2008下的使用
  20. Macbook pro 安装Homebrew 软件

热门文章

  1. 106个计算机学部毕业设计项目大全(附源码)
  2. 服务器dell/hp/ibm硬件检测工具
  3. python中文近义词工具_python根据词条生成同义词库
  4. 记事本如何运行python代码_记事本写代码怎么运行
  5. 最棒的 JavaScript 学习指南(2018版)
  6. String类型转换成json对象
  7. VS2017配置opencv教程(超详细!!!)
  8. c语言算法骑士,[算法]C语言实现 骑士旅游(递归)
  9. ff14离线查看客户端日志小技巧
  10. 计算机系统结构——考题