Python网络爬虫实战入门
一、网络爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序。
爬虫的基本流程:
- 发起请求:
通过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模块
from urllib import request
(2)连接要访问的网站,发起请求
resp = request.urlopen("http://网站IP地址")
(3)获取网站代码信息
print(resp.read().decode())
3、BeautifulSoup模块
(1)BeautifulSoup模块的基本元素

(2)标签树
在解析网页文档的过程中,需要应用BeautifulSoup模块对HTML内容进行遍历。
设有如下的一个HTML文档:
<html>
<head>
....
</head>
<body>
<p class="title"> The demo Python Project.</p>
<p class="course"> Python is a programming language.
<a href="http://www.icourse163.com"> Basic Python </a>
<a href="http:..www.python.org"> Advanced Python </a>
</p>
</body>
</html>

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

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

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

三、入门练习
1、抓取湖北师范大学网站基本信息
import urllib.request
response=urllib.request.urlopen("http://www.hbnu.edu.cn/")
print(response.info())
print('\n*************************************************************\n')
print(response.getcode())
print('\n*************************************************************\n')
print(response.read())

2、爬取最好大学网站的大学排名榜
import bs4
from urllib import request
from bs4 import BeautifulSoup
def getHTMLText(url):
'''获取页面'''
try:
resp = request.urlopen(url)
html_data = resp.read().decode('utf-8')
return html_data
except:
return ""
def fillUnivList(ulist, html):
'''处理页面'''
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children: # 找到关键词'tbody'后,搜索'td'子项
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num):
'''格式输出页面'''
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名", "学校名称", "学校类型", chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
if __name__ == '__main__':
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2020.html' # 2020年
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 输出20个大学排名

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

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

首先爬取对应章节的网址:
from urllib import request
from bs4 import BeautifulSoup
if __name__ == '__main__':
# 目录页
url = 'http://www.136book.com/hongloumeng/'
head = {}
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'
req = request.Request(url, headers = head)
response = request.urlopen(req)
html = response.read()
# 解析目录页
soup = BeautifulSoup(html, 'lxml')
# find_next找到第二个<div>
soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
# 遍历ol的子节点,打印出章节标题和对应的链接地址
for link in soup_texts.ol.children:
if link != '\n':
print(link.text + ': ', link.a.get('href'))

爬取每一章节的内容:
from urllib import request
from bs4 import BeautifulSoup
if __name__ == '__main__':
# 第1章的网址
url = 'http://www.136book.com/hongloumeng/qlxecbzt/'
head = {}
# 使用代理
#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'
req = request.Request(url, headers = head)
response = request.urlopen(req)
html = response.read()
# 创建request对象
soup = BeautifulSoup(html, 'lxml')
# 找出div中的内容
soup_text = soup.find('div', id = 'content')
# 输出其中的文本
print(soup_text.text)

当然如此显示会很不好看,我们去试一下生成一本《红楼梦》.txt,默认存在我的D盘
from urllib import request
from bs4 import BeautifulSoup
if __name__ == '__main__':
url = 'http://www.136book.com/hongloumeng/'
head = {}
req = request.Request(url, headers = head)
response = request.urlopen(req)
html = response.read()
soup = BeautifulSoup(html, 'lxml')
soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
# 打开文件
f = open('D:\hongloumeng.txt','w')
# 循环解析链接地址
for link in soup_texts.ol.children:
if link != '\n':
download_url = link.a.get('href')
download_req = request.Request(download_url, headers = head)
download_response = request.urlopen(download_req)
download_html = download_response.read()
download_soup = BeautifulSoup(download_html, 'lxml')
download_soup_texts = download_soup.find('div', id = 'content')
# 抓取其中文本
download_soup_texts = download_soup_texts.text
# 写入章节标题
f.write(link.text + '\n\n')
# 写入章节内容
f.write(download_soup_texts)
f.write('\n\n')
f.close()

感悟:效果很不错,以后看小说不愁没资源了,自行爬取txt导入手机免费看(也可以复制粘贴到word自动分行),当然之前还在52pj看过爬妹子图,乐趣无穷。
Python网络爬虫实战入门的更多相关文章
- 关于Python网络爬虫实战笔记③
Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...
- python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...
- Python网络爬虫实战(一)快速入门
本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...
- python网络爬虫实战之快速入门
本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...
- 关于Python网络爬虫实战笔记①
python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...
- python网络爬虫之入门[一]
目录 前言 一.探讨什么是python网络爬虫? 二.一个针对于网络传输的抓包工具fiddler 三.学习request模块来爬取第一个网页 * 扩展内容(爬取top250的网页) 后记 @(目录) ...
- Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布
本文实现一个非常有趣的项目,这个项目是关于胸罩销售数据分析的.是网络爬虫和数据分析的综合应用项目.本项目会从天猫抓取胸罩销售数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后通过S ...
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...
- Python网络爬虫实战(三)照片定位与B站弹幕
之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...
随机推荐
- 数据库实验sql代码 myemployees 以及mygirl
/* Navicat Premium Data Transfer Source Server : mysql Source Server Type : MySQL Source Server Vers ...
- 忘记root密码的情况下如何给指定账户开通远程访问
1.跳过验证使用root登录 net stop mysql //停止MYSQL服务 打开第一个cmd窗口,切换到mysql的bin目录,运行命令: mysqld --defaults-file=&qu ...
- ThinkCMF5.1主要特性
更改框架协议为MIT,让你更自由地飞 基于ThinkPHP 5.1重构,但核心代码兼容5.0版本,保证老用户最小升级成本 增加对swoole支持,同时支持swoole协程和全同步模式(请单独安装扩展) ...
- AS插件快速生成javabean
https://blog.csdn.net/u010227042/article/details/103803198
- Java基础系列(23)- 打印九九乘法表
package struct; public class ForDemo03 { public static void main(String[] args) { for (int line = 1; ...
- Jenkins持续交付实战演练
jenkins web hook机制 运行jenkins任务触发方式: 主动运行 定时构建 就算代码库没有更新,也会构建. 通过代码库主动触发Jenkins的构建任务 jenkins向外暴露一个触发器 ...
- The Data Way Vol.5|这里有一场资本与开源的 battle
关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...
- 初步认识HCIA,什么是计算机网络,拓扑,网络的发展,交换机,路由器,IP,光纤,带宽,广播,ARP......
HCIA ---- 华为认证初级网络工程师 云技术 --- 云存储 云计算 计算机技术 : --- 抽象语言 -- 电线号的转换 抽象语言 -- 编码 ---- 应用层 编码 --- 二进制 -- ...
- THUSC & 中考 & NOI 拉跨记
THUSC 的拉胯记 时代比较久远了,可能有些事情记不清楚了. Day -\(\infty\) 本来说只有我.llsw.wxk过了审核,后来wy.lyc也搞了个体验营名额,于是和高二的一起集训. Da ...
- CTF入门记录(1
(https://ctf-wiki.org) 00 基础了解 CTF简介 (wolai.com) 00-1 CTF题目类型 Web 大部分情况下和网.Web.HTTP等相关技能有关. Web攻防的一些 ...