如何使用Python爬虫实现抓取电影网站信息并入库
这篇文章主要介绍如何使用Python爬虫实现抓取电影网站信息并入库,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
一.环境搭建1.下载安装包访问 Python官网下载地址:https://www.python.org/downloads/
下载适合自己系统的安装包:
我用的是 Windows 环境,所以直接下的 exe 包进行安装。
下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。
2.修改环境变量右键点击"计算机",点击"属性";
然后点击"高级系统设置"-“环境变量”;
选择"系统变量"窗口下面的 “Path” ,添加 python 安装路径;
设置成功以后,在cmd命令行,输入命令"python",有显示则说明配置成功。
3.安装依赖模块我们的爬取程序需要安装的依赖模块包括 requests,lxml,pymysql ,步骤如下:
进入python安装目录下的Scripts目录,点击地址栏输入“cmd” 打开命令行工具:
在这个路径下安装对应的 requests,lxml,pymysql 依赖:
需要输入的命令:
//安装requests依赖pipinstallrequests//安装lxml依赖pipinstalllxml//安装pymysql依赖pipinstallpymysql二.代码开发
开发 collectMovies.py
#!/user/binenvpython#获取电影天堂详细信息importrequestsimporttimefromlxmlimportetreeimportpymysqlrequests.adapters.DEFAULT_RETRIES=5#伪装浏览器HEADERS={'User-Agent':'Mozilla/5.(WindowsNT10.0;WOW64)AppleWebKit/537.3(KHTML,likeGecko)Chrome/63.0.3239.13Safari/537.36','Host':'www.dy2018.com'}#定义全局变量BASE_DOMAIN='https://www.dy2018.com/'#获取首页网页信息并解析defgetUrlText(url,coding):s=requests.session()#print("获取首页网页信息并解析:",url)respons=s.get(url,headers=HEADERS)print("请求URL:",url)if(coding=='c'):urlText=respons.content.decode('gbk')html=etree.HTML(urlText)#使用lxml解析网页else:urlText=respons.texthtml=etree.HTML(urlText)#使用lxml解析网页s.keep_alive=Falsereturnhtml#获取电影详情页的href,text解析defgetHref(url):html=getUrlText(url,'t')aHref=html.xpath('//table[@class="tbspan"]//a/@href')print("获取电影详情页的href,text解析```")htmlAll=map(lambdaurl:BASE_DOMAIN+url,aHref)#给每个href补充BASE_DOMAINreturnhtmlAll#使用content解析电影详情页,并获取详细信息数据defgetPage(url):html=getUrlText(url,'c')moveInfo={}#定义电影信息mName=html.xpath('//div[@class="title_all"]//h2/text()')[0]moveInfo['movie_name']=mNamemDiv=html.xpath('//div[@id="Zoom"]')[0]mImgSrc=mDiv.xpath('.//img/@src')moveInfo['image_path']=mImgSrc[0]#获取海报src地址iflen(mImgSrc)>=2:moveInfo['screenshot']=mImgSrc[1]#获取电影截图src地址mContnent=mDiv.xpath('.//text()')defpares_info(info,rule):''':paraminfo:字符串:paramrule:替换字串:return:指定字符串替换为空,并剔除左右空格'''returninfo.replace(rule,'').strip()forindex,tinenumerate(mContnent):ift.startswith('◎译 名'):name=pares_info(t,'◎译 名')moveInfo['translation']=nameelift.startswith('◎片 名'):name=pares_info(t,'◎片 名')moveInfo['movie_title']=nameelift.startswith('◎年 代'):name=pares_info(t,'◎年 代')moveInfo['movie_age']=nameelift.startswith('◎产 地'):name=pares_info(t,'◎产 地')moveInfo['movie_place']=nameelift.startswith('◎类 别'):name=pares_info(t,'◎类 别')moveInfo['category']=nameelift.startswith('◎语 言'):name=pares_info(t,'◎语 言')moveInfo['language']=nameelift.startswith('◎字 幕'):name=pares_info(t,'◎字 幕')moveInfo['subtitle']=nameelift.startswith('◎上映日期'):name=pares_info(t,'◎上映日期')moveInfo['release_date']=nameelift.startswith('◎豆瓣评分'):name=pares_info(t,'◎豆瓣评分')moveInfo['douban_score']=nameelift.startswith('◎片 长'):name=pares_info(t,'◎片 长')moveInfo['file_length']=nameelift.startswith('◎导 演'):name=pares_info(t,'◎导 演')moveInfo['director']=nameelift.startswith('◎编 剧'):name=pares_info(t,'◎编 剧')writers=[name]foriinrange(index+1,len(mContnent)):writer=mContnent[i].strip()ifwriter.startswith('◎'):breakwriters.append(writer)moveInfo['screenwriter']=writerselift.startswith('◎主 演'):name=pares_info(t,'◎主 演')actors=[name]foriinrange(index+1,len(mContnent)):actor=mContnent[i].strip()ifactor.startswith('◎'):breakactors.append(actor)moveInfo['stars']="".join(actors)elift.startswith('◎标 签'):name=pares_info(t,'◎标 签')moveInfo['tags']=nameelift.startswith('◎简 介'):name=pares_info(t,'◎简 介')profiles=[]foriinrange(index+1,len(mContnent)):profile=mContnent[i].strip()ifprofile.startswith('◎获奖情况')or'【下载地址】'inprofile:breakprofiles.append(profile)moveInfo['introduction']="".join(profiles)elift.startswith('◎获奖情况'):name=pares_info(t,'◎获奖情况')awards=[]foriinrange(index+1,len(mContnent)):award=mContnent[i].strip()if'【下载地址】'inaward:breakawards.append(award)moveInfo['awards']="".join(awards)moveInfo['movie_url']=urlreturnmoveInfo#获取前n页所有电影的详情页hrefdefspider():#连接数据库base_url='https://www.dy2018.com/html/gndy/dyzz/index_{}.html'moves=[]m=int(input('请输入您要获取的开始页:'))n=int(input('请输入您要获取的结束页:'))print('即将写入第{}页到第{}页的电影信息,请稍后...'.format(m,n))foriinrange(m,n+1):print('*******第{}页电影正在写入********'.format(i))ifi==1:url="https://www.dy2018.com/html/gndy/dyzz/"else:url=base_url.format(i)moveHref=getHref(url)print("休息2s后再进行操作")time.sleep(2)forindex,mhrefinenumerate(moveHref):print('----正在处理第{}部电影----'.format(index+1))move=getPage(mhref)moves.append(move)#将电影信息写入数据库db=pymysql.connect(host='127.0.0.1',user='root',password='123456',port=3306,db='你的数据库名称')table='movies'i=1fordatainmoves:keys=','.join(data.keys())values=','.join(['%s']*len(data))sql='INSERTINTO{table}(id,{keys})VALUES(null,{values})'.format(table=table,keys=keys,values=values)try:cursor=db.cursor()cursor.execute(sql,tuple(data.values()))print('本条数据成功执行!')ifi%10==0:db.commit()exceptExceptionase:print('将电影信息写入数据库发生异常!',repr(e))db.rollback()cursor.close()i=i+1db.commit()db.close()print('写入数据库完成!')if__name__=='__main__':spider()三.运行测试1.新建电影信息表
CREATETABLE`movies`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`movie_name`varchar(255)DEFAULTNULL,`image_path`varchar(255)DEFAULTNULL,`screenshot`varchar(255)DEFAULTNULL,`translation`varchar(255)DEFAULTNULL,`movie_title`varchar(255)DEFAULTNULL,`movie_age`varchar(50)DEFAULTNULL,`movie_place`varchar(50)DEFAULTNULL,`category`varchar(100)DEFAULTNULL,`language`varchar(100)DEFAULTNULL,`subtitle`varchar(100)DEFAULTNULL,`release_date`varchar(50)DEFAULTNULL,`douban_score`varchar(50)DEFAULTNULL,`file_length`varchar(255)DEFAULTNULL,`director`varchar(100)DEFAULTNULL,`screenwriter`varchar(100)DEFAULTNULL,`stars`mediumtext,`tags`varchar(255)DEFAULTNULL,`introduction`mediumtext,`awards`text,`movie_url`varchar(255)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;2.代码运行
打开 collectMovies.py 所在目录,输入命令运行:
pythoncollectMovies.py
运行结果如下:
查看数据库表,数据已成功插入:
四.问题排查和修复1.空白字符报错第一次使用 Python,不太熟悉它的规则,空格和Tab混用,运行会报如下错:
unindentdoesnotmatchanyouterindentationlevel
解决方法
下载 Notepad++,选择 “编辑” – “空白字符操作” – "空格转 Tab (行首)"即可。
2.请求报错修改好格式之后再次运行,反反复复的报请求的错,报错信息主要包括以下内容:
ssl.SSLEOFError:EOFoccurredinviolationofprotocol······Maxretriesexceededwithurl
解决方法
本来以为是请求设置出了问题,各种百度,还安装了 pip install incremental ,但是依然没有奏效。
后来把请求的网址换成百度网就不报错了,这样可以定位到是原网址的访问出了问题,更换了采集源路径,该问题解决。
以上是“如何使用Python爬虫实现抓取电影网站信息并入库”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。