一、网络爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序。

爬虫的基本流程:

  • 发起请求:

通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应

  • 获取响应内容:

如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型

  • 解析内容:

得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理

  • 保存数据:

保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件

二、准备

准备安装以下三个库:

1、urllib库

Urllib是python内置的标准库模块,使用它可以像访问本地文本文件一样读取网页的内容。Python的Urllib库模块包括以下四个模块:

  • urllib.request 请求模块

  • urllib.error 异常处理模块

  • urllib.parse url解析模块

  • urllib.robotparser解析模块

2、urllib.request模块的常用方法

基本使用步骤:

(1)导入urllib.request模块

  1. from urllib import request

(2)连接要访问的网站,发起请求

  1. resp = request.urlopen("http://网站IP地址")

(3)获取网站代码信息

  1. print(resp.read().decode())

3、BeautifulSoup模块

(1)BeautifulSoup模块的基本元素

(2)标签树

在解析网页文档的过程中,需要应用BeautifulSoup模块对HTML内容进行遍历。

设有如下的一个HTML文档:

  1. <html>
  2. <head>
  3. ....
  4. </head>
  5. <body>
  6.      <p class="title"> The demo Python Project.</p>
  7.      <p class="course"> Python is a programming language.
  8.          <a href="http://www.icourse163.com"> Basic Python </a>
  9.    <a href="http:..www.python.org"> Advanced Python </a>
  10. </p>
  11. </body>
  12. </html>

(3)BeautifulSoup模块对象“标签树”的上行遍历属性

(4)BeautifulSoup模块对象“标签树”的下行遍历属性

(5)BeautifulSoup模块对象的信息提取方法

三、入门练习

1、抓取湖北师范大学网站基本信息

  1. import urllib.request
  2. response=urllib.request.urlopen("http://www.hbnu.edu.cn/")
  3. print(response.info())
  4. print('\n*************************************************************\n')
  5. print(response.getcode())
  6. print('\n*************************************************************\n')
  7. print(response.read())

2、爬取最好大学网站的大学排名榜

  1. import bs4
  2. from urllib import request
  3. from bs4 import BeautifulSoup
  4. def getHTMLText(url):
  5. '''获取页面'''
  6. try:
  7. resp = request.urlopen(url)
  8. html_data = resp.read().decode('utf-8')
  9. return html_data
  10. except:
  11. return ""
  12. def fillUnivList(ulist, html):
  13. '''处理页面'''
  14. soup = BeautifulSoup(html, "html.parser")
  15. for tr in soup.find('tbody').children: # 找到关键词'tbody'后,搜索'td'子项
  16. if isinstance(tr, bs4.element.Tag):
  17. tds = tr('td')
  18. ulist.append([tds[0].string, tds[1].string, tds[3].string])
  19. def printUnivList(ulist, num):
  20. '''格式输出页面'''
  21. tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
  22. print(tplt.format("排名", "学校名称", "学校类型", chr(12288)))
  23. for i in range(num):
  24. u = ulist[i]
  25. print(tplt.format(u[0], u[1], u[2], chr(12288)))
  26. if __name__ == '__main__':
  27. uinfo = []
  28. url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2020.html' # 2020年
  29. html = getHTMLText(url)
  30. fillUnivList(uinfo, html)
  31. printUnivList(uinfo, 20) # 输出20个大学排名 

3、爬取网络版小说《红楼梦》

爬取某网站的网络版小说《红楼梦》。打开《红楼梦》小说的目录页面会如图所示。

运用F12,找对应章节的位置

首先爬取对应章节的网址:

  1. from urllib import request
  2. from bs4 import BeautifulSoup
  3. if __name__ == '__main__':
  4. # 目录页
  5. url = 'http://www.136book.com/hongloumeng/'
  6. head = {}
  7. head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
  8. req = request.Request(url, headers = head)
  9. response = request.urlopen(req)
  10. html = response.read()
  11. # 解析目录页
  12. soup = BeautifulSoup(html, 'lxml')
  13. # find_next找到第二个<div>
  14. soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
  15. # 遍历ol的子节点,打印出章节标题和对应的链接地址
  16. for link in soup_texts.ol.children:
  17. if link != '\n':
  18. print(link.text + ': ', link.a.get('href'))

爬取每一章节的内容:

  1. from urllib import request
  2. from bs4 import BeautifulSoup
  3. if __name__ == '__main__':
  4. # 第1章的网址
  5. url = 'http://www.136book.com/hongloumeng/qlxecbzt/'
  6. head = {}
  7. # 使用代理
  8. #head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
  9. req = request.Request(url, headers = head)
  10. response = request.urlopen(req)
  11. html = response.read()
  12. # 创建request对象
  13. soup = BeautifulSoup(html, 'lxml')
  14. # 找出div中的内容
  15. soup_text = soup.find('div', id = 'content')
  16. # 输出其中的文本
  17. print(soup_text.text)

当然如此显示会很不好看,我们去试一下生成一本《红楼梦》.txt,默认存在我的D盘

  1. from urllib import request
  2. from bs4 import BeautifulSoup
  3. if __name__ == '__main__':
  4. url = 'http://www.136book.com/hongloumeng/'
  5. head = {}
  6. req = request.Request(url, headers = head)
  7. response = request.urlopen(req)
  8. html = response.read()
  9. soup = BeautifulSoup(html, 'lxml')
  10. soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
  11. # 打开文件
  12. f = open('D:\hongloumeng.txt','w')
  13. # 循环解析链接地址
  14. for link in soup_texts.ol.children:
  15. if link != '\n':
  16. download_url = link.a.get('href')
  17. download_req = request.Request(download_url, headers = head)
  18. download_response = request.urlopen(download_req)
  19. download_html = download_response.read()
  20. download_soup = BeautifulSoup(download_html, 'lxml')
  21. download_soup_texts = download_soup.find('div', id = 'content')
  22. # 抓取其中文本
  23. download_soup_texts = download_soup_texts.text
  24. # 写入章节标题
  25. f.write(link.text + '\n\n')
  26. # 写入章节内容
  27. f.write(download_soup_texts)
  28. f.write('\n\n')
  29. f.close()

感悟:效果很不错,以后看小说不愁没资源了,自行爬取txt导入手机免费看(也可以复制粘贴到word自动分行),当然之前还在52pj看过爬妹子图,乐趣无穷。

Python网络爬虫实战入门的更多相关文章

  1. 关于Python网络爬虫实战笔记③

    Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...

  2. python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...

  3. Python网络爬虫实战(一)快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  4. python网络爬虫实战之快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  5. 关于Python网络爬虫实战笔记①

    python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...

  6. python网络爬虫之入门[一]

    目录 前言 一.探讨什么是python网络爬虫? 二.一个针对于网络传输的抓包工具fiddler 三.学习request模块来爬取第一个网页 * 扩展内容(爬取top250的网页) 后记 @(目录) ...

  7. Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布

    本文实现一个非常有趣的项目,这个项目是关于胸罩销售数据分析的.是网络爬虫和数据分析的综合应用项目.本项目会从天猫抓取胸罩销售数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后通过S ...

  8. Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识

    网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...

  9. Python网络爬虫实战(三)照片定位与B站弹幕

    之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...

随机推荐

  1. 【转载】flag标志什么?哦,它标志代码馊了

    几乎每次在代码中发现flag变量,我总是能嗅到一股馊味.不管你闻没闻到,反正我闻到了. 在代码中,flag通常作为标志变量的名字.但问题在于,不是所有的问题或代码都需要使用这种标志变量,更不是使用标志 ...

  2. CDI 组件拦截器的使用和学习

    拦截器的作用原理: 声明拦截器,加@Interceptor注解 方法有二: 1)为拦截器添加Qualifier: 2)不添加Qualifier.为拦截器添加具体的拦截方法,该方法加@AroundInv ...

  3. regexp 正则表达式

    * 给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false input: 'rattler' output: true function conta ...

  4. spl_autoload_register 实现自动加载

    spl_autoload_register 注册给定的函数作为 __autoload 的实现 bool spl_autoload_register ([ callable $autoload_func ...

  5. vue-cli3 取消eslint 校验代码

    项目生成后会有个.eslintrc.js文件 module.exports = { root: true, env: { node: true }, 'extends': [ 'plugin:vue/ ...

  6. 用Python基本库实现进度条

    用Python基本库实现进度条效果几个要点:1. \r,重置光标2. time.perf_counter,计算运行时间3. 用format控制输出格式 1 #progress bar2 2 #The ...

  7. 51nod1675-序列变换【莫比乌斯反演】

    正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1675 题目大意 给出两个长度为\(n\)的序列\(a,b\),求有多少对 ...

  8. P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】

    除了最后一题都比较简单就写一起了 P4450-双亲数 题目链接:https://www.luogu.com.cn/problem/P4450 题目大意 给出\(A,B,d\)求有多少对\((a,b)\ ...

  9. c#中多线程间的同步

    目录 一.引入 二.Lock 三.Monitor 四.Interlocked 五.Semaphore 六.Event 七.Barrier 八.ReaderWriterLockSlim 九.Mutex ...

  10. Decorator装饰器模式个人理解

    对于装饰器模式,其主要是为了:在不改变本体特征的情况下,对其进行包装.装饰,目的是为了补充.扩展.增强其功能. 有三个原则: 不能改变本体的特征 要对本体的功能进行扩展 装饰器脱离了本体则没有任何含义 ...