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

优采云 发布时间: 2022-01-21 05:21

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

  本文是以下两篇文章的续篇

  爬行动物的基本原理

  爬虫代码改进(一)

  这个系列包括以下

  这篇文章主要讲

  上一篇文章我们定义一个函数来抓取豆瓣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。该方法适用于带有“下一页”标签的网站,一般在无法构造网页url时使用。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线