我们发现很多电影网站的电影信息,和豆瓣网中的电影信息一模一样,连标点符号都分毫不差!!!各大平台的数据维护人员如此严谨敬业有耐心??NO!!他们只是靠爬虫直接把豆瓣里的数据放入了自己的平台,丝毫不费人工、文笔、脑子,是彻彻底底的拿来主义(网络爬虫)!
网络爬虫,是按照一定规则,自动抓取互联网信息的程序。由于用户需求具有针对性,所以定向抓取相关网页并分析成为了主流的爬取策略。
我前两天用浏览器驱动+selenium进行了爬虫,过程比较顺利,但普适性不强,尤其是浏览器版本众多,把程序打包给人家用,人家可能还需要根据自己的浏览器版本去下载浏览器驱动,一个好的程序不应该这样,所以能不用浏览器驱动就不用,于是,今天就尝试BeautifulSoup+urllib+python的方法,爬取豆瓣网上电影TOP250信息。
爬虫程序的基本步骤:爬取数据、解析数据、保存数据。
一、构建爬虫框架
def main():
baseurl = "https://movie.douban.com/top250?start="
#爬取网页
movielist = getData(baseurl)
#保存数据
savepath = "豆瓣top250.xls"
saveData(movielist,savepath)
运行报错1:
解决:点击file –> setting设置 –> Project:your project name –> Project Interpreter –> 设置 –> Add Local –> 查看venv1位置,找到将文件夹下内容删除–>点击ok,重新配置环境。
运行报错2:
解决:点击进入设置install package即可:
运行报错3:安装urllib失败
解决:我盲选了个版本,安装了urllib5就没问题了。
二、获取一个网页的数据
1、F12,找Network中的各种headers属性
2、编写获取一页网页信息代码如下:
#得到一个指定url的网页信息
def askURL(url):
#将本地身份证亮出来告诉服务器,获取的信息的格式
head = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
#新建request接受信息
request = urllib.request.Request(url,headers=head)
html = ""
#将获取的网页信息存入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)
三、翻页返回新url,边爬虫边解析
#爬取网页
def getData(baseurl):
datalist = []
for i in range(0,10,1):
url = baseurl+str(i*25)
html = askURL(url)
#逐一解析
soup = BeautifulSoup(html, "html.parser") # 声明解析器
for item in soup.find_all("div",class_="item"):
print(item)
这样就打印出了top250的信息,但这些信息是未经过分类整理的,接下来,需要用正则表达式制定规则(此处需用到re库),把电影信息分类存放在列表里。
四、定义查找规则(正则表达式)
正则表达式的使用方法,参照:https://www.cnblogs.com/buzaiyicheng/p/11202966.html
1、链接:findlink = re.compile(r'')
compile表示创建规则;r’表示后面的内容都不转义;.表示一个字符;*表示多个字符;?表示有或者没有。
运行报错:expected string or bytes-like object,一般为数据类型不匹配造成的。
Python3中有六个标准的数据类型:
Number(数字)
string(字符串)
List(列表)
Tuple(元组)
Sets(集合)
Dictionary(字典)
可以通过print(type(object))来查当前的数据类型,式中object为要查询的对象。
将item先转化为字符串最为保险:找到一个符合要求的item→转为字符串→在item中找符合规则的link→打印
2、获取图片
re.S表示让换行符保持不变
3、继续添加规则
findlink = re.compile(r'')#创建正则表达式对象,表示规则
findimg = re.compile(r',re.S)#让换行符保持不变
findtitle = re.compile(r'(.*?)')
findrate = re.compile(r' ')
findcomnum = re.compile(r'(\d*)人评价') #\d表示数字,加*表示很多数字
findintroduce = re.compile(r'(.*?)')
findbd = re.compile(r'(.*?)
',re.S)
4、将爬取的数据加入列表
#爬取网页
def getData(baseurl):
movielist = []
for i in range(0,10,1):
url = baseurl+str(i*25)
html = askURL(url)
#逐一解析
soup = BeautifulSoup(html, "html.parser") # 声明解析器
for item in soup.find_all("div",class_="item"):#寻找符合要求的字符串形成列表
item = str(item)
movie_one = []
#print(item)
link = re.findall(findlink,item)[0]
movie_one.append(link)
imgSrc = re.findall(findimg,item)[0]
movie_one.append(imgSrc)
title = re.findall(findtitle,item) #存在中文和英文名
if len(title)==2:
ctitle = title[0]
movie_one.append(ctitle)
etitle = title[1].replace("/","") #去掉外国名前面的/
movie_one.append(etitle)
else:
movie_one.append(title[0])
movie_one.append('') #将英文名留空
rate = re.findall(findrate, item)[0]
movie_one.append(rate)
commentnum = re.findall(findcomnum, item)[0]
movie_one.append(commentnum)
produce = re.findall(findintroduce, item)
if len(produce)!=0:
produce = produce[0]
movie_one.append(produce)
else:
movie_one.append(" ")
bd = re.findall(findbd,item)[0]
bd = re.sub('
(\s+)?',"",bd)
movie_one.append(bd.strip()) #去掉前后的空格
movielist.append(movie_one)
#print(movielist)
return movielist
四、保存数据
def saveData(datalist,savepath):
print("开始保存")
book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建work对象
sheet =book.add_sheet('豆瓣TOP250',cell_overwrite_ok=True)#修改单元格权限 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] #提取1条数据
for j in range(0,8):
sheet.write(i+1,j,data[j]) #写入第i条的每一列
book.save(savepath)
注意:是%d,千万不要写成d%!!!
五、小结:
1、正则表达式筛选的时候,注意中英文切换,注意采用替换或者删除的方式把不必要的空格,斜杠等处理掉;
2、写入列表时,记得留空位,不然保存到excel表会发生错位,oh不,根本保存不了,它会报错;
3、保存的操作就是个套娃游戏,脑袋容易被套晕;
补充:
当遇到下拉滚动条加载更多的时候,可以尝试用PhantomJS。PhantomJS是一个无界面的、可脚本编程的WebKit浏览器引擎,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。
官方下载地址:http://phantomjs.org/download.html
配置环境变量:
win+R,输入cmd打开控制台,输入phantomjs -v,若输出了版本号,则证明安装成功了。
设置了环境变量,我这里还是报错:Message: ‘phantomjs’ executable needs to be in PATH
最后发现,将pyantomjs.exe放入python文件夹里即可。