前言
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(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"):