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

本系列包括如下内容抓取豆瓣top250一页多个字段

整合成列表

存储为json文件

定义成函数形式

多页抓取之构造url

多页抓取之翻页

抓取二级页面数据

通过生成器优化代码

改写为类的形式

本文主要讲多页抓取之构造url

多页抓取之翻页

抓取二级页面数据

上一篇文章我们定义函数,抓取豆瓣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文件中,这时,我们就要把多页的电影信息放在一个list里,再保存为文件。(注意代码中的注释)

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无法构造的时候才用这种方法。

用这种方法要注意对有无下一页进行判断

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中加入元素

nextpage = soup.find('span', class_ = 'next').a # 找到“下一页”位置

if nextpage:# 找到的就再解析,没找到说明是最后一页,递归函数parse就运行结束

nexturl = baseurl + nextpage['href']

text = start_requests(nexturl) # 多次使用这个函数,可以看出定义函数的好处,当请求更复杂的时候好处更明显

parse(text)

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():

text = start_requests(baseurl)

parse(text)

write_json(result_list) # 所有电影都存进去之后一起输出到文件

if __name__ == '__main__':

baseurl = 'https://movie.douban.com/top250'

result_list = []

main()

抓取二级页面数据

我们通常称这种列表形式的页面为一级页面,而这种每个对象单独的页面为二级页面。前面文章我们只是从一级页面中提取信息,但是一级页面展示的信息毕竟有限,因此我们有时候需要进入每个对象自己的页面去抓取更多信息。

下面我们抓取2页(50)个电影的详情页,因为2页和10页代码上没什么差异,而10页的话就要访问网站两百多次,可能爬虫会被封掉,这个问题不属于本文的研究范围,因此我们先避过,只爬两页。

我们抓取标题、上映时间、电影时长三个指标。

代码逻辑是,抓取每个电影的链接,再对每个链接进行请求,解析每个电影详情页获取数据

代码如下

import requests # 导入网页请求库

from bs4 import BeautifulSoup # 导入网页解析库

import json

# 发起请求

def start_requests(url):

print(url) # 用这条命令知道当前在抓取哪个链接,如果发生错误便于调试

r = requests.get(url)

return r.content

# 解析一级网页,获取url列表

def get_page(text):

soup = BeautifulSoup(text, 'html.parser')

movies = soup.find_all('div', class_ = 'info')

pages = []

for movie in movies:

url = movie.find('div', class_ = 'hd').a['href']

pages.append(url)

return pages

# 解析二级网页,获取信息

def parse_page(text):

soup = BeautifulSoup(text, 'html.parser')

mydict = {}

mydict['title'] = soup.find('span', property = 'v:itemreviewed').text

mydict['duration'] = soup.find('span', property = 'v:runtime').text

mydict['time'] = soup.find('span', property = 'v:initialReleaseDate').text

return mydict

# 将数据读取到json文件中

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(7, 9):

url = 'https://movie.douban.com/top250?start={}&filter='.format(i * 25)

text = start_requests(url)

pageurls = get_page(text) # 解析一级页面

for pageurl in pageurls: # 解析二级页面

page = start_requests(pageurl)

mydict = parse_page(page)

result_list.append(mydict)

write_json(result_list) # 所有电影都存进去之后一起输出到文件

if __name__ == '__main__':

result_list = []

main()

上面代码经常定义一些全局变量,感觉代码设计上会有一些不优雅,下一篇文章通过定义生成器和类来解决这种问题

专栏信息

专栏目录:目录

python爬取二级页面_爬虫代码改进(二)|多页抓取与二级页面相关推荐

  1. 爬虫练习(二)—股票信息抓取

    爬虫练习(二)-股票信息抓取 1 思路 1.首先需要找到一个将股票信息存放在html上的股票网站 2.因为每一个股票都是一个独立的页面,所以在抓取时,首先要了解每个股票网址的规律(网址最后结尾都是股票 ...

  2. python爬去百度图片_爬虫篇| 爬取百度图片(一)

    什么是爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模 ...

  3. python爬取网页url_Python网络爬虫之利用urllib2通过URL抓取网页内容

    所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源. 一.通 ...

  4. Python爬虫实战(二):抓取京东苹果手机评价

    目录 1. 网站分析 2. 示例代码 3. 注意事项 1. 网站分析 本文实现的爬虫是抓取京东商城指定苹果手机的评论信息.使用 requests 抓取手机评论 API 信息,然后通过 json 模块的 ...

  5. 系统检测到您正在使用网页抓取工具访问_造成Baiduspider(百度蜘蛛)抓取网站异常的原因有哪些...

    造成Baiduspider(百度蜘蛛)抓取网站异常的原因有哪些 有一些网页,内容优质,用户也可以正常访问,但是Baiduspider却无法正常访问并抓取,造成搜索结果覆盖率缺失,对百度搜索引擎对站点都 ...

  6. python爬取微博内容_Python 爬虫如何机器登录新浪微博并抓取内容?

    最近为了做事件分析写了一些微博的爬虫,两个大V总共爬了超70W的微博数据. 官方提供的api有爬取数量上限2000,想爬取的数据大了就不够用了... 果断撸起袖子自己动手!先简单说一下我的思路: 一. ...

  7. python爬取新浪微博数据中心_Python爬虫框架Scrapy实战之批量抓取招聘信息

    网络爬虫抓取特定网站网页的html数据,但是一个网站有上千上万条数据,我们不可能知道网站网页的url地址,所以,要有个技巧去抓取网站的所有html页面.Scrapy是纯Python实现的爬虫框架,用户 ...

  8. python爬取图片全网通_荣耀20 PRO现货发售 华为官方解析何为Python爬虫

    荣耀20 PRO现货发售 华为官方解析何为Python爬虫 2019-07-08 10:51:56 0点赞 1收藏 0评论 7月8日,荣耀手机官微宣布,荣耀20 PRO现已全面开放购.荣耀20 PRO ...

  9. Python爬虫实战:手机APP数据抓取分析!谁说不能爬取app数据的?

    大多数手机APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,使用python抓取超级课程表里用户发的话题.主要是练习python爬取app的一些方式和技巧. 1. ...

最新文章

  1. 实操笔记:为 NSQ 配置监控服务的心路历程
  2. sql 简单加密函数
  3. sublime安装与使用
  4. [2013.8.29]对于多线程编程的几点个人见解
  5. 原生安卓10怎么打开面部识别_《原创》安卓系统手机只需一步立即提速翻倍,越久的手机越见效...
  6. Cesium Terrain Builder 非压缩瓦片
  7. web developer tips (18):从工具箱粘贴或拖拽控件时进行绝对定位
  8. 解决Xshell连接linux失败的问题
  9. html桌面插件,纯JS和CSS3炫酷桌面便签贴纸特效插件
  10. 免费php文件加密软件,php源码加密 在线加密工具
  11. swift plm物料管理模块中的变更管理介绍
  12. 推荐一本老外给初学者学习ABAP的书籍,2012年12月上市。
  13. 蒙特卡洛_蒙特卡洛辍学
  14. 操作系统——进程管理思维导图(一)
  15. 转 主流蓝牙BLE控制芯片详解(5):Dialog DA14580
  16. php程序员如何写简历
  17. win7无法安装gpt、mbr问题
  18. linux md5sum 的用法
  19. 嵌入式 Linux LED 驱动开发实验
  20. linux内核崩溃+grub,Linux内核崩溃信息分析

热门文章

  1. 如何打造千万级Feed流系统
  2. 用Shader Graph的Flipbook节点实现水花效果
  3. springcloud微服务项目解析与服务拆分
  4. 人工智能课程走入高中课堂
  5. android菜单_Android菜单简介
  6. springboot 页面静态化
  7. 时代中国三年“老去” 岑钊雄500强空梦一场
  8. 小白终是踏上了这条不归路----小文的mysql学习笔记(22)--------函数
  9. 增量式旋转编码器工作原理
  10. 【P28】Enjoy The jFET 超简分立耳放