社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
前几天,刘若英的《后来》电影版——《后来的我们》上映了,我身边也有小伙伴去看了,问了之后,他们说其实这个电影对没有多少故事的我们代入感不够强,我没去看,一是因为单身狗一只,去电影院看电影纯属找虐,另一个原因就是我事先看过这个电影在豆瓣上的评分,以及各种影评,所以综合考虑还是等各大视频网站上映了再在网站上看吧。那么,去豆瓣网翻影评,一页一页太麻烦了,浪费时间,怎么样才能又快又准确的获取影评呢?答案很简单,几段爬虫代码就完成了,究竟多简单呢?我们一块来看。
一、找到要爬的网页,并且确定要爬取的数据在网页源代码中的位置
首先我们要进入豆瓣电影(我也不知道为啥基本上所有的爬虫入门都要拿豆瓣电影开刀哈哈哈),找到《后来的我们》影评部分
点进全部影评之后:
这就是我们要爬的目标网页了,记下网址:https://movie.douban.com/subject/26683723/comments?status=P
接下来是找到影评在网页源代码中的位置:
1、在该网页单击鼠标右键>检查,就出现了下面的情况:
2、在检查窗口移动鼠标,放在不同的代码段上,网页上就会有不同的区域被选中,经过不断查找,我们发现存放影评的文字都存放在<p class=""> </p>标签当中,那么影评的位置就这样确定下来了,接下来就交给Python吧!
二、用Python写一段爬虫代码
我们要用到的是Python语言,所以要用的开发工具是PyCharm
1、file>new project,新建一个Python项目,然后file > new >Python file
先上代码:
#需要调用的requests 库和 BeautifulSoup库中的bs4工具
import requests
from bs4 import BeautifulSoup
num=0#定义条数的初始值
#定义一个变量url,为需要爬取数据我网页网址
url = 'https://movie.douban.com/subject/26683723/comments?status=P'
#获取这个网页的源代码,存放在req中,{}中为不同浏览器的不同User-Agent属性,针对不同浏览器可以自行百度
req = requests.get(url,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
#生成一个Beautifulsoup对象,用以后边的查找工作
soup = BeautifulSoup(req.text,'lxml')
#找到所有p标签中的内容并存放在xml这样一个类似于数组队列的对象中
xml = soup.find_all('p',class_='')
#利用循环将xml[]中存放的每一条打印出来
for i in range(len(xml)):#表示从0到xml的len()长度
msg = xml[i].string
if not msg is None:
num += 1
print('第', num, '条', msg)
运行之后,就是如下效果:
爬虫是如此的神奇。
三、优化
简单的爬虫效果就是以上内容了,那么是不是每次只能获取那20条影评呢?能不能实现自动翻页,把所有的数据都爬下来?
答案是肯定的。不过首先我们要找到上下页网址之间存在的联系,这样我们就能实现自动翻页了。
首先是影评的第一页:https://movie.douban.com/subject/26683723/comments?status=P
点击后页之后,第二页:
https://movie.douban.com/subject/26683723/comments?start=20&limit=20&sort=new_score&status=P&percent_type=
再点击后页,第三页:
https://movie.douban.com/subject/26683723/comments?start=40&limit=20&sort=new_score&status=P&percent_type=
当我们点击首页,第一页:
https://movie.douban.com/subject/26683723/comments?start=0&limit=20&sort=new_score&status=P&percent_type=
对比发现:它们的区别在于start=后边的数字不同,都是20的整倍数(原因是每页都只有20条影评)
所以只要实现start=后边的字符串的改变,即可实现对不同页面进行爬取。
具体方法如下:
#需要调用的requests 库和 BeautifulSoup库中的bs4工具
import requests
from bs4 import BeautifulSoup
num=0#定义条数的初始值
#通过循环实现对不同页码的网页的数据爬取
for page in range(10):#以10页为例
value = page * 20#考虑到start=后边的都是20的整倍数
#定义一个变量url,为需要爬取数据我网页网址(要将url由'https://movie.douban.com/subject/26683723/comments?status=P'换成'https://movie.douban.com/subject/26683723/comments?start=0&limit=20&sort=new_score&status=P&percent_type=')
#利用Python中字符串替换的方法:在要替换的地方用%s代替,在语句后%+要替换的内容
url = 'https://movie.douban.com/subject/26683723/comments?start=%s&limit=20&sort=new_score&status=P&percent_type=' %str(value)#str转型
#获取这个网页的源代码,存放在req中,{}中为不同浏览器的不同User-Agent属性,针对不同浏览器可以自行百度
req = requests.get(url,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
#生成一个Beautifulsoup对象,用以后边的查找工作
soup = BeautifulSoup(req.text,'lxml')
#找到所有p标签中的内容并存放在xml这样一个类似于数组队列的对象中
xml = soup.find_all('p',class_='')
#利用循环将xml[]中存放的每一条打印出来
for i in range(len(xml)):#表示从0到xml的len()长度
msg = xml[i].string
if not msg is None:
num += 1
print('第', num, '条', msg)
点击运行,就是以下效果:
当然,很多网站都会有反爬机制,当短时间内同一个IP多次对服务器进行访问时,服务器会暂时中断对该IP的服务,这样我们就不能得到想要的结果,所以一个办法就是增加延时,当然还有其他很多办法,因为我也只是个小白,只会这么多。下边是加上延时之后代码:
#需要调用的requests 库和 BeautifulSoup库中的bs4工具
import requests
from bs4 import BeautifulSoup
import time
num=0#定义条数的初始值
#通过循环实现对不同页码的网页的数据爬取
for page in range(10):#以10页为例
time.sleep(1) #延时1秒
value = page * 20#考虑到start=后边的都是20的整倍数
#定义一个变量url,为需要爬取数据我网页网址(要将url由'https://movie.douban.com/subject/26683723/comments?status=P'换成'https://movie.douban.com/subject/26683723/comments?start=0&limit=20&sort=new_score&status=P&percent_type=')
#利用Python中字符串替换的方法:在要替换的地方用%s代替,在语句后%+要替换的内容
url = 'https://movie.douban.com/subject/26683723/comments?start=%s&limit=20&sort=new_score&status=P&percent_type=' %str(value)#str转型
#获取这个网页的源代码,存放在req中,{}中为不同浏览器的不同User-Agent属性,针对不同浏览器可以自行百度
req = requests.get(url,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
#生成一个Beautifulsoup对象,用以后边的查找工作
soup = BeautifulSoup(req.text,'lxml')
#找到所有p标签中的内容并存放在xml这样一个类似于数组队列的对象中
xml = soup.find_all('p',class_='')
#利用循环将xml[]中存放的每一条打印出来
for i in range(len(xml)):#表示从0到xml的len()长度
msg = xml[i].string
if not msg is None:
num += 1
print('第', num, '条', msg)
小结
主要有以下步骤:先找到目标网页,分析网页源码,确定所需数据的位置,编写Python代码,调用Python强大的工具就可以实现了。
以上就是刚入门Python的渣渣(就系我)关于简单静态网络爬虫的一些理解,如果有什么表述不当的或者有误的,恳请路过的大佬批评指正。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!