提交 932ec3f1 编写于 作者: 南荒北逃's avatar 南荒北逃

更新3. Spider/2.png, 3. Spider/3.png, 3. Spider/4.png, 3. Spider/5.png, 3....

更新3. Spider/2.png, 3. Spider/3.png, 3. Spider/4.png, 3. Spider/5.png, 3. Spider/6.png, 3. Spider/7.png, 3. Spider/8.png, 3. Spider/9.png, 3. Spider/家里蹲.png, 3. Spider/爬.md, 开发者界面.png, 开发者界面2.png, 爬虫.md
上级 1887c090
# 1. 爬虫是什么
## 1.1 百度百科
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
## 1.2 个人理解
通过代码模拟人访问网站,并获取网站中的可用信息,速度远高于人访问网站过程。
爬虫可以代替人完成一些批量操作,如网页文本的下载,网络图片的下载、网络视频的下载……
# 2. 爬虫基础
## 2.1 爬虫的根据——html
HTML是一种标记性语言,通过一系列**标签**统一网页文档格式。
HTML运行在浏览器上,通过浏览器解析出来,产生对应的网页。
一个网页的html代码可以通过:右键——查看网页源代码(或者检查)
自己使用HTML的方式:编写一段HTML放在一个文本文件中,然后将其后缀名改为html或htm,然后双击打开即可。
下面是一个简单的html例子:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>家里蹲(home_squat.com)</title>
</head>
<body>
<h1>标题长这样</h1>
<p>段落长这样</p>
</body>
</html>
```
效果图
![html示意图](家里蹲.png)
## 2.2 爬虫的地点——url
URL简单理解为网页地址,如'www.baidu.com',即我们常见的网址
## 2.3 爬虫的过程
1. 清楚自己要爬的url
2. 了解自己要爬的内容在html中的位置
3. 利用python的相关库调用目的url的html并提取出可用信息并输出到文件
## 2.4 爬一个小说
目标url:http://book.zongheng.com/book/1074259.html
查看html代码(部分):
![1](1.png)
python中有一个requests库,用于网页访问请求
用python获取该网页的html代码:
```py
import requests #爬虫需要访问网站,requests库提供访问网站的渠道
web = 'http://book.zongheng.com/book/1074259.html' #要爬的url
req = requests.get(web) #获取html网页 requests.get(str) str为内容为url的字符串
print(req.text) #req.text为html内容
```
部分运行结果图
![2](2.png)
因为我们要爬的这个小说在阅读时无法左右键单击网页,无法人工直接获取html代码,所以需要通过python来获取:
```py
import requests #爬虫需要访问网站,requests库提供访问网站的渠道
web = 'http://book.zongheng.com/chapter/1074259/63418806.html' #小说第一章
req = requests.get(web) #获取html网页
print(req.text) #req.text为html内容
```
部分运行结果图:
![3](3.png)
在上图中不难找到我们需要的小说正文部分(浓缩成了一行)在:
```html
<div class="content" itemprop="acticleBody">
<p>2009年,古河的夏天炎热无比。</p><p>灼灼烈日之下,一个满身学生气的年轻人蹲在古城的东面的古玩街上摆摊。</p><p>摊子上只有几张黄色纸符,路过的行人匆匆走过,看都不看一眼。</p><p>一脸学生气的年轻...
</div>
```
我们需要的这一章的内容全都在这一个\<div\>标签里面,并且还有**唯一**的匹配标签(通过搜索可以发现)\<itemprop="acticleBody"\>
因为我们需要的内容只在这一段标签里面,所以我们只需要把这一段提取出来就行
这时候我们可以用到另一个强大的工具库BeautifulSoup,这个库可以帮助我们完成对html代码的解析(或者说提取不同的标签):
```py
from bs4 import BeautifulSoup #用于方便地解析html
import requests #爬虫需要访问网站,requests库提供访问网站的渠道
web = 'http://book.zongheng.com/chapter/1074259/63418806.html' #小说第一章
req = requests.get(web) #获取html网页
html = BeautifulSoup(req.text, 'lxml')
#构建一个BeautifulSoup对象, BeautifulSoup(str, itr),参数均为字符串,str为html内容,itr为解释器,通常为lxml
#print(html) 直接输出html得到的结果和req.text一样
body = html.find_all('div', class_ = "content", itemprop = "acticleBody")
#获取所需要的正文部分,find_all(name, attrs),name为标签,attrs为详细参数,可以有若干个,需要用 'A = B'的形式,A为class的时候应写为class_
print(body)
```
输出结果:
![4](4.png)
这样我们把正文部分提取了出来,但是还有2个问题:
- html的标签还没有消除,如\<div\>\<p\>
- 没有换行,阅读及其难受
现在我们需要对html的标签div和p稍微了解:
div定义文档中的区,可以简单理解为一个单元;p定义一个段落
所以我们把所以成对的\<p\>,\</p\>变成换行,就能够解决阅读难受的问题,如果还能把\<div\>标签消除那么就能得到只有文本的字符串
具体实现上面的要求,则需要我们匹配\<p\>\</p\>等标签,我们需要一点正则表达式的知识
### **正则表达式**
正则表达式是一种文本模式,包括普通字符(如a-z)和特殊字符(也称元字符,如? * +),正则表达式既能表达一个具体的字符串,也能表达满足某种规则的字符串
直观的理解:
我们可以用data(\w)?\.dat来匹配data.dat data1.dat datax.dat等
其中\w匹配字母、数字、下划线,()用于将\w作为整体,?表示匹配0或1个,\.中的\用于转义
[**(爬虫)常用特殊字符表:**](https://www.runoob.com/regexp/regexp-metachar.html)
| 字符 | 描述 |
| :--- | :--- |
| \ | 转义字符,使后接特殊字符失去特殊意义 |
| * | 匹配前面的子表达式零次或多次 |
| + | 匹配前面的子表达式1次或多次 |
| ? | 匹配前面的子表达式0或1次 |
| x\|y | 匹配x或y |
| \\n | 换行符 |
| \\w | 匹配字母、数字、下划线 |
| \\s | 匹配空白字符,包括空格、制表符、换页符 |
| \\S | 匹配非空白字符 |
| . | 匹配除换行符外所有字符 |
| \*? | 非贪婪匹配的\*,满足匹配条件下匹配尽量少 |
**关于贪婪匹配与非贪婪匹配:**
模式串:awsl_hhh_yyds_
|| 贪婪匹配 | 非贪婪匹配 |
| :---: | :---: | :---: |
| 正则表达式 | .*_ | .*?_ |
| 匹配结果 | awsl_hhh_yyds_ | awsl_、hhh_、yyds_ |
### **回到正文**
python的re库提供正则表达式的相关功能:
我们知道一个段落的结尾为\</p\>,所以不妨将\</p\>替换为换行符,其他标签均替换为无字符
```py
from bs4 import BeautifulSoup #用于方便地解析html
import re #正则表达式处理库
import requests #爬虫需要访问网站,requests库提供访问网站的渠道
web = 'http://book.zongheng.com/chapter/1074259/63418806.html' #小说第一章
req = requests.get(web) #获取html网页
html = BeautifulSoup(req.text, 'lxml') #构建一个BeautifulSoup对象
body = html.find_all('div', class_ = "content", itemprop = "acticleBody") #获取所需要的正文部分
sub1 = re.sub('</p>', '\n', str(body[0]))
#将</p>替换为换行符,re.sub(pattern, replace, str),参数均为字符串,pattern为要匹配的正则表达式,replace为替代的字符串,str为被操作的字符串
#print(sub1) 这时候结果便有换行效果,但是<p>和<div>还存在,我们需要再一次sub替代掉
sub2 = re.sub('<.*>', '', sub1)
print(sub2)
```
替代效果图:
![5](5.png)
然后我们只要将其输出到文件中就成功爬下这一章的内容了:
```py
from bs4 import BeautifulSoup #用于方便地解析html
import re #正则表达式处理库
import os #文件操作库
import requests #爬虫需要访问网站,requests库提供访问网站的渠道
web = 'http://book.zongheng.com/chapter/1074259/63418806.html' #小说第一章
req = requests.get(web) #获取html网页
html = BeautifulSoup(req.text, 'lxml') #构建一个BeautifulSoup对象
body = html.find_all('div', class_ = "content", itemprop = "acticleBody") #获取所需要的正文部分
sub1 = re.sub('</p>', '\n', str(body[0])) #将</p>替换为换行符
sub2 = re.sub('<.*>', '', sub1) #删除剩余标签
file = open('第1章.txt', 'w') #创建txt文件
file.write(sub2) #将小说第1章内容写入
file.close()
```
在编写的py的同名文件夹下就可以找到:
![6](6.png)
**我们成功懂了如何爬一章,下面通过目录把所有章节爬下来**
目录url:http://book.zongheng.com/showchapter/1074259.html
查看html代码(部分):
![7](7.png)
观察html代码,每一章超链接的标签为\<li class=" col-4"\>,所以爬整本小说的思路如下:
1. 拿到所有的class=" col-4",提取对应的每一章的网址
2. 进入每一章的网址,做爬一章小说的操作
```py
from bs4 import BeautifulSoup #用于方便地解析html
import re #正则表达式处理库
import os #文件操作库
import requests #爬虫需要访问网站,requests库提供访问网站的渠道
catalog_web = 'http://book.zongheng.com/showchapter/1074259.html' #目录url
catalog_req = requests.get(catalog_web) #获取目录网页html
catalog_html = BeautifulSoup(catalog_req.text, 'lxml') #构建目录bs4对象
charpter = catalog_html.find_all('li', class_ = "col-4") #找到每一章的超链接
if os.path.exists('我继承了上古仙尊记忆') == False:
os.mkdir('我继承了上古仙尊记忆')
for each in charpter: #每一条包含超链接的html语段
unit = BeautifulSoup(str(each), 'lxml') #因为charpter中的每个元素each不是bs4对象,所以要新建一个bs4对象
temp = unit.find_all('a')[0] #each中包含多个层次标签,只需保留最小层次包含超链接的标签<a>
title = temp.text #获取章节标题
web = temp.get('href') #获取章节href属性
req = requests.get(web)
html = BeautifulSoup(req.text, 'lxml')
body = html.find_all('div', class_="content", itemprop="acticleBody") #获取所需要的正文部分
sub1 = re.sub('</p>', '\n', str(body[0])) #将</p>替换为换行符
sub2 = re.sub('<.*>', '', sub1) #删除剩余标签
file = open('我继承了上古仙尊记忆\\' + title + '.txt', 'w') #打开文件
file.write(title) #写入标题
file.write(str(sub2)) #写入文章内容
file.close()
```
运行结果:
![8](8.png)
![9](9.png)
**这样最简单的小说爬虫就完成了!**
\ No newline at end of file
[推荐自学资料](https://www.bilibili.com/video/BV16f4y197D6?p=1)
# 0. 爬虫是什么
简单来讲,爬虫就是一个探测机器,它的基本操作就是模拟人的行为去各个网站溜达,点点按钮,查查数据,或者把看到的信息背回来。
# 1. 爬虫能做什么
抓取知乎数据分析知乎用户并做出图谱。
抓取网页云音乐评论做自然语言处理得到人们对不同歌手的评价。
抓取豆瓣电影按评分挑出自己喜欢看
周边租房的房价
网站各种优惠?
知乎上点赞数很高的文章..
快手粉丝数量..
某站的所有图片,电影!!
价值最高的还是用来做商业分析,这也催生了爬虫工程师这个职业。
研究SEO. 就得知道爬虫.
收集大量的代理服务器!!来获得不同的IP 让后刷票什么的!!!!
抓twitter 上亿条的的说说..储存到数据库.更深入的了解数据库
获取某网站所有用户的头像.更具头像被点击的次数.找出最受欢迎的头像
抓取 facebook 上的 sleep关键词. 来判断出大家的睡眠时间..很多人喜欢在睡前会说一声我睡了。
喜欢看美女图片? 写个爬虫把某网站所有的图片都下下来 慢慢看.
喜欢看电影? 写个爬虫把某网站所有种子都下下来,慢慢下载.
喜欢某个妹子? 写个爬虫把她所有说说都下下来研究
喜欢秒杀超值物品 写个爬虫.... 还是脚本 ??
比价网站网站 靠爬虫实现的.
电影推荐网站 靠爬虫实现的.
# 2. 爬虫怎么用
[爬虫之路](https://www.zhihu.com/question/20899988/answer/783269460)
1. 找到待爬取网页的URL
2. 查看网页结构(F12)
3. 在HTML代码中找到你要提取的数据
4. 写代码进行网页请求、解析
5. 存储数据
## 2.1 什么是URL
[2分钟了解URL](https://haokan.baidu.com/v?vid=12014758548923622963&pd=bjh&fr=bjhauthor&type=video)
## 2.2 什么是HTML
(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。
可以简单理解为网页的“骨架”,与其一同出现的还有CSS(衣服)、JavaScript(肌肉)
HTML —— 结构, 决定网页的结构和内容( “是什么”)
CSS —— 表现( 样式) , 设定网页的表现样式( “什么样子”)
JavaScript( JS) —— 行为, 控制网页的行为( “做什么”)
HTML 语言是制作网页的最基本语言, 并且只能通过web浏览器显示出来。
Hyper(超):
用HTML制作的网页可以通过其中的链接从一个网页“跳转”至另一个网页。
Text(文本):
HTML是一种文本解释性的程序语言, 即它的源代码将不经过编译而直接在浏览器中运行时被“翻译”。
Markup(标记):
HTML的基本规则就是用“标记语言” ---- 成对尖括号组成的标签元素来描述网页内容是如何在浏览器中显示的。
## 2.3 什么是API
[通俗易懂的API介绍,但是没有字幕是全英的](https://www.bilibili.com/video/BV1rJ411j7cc?p=1)
Application Programming Interface
是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。
WEB API 中HTTP 请求方式的四个主要方法 (GET, PUT, POST, DELETE)
**GET**
GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.
**HEAD**
HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.
**POST**
POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用.
**PUT**
PUT方法用请求有效载荷替换目标资源的所有当前表示。
**DELETE**
DELETE方法删除指定的资源。
**CONNECT**
CONNECT方法建立一个到由目标资源标识的服务器的隧道。
**OPTIONS**
OPTIONS方法用于描述目标资源的通信选项。
**TRACE**
TRACE方法沿着到目标资源的路径执行一个消息环回测试。
**PATCH**
PATCH方法用于对资源应用部分修改。
## 2.4 F12开发者界面演示
![](开发者界面.png)
几个主要关注的点:Elements、Console、Network
Elements是看网页有什么
Console是对网页写代码进行一些操作
Network看请求方式
![](开发者界面2.png)
## 2.5 小试牛刀:五行实现爬虫
```py
from urllib.request import urlopen
url="http://www.baidu.com"
response=urlopen(url)
info=response.read()
print(info)
```
会发现很乱嗷
```py
from urllib.request import urlopen
url="http://www.baidu.com"
response=urlopen(url)
info=response.read()
print(info.decode())
```
加上一个decode() 是不是好很多了
## 2.6 常见方法举例
```py
request.urlopen(url,data,timeout)
```
data是要送的内容,timeout是最大响应时间(超时时间),两个都不是必须的
```py
response.read()
```
read()读取文件里的全部内容,返回bytes类型
```py
response.getcode()
```
返回HTTP的响应码,成功返回200,服务器页面出错 4,服务器问题5
```py
response.geturl()
```
返回实际数据的实际URL,防止重定向问题
```py
response.info()
```
返回服务器响应的HTTP报头
## 2.7 Request对象
```py
from urllib.request import urlopen
from urllib.request import Request
url='http://www.baidu.com'
request=Request(url)
response=urlopen(request)
info=response.read()
print(info.decode())
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册