php 抓取网页标题(本文文章的续篇爬虫基本原理爬虫爬虫代码改进(一))
优采云 发布时间: 2022-01-21 05:21php 抓取网页标题(本文文章的续篇爬虫基本原理爬虫爬虫代码改进(一))
本文是以下两篇文章的续篇
爬行动物的基本原理
爬虫代码改进(一)
这个系列包括以下
这篇文章主要讲
上一篇文章我们定义一个函数来抓取豆瓣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时使用。