影评许可证
公众号[2019]第22期
本栏目由“数据皮皮侠”独家呈献
专场
python爬虫实战——豆瓣电影get初体验
2019.10.28 / 早上7点场 / 免费
本期“栏目”的四大看点:
1 如何爬取2 如何解析与提取3 如何解析json数据4 实战:爬取豆瓣影视信息1 如何爬取
how to Obtain
我们老说爬虫,那么具体到底怎么爬?爬什么?
首先,“爬虫四步”:获取数据(包含请求和响应两个动作)、解析数据、提取数据、存储数据。
最简单的请求方式是:requests.get()
代码:
import requestsurl = ''response = requests.get(url)
此外,我们还需要一个工具,叫做Network。在它的帮助下,我们能看到所有的请求,这样我们才能完成爬虫四步
Network能够记录浏览器的所有请求。我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看图片)/Media(仅查看媒体文件)/Other(其他)。最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体。
在爬虫里, XHR和Doc是我们最常用的。我们能在Doc里找到一个网页的源代码,而在网页源代码里找不到的信息,通常都能在XHR里找到。有它的存在,人们不必刷新/跳转网页,即可加载新的内容。
2 解析与提取
Parsing and Reading
当数据藏匿于网页源代码,在“爬虫四步”链里,最重要的库叫BeautifulSoup,它能提供一套完整的数据解析、数据提取解决方案。(关于BeautifulSoup的安装和使用,在前期文章中介绍过哦~)
XHR所传输的数据,最重要的一种是用json格式写成的,和html一样,这种数据能够有组织地存储大量内容。json的数据类型是“文本”,我们称为字符串。我们能很容易将json格式的数据转化为列表/字典,反之也可以。
3 如何解析json数据
How to Parse JSON Data
通过Response类支持使用json()方法来将数据转为list/dic,比如:
import requestsr=requests.get(‘http://……’)print(r.json())
请求本身很有意思。requests.get()里面其实只有一个参数,即url。但其实,这个请求可以有多个参数。
params,可以让我们带着参数来请求数据:我想要第几页?我想要搜索的关键词?我想要多少个数据?
headers,请求头。它告诉服务器,我的设备/浏览器是什么?我从哪个页面而来?
再往后,除了get请求之外,还存在着另一种请求方式——post。post区别于get的是:get是明文显示参数,post是非明文显示参数。学会post,又有两个参数可用
(1)在post请求里,我们使用data来传递参数,其用法和params非常相像。
(2)cookies,中文名是“小饼干”。但它却和“小饼干”并无关联。它的作用是让服务器“记住你”,比如一般当你登录一个网站,你都会在登录页面看到一个可勾选的选项“记住我”。如果你点了勾选,服务器就会生成一个cookies和你的账号绑定。接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。当下一次,浏览器带着cookies访问博客,服务器会知道你是何人,你不需要再重复输入账号密码,就能直接访问。
到这,考虑极端情况。代码可能会是这样:
import requestsurl_1 = 'https://…'headers = {'user-agent':''}data = {}# 定义url,headers和datalogin_in = requests.post(url,headers=headers,data=data)cookies = login_in.cookies# 完成登录,获取cookiesurl_2 = 'https://…'params = {}# 定义url和paramsresponse=requests.get(url,headers=headers,params=params,cookies=cookies)# 带着cookies重新发起请求
4 如何爬取豆瓣电影数据?
Get Douban Movie Data
4.1
创建爬虫文件,获取url地址
地址为:url="https://movie.douban.com/top250"
4.2
使用request获取第一页的请求信息:
import requestsfrom bs4 import BeautifulSoupurl="https://movie.douban.com/top250"wb_data=requests.get(url)# 获取网页文本信息soup=BeautifulSoup(wb_data.text,'lxml')# 从soup中提取我们想要的信息titles=soup.select('div.hd>a')rates=soup.select('span.rating_num')imgs=soup.select('img[]')for title,rate,img in zip(titles,rates,imgs): data={ 'title':list(title.stripped_strings), 'rate':rate.get_text(), 'img':img.get('src') } print (data)
4.3
获取多页的请求信息
import requestsfrom bs4 import BeautifulSoupurls=['https://movie.douban.com/top250?start=n&filter=' for n in range(0,250,25)]for url in urls: wb_data=requests.get(url) # 获取网页文本信息 soup=BeautifulSoup(wb_data.text,'lxml') # 从soup中提取我们想要的信息 titles=soup.select('div.hd>a') rates=soup.select('span.rating_num') imgs=soup.select('img[]') for title,rate,img in zip(titles,rates,imgs): data={ 'title':list(title.stripped_strings), 'rate':rate.get_text(), 'img':img.get('src') } print(data)
4.4
下载电影图片地址到本地
import requestsfrom bs4 import BeautifulSoupi=0urls=['https://movie.douban.com/top250?start=n&filter=' for n in range(0,250,25)]for url in urls: wb_data=requests.get(url) # 获取网页文本信息 soup=BeautifulSoup(wb_data.text,'lxml') # 从soup中提取我们想要的信息 titles=soup.select('div.hd>a') rates=soup.select('span.rating_num') imgs=soup.select('img[]') for title,rate,img in zip(titles,rates,imgs): data={ 'title':list(title.stripped_strings), 'rate':rate.get_text(), 'img':img.get('src') } # 保存图片到本地 i+=1 fileName=str(i)+'、'+data['title'][0]+''+data['rate']+'分.jpg' pic=requests.get(data['img']) with open('E:/Envs/douban/douban_imgs/'+fileName,'wb')as photo: photo.write(pic.content) print(data)
4.5
爬取豆瓣热门美剧存储到mongodb中
将json数据转换为字典,然后根据键subjects循环取出里面的值,取出我们想要的数据
import requests,jsonurl='https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'response_data=requests.get(url)# 将json数据转换为字典类型并根据键名循环取出值json_data=json.loads(response_data.text)# 查看键名# print(json_data)for tv in json_data['subjects']: # print(tv) # 取出我们需要的数据 data={ 'rate':tv['rate'], 'title':tv['title'], 'img_url':tv['cover'], 'id':tv['id'], # 自定义一个标志 'tag':"美剧" } print(data)
获取多页数据
import requests,json# url='https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'# 这里的200可以修改为更高数字,目前只爬取200条数据urls=['https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start='+str(n) for n in range(0,200,20)]for url in urls: response_data=requests.get(url) # 将json数据转换为字典类型并根据键名循环取出值 json_data=json.loads(response_data.text) # 查看键名 # print(json_data) for tv in json_data['subjects']: # print(tv) # 取出我们需要的数据 data={ 'rate':tv['rate'], 'title':tv['title'], 'img_url':tv['cover'], 'id':tv['id'], # 自定义一个标志 'tag':"美剧" } print(data)
保存数据到mongodb数据库里面
import requests,json,pymongo# url='https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'# 这里的200可以修改为更高数字,目前只爬取200条数据client=pymongo.MongoClient(host='localhost',port=27017)db=client.db_bkcollection = db.doubanurls=['https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start='+str(n) for n in range(0,200,20)]for url in urls: response_data=requests.get(url) # 将json数据转换为字典类型并根据键名循环取出值 json_data=json.loads(response_data.text) # 查看键名 # print(json_data) for tv in json_data['subjects']: # print(tv) # 取出我们需要的数据 data={ 'rate':tv['rate'], 'title':tv['title'], 'img_url':tv['cover'], 'id':tv['id'], # 自定义一个标志 'tag':"美剧" } collection.insert_one(data) print(data)
END
本期“ 总导演 ”:李雨萱
本期“ 剪辑师 ”:李嘉楠
本期“栏目”进入尾声了,我们下期再见!
如果你有任何问题欢迎在“栏目下方”留言
关注公众号还可获取更多python的相关内容