网页数据抓取(本文文章的续篇爬虫基本原理爬虫爬虫代码改进(一))

优采云 发布时间: 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的情况。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线