网页数据抓取(本文文章的续篇爬虫基本原理爬虫爬虫代码改进(一))
优采云 发布时间: 2021-09-27 13:05网页数据抓取(本文文章的续篇爬虫基本原理爬虫爬虫代码改进(一))
这篇文章是下面两篇文章的续篇文章
爬虫的基本原理
爬虫代码改进(一)
本系列包括以下内容
这篇文章主要讲
上一篇文章我们定义了一个函数来抓取豆瓣top250的一页数据,代码如下
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
import json
def start_requests(url):
r = requests.get(url)
return r.content
def parse(text):
soup = BeautifulSoup(text, 'html.parser')
movie_list = soup.find_all('div', class_ = 'item')
result_list = []
for movie in movie_list:
mydict = {}
mydict['title'] = movie.find('span', class_ = 'title').text
mydict['score'] = movie.find('span', class_ = 'rating_num').text
mydict['quote'] = movie.find('span', class_ = 'inq').text
star = movie.find('div', class_ = 'star')
mydict['comment_num'] = star.find_all('span')[-1].text[:-3]
result_list.append(mydict)
return result_list
def write_json(result):
s = json.dumps(result, indent = 4, ensure_ascii=False)
with open('movies.json', 'w', encoding = 'utf-8') as f:
f.write(s)
def main():
url = 'https://movie.douban.com/top250'
text = start_requests(url)
result = parse(text)
write_json(result)
if __name__ == '__main__':
main()
接下来我们需要根据这段代码进行改进。
多页爬取结构url
上一篇文章 我们改进了爬取一页的爬虫代码。现在我们需要抓取 10 个页面上 250 部电影的信息。爬取多个页面的信息一般有两种方式。一种是构造一个url。, 一个是翻页,这一节我们讲如何构造url。
我们可以直接看到这些页面的链接规则
第一页 https://movie.douban.com/top250
第二页 https://movie.douban.com/top250?start=25&filter=
第三页 https://movie.douban.com/top250?start=50&filter=
第四页 https://movie.douban.com/top250?start=75&filter=
可以发现,除了第一页,后面只有一个数字变了,是一个等差数列。那么我们就可以猜测第一页是不是这样的
https://movie.douban.com/top250?start=0&filter=
在浏览器中输入这个链接,发现其实是第一页,于是我们就可以按照这个规则构造url字符串了。只需一个循环即可获取 250 部电影。我们仍然只抓取标题并打印出来
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
def start_requests(url):
r = requests.get(url)
return r.content
def parse(text):
soup = BeautifulSoup(text, 'html.parser')
movie_list = soup.find_all('div', class_ = 'item')
for movie in movie_list:
print(movie.find('span', class_ = 'title').text)
def main():
for i in range(10):
url = 'https://movie.douban.com/top250?start={}&filter='.format(i * 25)
text = start_requests(url)
parse(text)
if __name__ == '__main__':
main()
接下来,我们需要抓取多个字段并将它们存储在一个 json 文件中。这时候我们需要将多页电影信息放在一个列表中,并保存为文件。(注意代码中的注释)
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
import json
def start_requests(url):
r = requests.get(url)
return r.content
def parse(text):
soup = BeautifulSoup(text, 'html.parser')
movie_list = soup.find_all('div', class_ = 'item')
for movie in movie_list:
mydict = {}
mydict['title'] = movie.find('span', class_ = 'title').text
mydict['score'] = movie.find('span', class_ = 'rating_num').text
quote = movie.find('span', class_ = 'inq')
mydict['quote'] = quote.text if quote else None # 抓取10页就总会遇到这种特殊情况要处理
star = movie.find('div', class_ = 'star')
mydict['comment_num'] = star.find_all('span')[-1].text[:-3]
result_list.append(mydict) # 向全局变量result_list中加入元素
def write_json(result):
s = json.dumps(result, indent = 4, ensure_ascii=False)
with open('movies.json', 'w', encoding = 'utf-8') as f:
f.write(s)
def main():
for i in range(10):
url = 'https://movie.douban.com/top250?start={}&filter='.format(i * 25)
text = start_requests(url)
parse(text)
write_json(result_list) # 所有电影都存进去之后一起输出到文件
if __name__ == '__main__':
# 初始化,注意不要在main()函数里定义,因为那里不是全局变量,其他函数无法调用
result_list = []
main()
多页爬取的翻页
翻页的原理是在爬取一页信息的同时,也爬取下一页的URL,再爬取爬取的URL。这种方法适用于带有“Next Page”标签的网站,一般用于无法构造网页URL的情况。