【1.项目背景】豆瓣电影提供最新的电影介绍和评论,包括电影信息查询和已上映电影的购票服务。可以录制自己想看的电影电视剧,边看边看,顺便打分写影评。极大地方便了人们的生活。今天以电视剧(美剧)为例,批量抓取对应的电影,写入csv文件。用户可以通过评分更好地选择自己想要的电影。[2。项目目标】获取对应的电影名称、评分、详情链接,下载电影图片,保存文件。[3.涉及的图书馆和网站]1、网址如下:https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}2.涉及的库:requests、fake_useragent、json、csv3,软件:PyCharm[4.项目分析】1、如何请求更多的网页?当点击下一页时,paged每增加一页就会增加20,并用{}转换变量代替,然后使用for循环遍历URL,实现多次URL请求。2、如何获取真实请求的地址?请求数据时,发现页面上没有对应的数据。其实豆瓣是用javascript动态加载内容来防止被采集的。1)F12右键查看,找到Network,左侧菜单Name,找到第五条数据,点击Preview。2)点击subjects,可以看到title是对应电影的名字。rate是对应的分数。通过js解析subjects字典,找到需要的字段。如何访问网页?https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=20https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=40https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=60一个页面递增20,使用{}替换转换后的变量,然后使用for循环遍历URL,实现多URL请求。[V.项目实现】1、我们定义一个类class继承object,然后定义init方法继承self,再定义一个main函数main继承self。导入所需的库和请求url。importrequests,jsonfromfake_useragentimportUserAgentimportcsvclassDoban(object):def__init__(self):self.url="https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}"defmain(self):passif__name__=='__main__':Siper=Doban()Siper.main()2.随机生成UserAgent,构造请求头,防止反攀登。foriinrange(1,50):self.headers={'User-Agent':ua.random,}3.发送请求,得到响应,回调页面,方便下一次请求。defget_page(self,url):res=requests.get(url=url,headers=self.headers)html=res.content.decode("utf-8")返回html4,json解析页面数据,得到相应的字典。data=json.loads(html)['subjects']#print(data[0])5.遍历,获取对应的电影名,评分,链接到下一个详情页。print(name,goblin_herf)html2=self.get_page(goblin_herf)#第二个请求parse_html2=etree.HTML(html2)r=parse_html2.xpath('//div[@class="entry"]/p/text()')6.创建一个csv文件用于写入,定义相应的header内容,保存数据。#创建用于写入的csv文件csv_file=open('scr.csv','a',encoding='gbk')csv_writer=csv.writer(csv_file)#写入csv头内容csv_writerr.writerow(['movie','Score',"详情页"])#写入数据csv_writer.writerow([id,rate,url])7.请求图片地址。定义图片名称并保存文档。html2=requests.get(url=url,headers=self.headers).contentdirname="./image/"+id+".jpg"withopen(dirname,'wb')asf:f.write(html2)print("%s【下载成功!!!】"%id)8.调用方法实现功能。html=self.get_page(url)self.parse_page(html)9.项目优化:1)设置延时。time.sleep(1.4)2)定义一个变量u,用于遍历,表示爬取哪个页面。(明显更清楚)。u=0self.u+=1;[6.【效果展示】1、点击绿色小三角运行,进入起始页和结束页(从第0页开始)。2.在控制台显示下载成功信息。3.保存csv文件。4.电影画面显示。[7.总结】1、不建议抓取太多数据,容易造成服务器负载,稍微尝试一下。2、本文针对Python爬取豆瓣做了一个相对的解决方案,应用中的难点和重点,以及如何防止反爬。3、希望通过这个项目,能够帮助理解json解析页面的基本过程,字符串是如何拼接的,format函数是如何使用的。4、本文基于Python网络爬虫,使用爬虫库获取豆瓣电影及其图片。到实现的时候,总会遇到各种各样的问题。不要好高骛远,踏踏实实去努力,这样才能理解的更深刻。5、需要本文源码的可以在后台回复“豆瓣电影”获取。看完这篇文章你有收获吗?请转发分享给更多的人加入IT分享之家群,请在微信后台回复【进群】如果想深入了解Python网络爬虫和数据挖掘,可以上专业网站:http://pdcfighting.com/
