您的位置:首页 > 理论基础 > 计算机网络

实现一个简单的网络爬虫,爬取静态页面数据

2020-02-02 00:43 691 查看

以豆瓣电影为例,爬取《后来的我们》的影评。

找到影评页面

找到链接:https://movie.douban.com/subject/26683723/comments?status=P
右键----点击检查

发现影评都是写在span标签里面,class为short

代码如下

# 需要调用的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')
# 找到所有span标签中的内容并存放在xml这样一个类似于数组队列的对象中
xml = soup.find_all('span', class_='short')
# 利用循环将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
第三页:
https://movie.douban.com/subject/26683723/comments?start=40&limit=20&sort=new_score&status=P
第…页:

发现规律:只有start= 后面的数字不同,都是20的倍数,原因是因为一页的影评只有20条。

代码修改如下:

# 需要调用的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')
# 找到所有span标签中的内容并存放在xml这样一个类似于数组队列的对象中
xml = soup.find_all('span', class_='short')
# 利用循环将xml[]中存放的每一条打印出来

for i in range(len(xml)):  # 表示从0到xml的len()长度
msg = xml[i].string
if not msg is None:
num += 1
print('第', num, '条', msg)

效果:

  • 点赞
  • 收藏
  • 分享
  • 文章举报
kuguhuan 发布了42 篇原创文章 · 获赞 11 · 访问量 4323 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: