数学建模社区-数学中国
标题:
教你如何编写第一个简单的爬虫
[打印本页]
作者:
杨利霞
时间:
2020-4-13 16:23
标题:
教你如何编写第一个简单的爬虫
教你如何编写第一个简单的爬虫
4 `% Z. |( u( I7 P1 J- ^' z8 ?4 A
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。
/ d& T5 g2 j3 L7 c- O
1 N% P7 p, o% [6 Y& `) p- n
下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。
0 M( Y9 {* @5 Q# U/ S
: J2 ^4 x$ U$ | t" W, R8 F! z6 U
第一步:获取页面
! n% k) p+ c7 f4 V% V
" v! B0 M* p6 Y
#!/usr/bin/python
8 }0 r4 m* B- ~
# coding: utf-8
3 k9 v8 g5 `9 Z4 F& g& h
' X/ n* Y2 G" a8 ?! ?/ }& e; O
import requests #引入包requests
- k0 H0 W2 _8 r6 L" B
link = "http://www.santostang.com/" #定义link为目标网页地址
8 @7 M [) \# Y/ [2 @* K
# 定义请求头的浏览器代理,伪装成浏览器
$ V5 `" b6 @+ {% }8 j
headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
: W8 E) V# t6 P
$ ~; b9 y5 C' K, a3 ]6 J7 Y6 r
r = requests.get(link, headers= headers) #请求网页
/ n& C9 _/ M' T/ Z
print (r.text) #r.text是获取的网页内容代码
: W8 J: \0 `8 H
1
# ]/ \0 W; p1 H" o
2
3 M- N: A" s, u r7 e! _. Y. C8 X% }
3
% \& d0 C7 G4 Z6 ?5 S! h6 X$ | v
4
; H) R$ B+ \! w& f3 t+ I
5
0 @8 {. b! @/ ?6 [+ i2 Y0 o
6
+ ?. I6 ~$ x4 v* |% }
7
1 [6 D: {7 M' e0 N" t( z
8
0 W2 K" P+ M: P& G \$ w3 o8 n
9
! k' P& H2 D; _1 f: }! u
10
* Y' W1 H+ l8 s4 L" j3 B
上述代码就能获取博客首页的HTML代码,HTML是用来描述网页的一种语言,也就是说网页呈现的内容背后都是HTML代码。如果你对HTML不熟悉的话,可以先去w3school(http://www.w3school.com.cn/html/index.asp)学习一下,大概花上几个小时就可以了解HTML。
: c0 u t! R) c- S$ ~3 N5 f
2 u+ `/ P8 Y& f0 o* }! l
在上述代码中,首先import requests引入包requests,之后获取网页。
( m, K7 Z- o2 k# S$ g
$ l& r) `! r% n3 B
(1)首先定义link为目标网页地址。
8 {7 N7 ~% s" r0 O
7 }8 {) r& T, m* r$ ^% U. j
(2)之后用headers来定义请求头的浏览器代理,进行伪装
. R% [% P. x0 r. k7 w- a
' p' Z% U* x, z n
(3)r是requests的Response回复对象,我们从中可以获取想要的信息。r.text是获取的网页内容代码。
' t* b$ a$ T* V; ]3 P) k
( i1 w+ n. E+ O
运行上述代码得到的结果如图所示。
% h2 ?9 ^: a: ^3 N. _8 b N7 L
; ~2 q* ~3 G: |" D; d
1 l7 Y) ?, r/ P1 w$ V9 z
第二步:提取需要的数据
6 u- M+ B* y( v+ T# L. j: S
% ]0 h& M# `/ `7 Z7 B" h
#!/usr/bin/python
0 B2 L p0 D. X7 q( O% B
# coding: utf-8
0 Q, W7 | x3 l; j" k3 _
' f+ `% R- H4 k H% N% {6 A, g
import requests
1 B. k, D/ l- I. N
from bs4 import BeautifulSoup #从bs4这个库中导入BeautifulSoup
u* k& D/ v+ R" A# E! a" N
; h' g' w+ F- l4 J9 \
link = "http://www.santostang.com/"
7 j& ^- T# B8 U; u4 a+ e6 l
headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
" K. J$ i/ K- Y+ O+ r, @
r = requests.get(link, headers= headers)
* e# ] i( _, g3 V4 B8 S2 z, {# Q0 G
- E( c; c" G- \+ \7 ]
soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析
- u/ Q( L/ u2 W& R4 _) R7 [5 |' @
$ q( O# `* j. v. T5 c; h6 a( X
#找到第一篇文章标题,定位到class是"post-title"的h1元素,提取a,提取a里面的字符串,strip()去除左右空格
9 ?& }. T: q! u( d5 v+ }& Z0 o- r
title = soup.find("h1", class_="post-title").a.text.strip()
( J" ]7 ~. g$ Q( q. H$ L- L
print (title)
. t4 {: v% Y# ?5 i: L
1
# R" p' t" p' D8 z
2
) u" C& L! s' @7 Y+ Q4 I
3
0 ^& G6 M% t" Q* S$ r" b1 T
4
) f8 `+ L3 s" G. ]4 D
5
* x' s5 L: E2 @# _2 ]
6
4 G; O! s+ h1 f/ X- D; E% a6 I0 [
7
7 o8 \* s) W- h2 g
8
" p4 c3 W6 \$ j
9
4 \3 M8 S, j* o& ]3 f8 r: ~
10
- ~! ]# F) h9 ~
11
% E; g$ d- D! A. V" o3 \ `/ A
12
% B" z" p5 N" l& h
13
# _8 a/ \, U. e8 b0 G) @3 C# p
14
% A0 j! p( Z4 ?" \3 ~
15
5 J! c7 S+ }: r7 M- @' G6 w
在获取整个页面的HTML代码后,我们需要从整个网页中提取第一篇文章的标题。
. `/ ^$ O6 Q0 c- @# _. x% U" H$ N) C
6 z5 O( z( j; s& X6 [& v6 ?
这里用到BeautifulSoup这个库对页面进行解析,BeautifulSoup将会在第4章进行详细讲解。首先需要导入这个库,然后把HTML代码转化为soup对象,接下来用soup.find(“h1”,class_=“post-title”).a.text.strip()得到第一篇文章的标题,并且打印出来
0 [/ z c# q$ d& v
- J9 ]' x, ^ I' K
soup.find(“h1”,class_=“post-title”).a.text.strip()的意思是,找到第一篇文章标题,定位到class是"post-title"的h1元素,提取a元素,提取a元素里面的字符串,strip()去除左右空格。
* a& x7 E& a( ~/ G* R: f7 `0 `
6 D2 ~0 c2 \/ R. T4 e
对初学者来说,使用BeautifulSoup从网页中提取需要的数据更加简单易用。
/ k2 C, u s$ D% Z a
$ ]! ]) Q. q% f& V+ U
那么,我们怎么从那么长的代码中准确找到标题的位置呢?
- r6 P* n; y" I, K% f
- c" u) L2 R ] P8 ?1 t
这里就要隆重介绍Chrome浏览器的“检查(审查元素)”功能了。下面介绍找到需要元素的步骤。
8 Y5 G- i# e( E6 E$ d3 M
) ^' T2 \2 H3 E) ^# l
步骤01 使用Chrome浏览器打开博客首页www.santostang.com。右击网页页面,在弹出的快捷菜单中单击“检查”命令,如图2-17所示。
0 v8 e5 L x& o$ r9 {
x, w! x3 Q4 Y0 a
- B4 B3 w3 M N1 a3 v
0 d$ E- R& d% z/ E
步骤02 出现如图2-18所示的审查元素页面。单击左上角的鼠标键按钮,然后在页面上单击想要的数据,下面的Elements会出现相应的code所在的地方,就定位到想要的元素了。
7 ]8 t( A6 ]5 @. A/ z
" O5 n1 g, h+ E4 k* @) g2 M
, n0 e* [1 B' J( f
6 Y# G W2 Z7 H C2 N, o
图2-18 审查元素页面
8 E& v& b& p/ E9 s0 `. o
步骤03 在代码中找到标蓝色的地方,为
/ l" ^6 l W' F, J
$ P% b2 N* {7 `7 F1 Z! b! H& _7 [4 h
echarts学习笔记(2)–同一页面多图表。我们可以用soup.find("h1",class_="post-title").a.text.strip()提取该博文的标题。
+ S0 `2 c5 g% \& V) K
! Y% ~0 J _; Q: a3 d
第三步:存储数据
; j& S) q7 p+ p6 |; F, B0 Q* T
( n; s, R. s& A; T% d
import requests
! E1 |+ ]" h. C1 G" z" N
from bs4 import BeautifulSoup #从bs4这个库中导入BeautifulSoup
) K/ }+ [6 B8 J
$ d5 j- x8 |4 i, V, b
link = "http://www.santostang.com/"
. k( B9 u- p7 b; H0 `, w( s
headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
, M9 q% P2 |0 M1 L. e
r = requests.get(link, headers= headers)
8 f" J' o0 s+ r8 g) q% t: W; U
7 j' y6 V$ l6 y/ H- R6 X: `
soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析
9 X4 Z9 @) z5 O! z/ I. W
title = soup.find("h1", class_="post-title").a.text.strip()
4 V: O3 D! w0 \
print (title)
0 e9 K& \! T) N5 v# Y6 J
7 `. n( C- b8 v* ~
# 打开一个空白的txt,然后使用f.write写入刚刚的字符串title
0 _( { Y8 T/ F- v" k5 Y
with open('title_test.txt', "a+") as f:
& @; y6 g- L8 I( M, B
f.write(title)
J/ W% r$ I4 x8 u2 B
1
/ H9 v$ W+ E# B+ Q8 {3 X9 g/ {
2
, _/ s! t4 H9 `
3
# Z: ]7 d( D/ h* l
4
; j% p% e2 t2 z3 s) I
5
$ x- b9 t+ ~# Q- T+ C8 D" q- P
6
1 d% @" S9 o$ |/ b" g+ F2 b& `# Y7 v: N
7
/ D3 j2 W" `0 @6 x4 J
8
% U4 o# s! w$ V$ T" z; E/ n
9
/ _0 T( {9 F. }
10
# X }4 s' D& I* F J1 n7 Q
11
+ N# J9 C/ ~( c6 u
12
9 ^+ e$ ?' H0 A7 F& w1 C3 J1 Z
13
! p0 m( U; \( k4 a0 P1 R
14
* K! [+ Z {& q
存储到本地的txt文件非常简单,在第二步的基础上加上2行代码就可以把这个字符串保存在text中,并存储到本地。txt文件地址应该和你的Python文件放在同一个文件夹。
7 g( i) Z: J) E
& T4 h' U- e% l$ R0 O3 o9 N6 z
返回文件夹,打开title.txt文件,其中的内容如图2-19所示。
( F7 R( w6 k( ~/ {/ Y. m
* `% r# H+ @2 G8 `9 |8 f& ~
以上内容就是本节要介绍的如何编写一个简单的爬虫的步骤,想要学更多爬虫相关的内容,可以到这本书里查哦《Python网络爬虫从入门到实践(第2版)》
; s6 A/ ^6 j5 W% l
( Z$ {9 M- v* s& u
$ w/ ?7 N H9 P8 Y9 E
目录
# Y7 q/ x: U) U- N$ m! H$ y5 r) N
% q; e& e4 |4 }4 S6 H$ Z0 A" z2 I; k
前言
: T5 z3 `3 G, j& B4 ^
第1章 网络爬虫入门1
* _8 `4 h( i5 K% r8 n
1.1 为什么要学网络爬虫2
# c+ ?8 d# n# \
1.1.1 网络爬虫能带来什么好处2
/ \, c0 }! J; e
1.1.2 能从网络上爬取什么数据3
' f. _: H, ?5 A
1.1.3 应不应该学爬虫3
6 o8 S& t! H' v3 c( O6 Y
1.2 网络爬虫是否合法3
5 A$ O) O7 v' v# C2 v
1.2.1 Robots协议4
1 a4 i6 {9 E$ c* N/ ~
1.2.2 网络爬虫的约束5
6 d5 `+ O6 {; P1 d( U( Z2 O7 ?
1.3 网络爬虫的基本议题6
: a+ b2 f5 p, X2 E3 Y9 F8 V5 t: _3 l
1.3.1 Python爬虫的流程7
2 X& r& D. O' M# h% L
1.3.2 三个流程的技术实现7
* M' a% S+ y5 J1 P' |' }
第2章 编写第一个网络爬虫9
. t. }9 _) O Q( {
2.1 搭建Python平台10
; ?4 M e M" b0 o3 v
2.1.1 Python的安装10
+ c6 }3 L5 u6 @: g7 e; {$ g
2.1.2 使用pip安装第三方库12
# S- P+ j/ N# |7 A
2.1.3 使用编辑器Jupyter 编程13
/ |6 _4 ~: F& b+ ^8 n
2.1.4 使用编辑器Pycharm编程15
( t: }: s+ w& O- h/ E' \
2.2 Python 使用入门18
6 _7 B5 u! V) D+ R5 L4 n3 e
2.2.1 基本命令18
9 `. u, w+ A1 a% I5 K
2.2.2 数据类型19
/ Q) K4 s+ U8 d/ e
2.2.3 条件语句和循环语句21
; J1 p2 Z4 d+ H; k( A1 Y
2.2.4 函数23
# J5 R! M: ~& ~! U
2.2.5 面向对象编程24
& n9 |# Z# e* R. z- R/ U" P8 G8 N
2.2.6 错误处理28
9 \. c+ k, h; K; d+ A
2.3 编写第一个简单的爬虫29
+ Q7 l* M- r+ f$ B- W- S1 ?( c
2.3.1 第一步:获取页面29
/ A0 s" y* a- x: `1 x7 }7 D; C
2.3.2 第二步:提取需要的数据30
# L* _* E- I" r) q# W7 P
2.3.3 第三步:存储数据32
9 r Y; S0 N( ]- S7 f, c! A
2.4 Python实践:基础巩固33
8 d0 h6 z( T8 o6 R
2.4.1 Python基础试题34
. L# J" A$ k! q4 \
2.4.2 参考答案35
3 h0 c+ j( v! e
2.4.3 自我实践题38
0 S# k, M& |" a5 c3 q; R/ N7 W
第3章 静态网页抓取39
! T. U1 x5 D5 {* a" j7 a- G/ X
3.1 安装Requests40
+ O* N) w9 j H, t8 F5 N) g
3.2 获取响应内容40
' W3 g7 {5 L/ J' q# d3 Z
3.3 定制Requests41
+ p4 s! V% u+ J; D! E! }0 ~+ u
3.3.1 传递URL参数41
. L& Y. z) n8 I7 X; t. y
3.3.2 定制请求头42
# R8 r' J3 ?0 i4 v" t
3.3.3 发送POST请求43
/ o/ J# c5 D+ C p+ u7 ]
3.3.4 超时44
1 s3 B; y9 B. m- r ~
3.4 Requests爬虫实践:TOP250电影数据44
& E5 O6 p" r) \* V9 C) }$ Y
3.4.1 网站分析45
$ p3 y6 x- q3 H( t1 n- ^6 ?( M; R
3.4.2 项目实践45
( L k* Q: x9 e k) w
3.4.3 自我实践题47
* c! i+ k( {4 E
第4章 动态网页抓取48
7 l8 L2 h) K3 G1 @4 n1 ]
4.1 动态抓取的实例49
8 Q8 c; b+ l$ T! j
4.2 解析真实地址抓取50
* `. A" | _. t" q7 y8 H
4.3 通过Selenium模拟浏览器抓取55
; _' e$ ~ U- ?
4.3.1 Selenium的安装与基本介绍55
4 C' g. T: a4 X) e/ D
4.3.2 Selenium的实践案例57
4 X+ S+ R) ~' d* ?7 }3 \4 C
4.3.3 Selenium获取文章的所有评论58
+ g( `( M. h# \; z
4.3.4 Selenium的高级操作61
6 _7 o0 E+ J5 b5 ^2 c( c1 @
4.4 Selenium爬虫实践:深圳短租数据64
/ b7 m) i9 F! ~9 R- Z' u
4.4.1 网站分析64
, G- A' B; z! g& _6 j% v
4.4.2 项目实践66
7 P) O* o+ f, [: `" u& j3 \
4.4.3 自我实践题69
" y( V" r6 g* ~1 `3 Z* d2 S" Y
第5章 解析网页70
0 r" T+ s- q1 X7 D
5.1 使用正则表达式解析网页71
# w/ Q& x0 q e& ~ S/ V' J
5.1.1 re.match方法71
6 G$ z* @/ D- y) ?* s/ l) r4 l
5.1.2 re.search方法74
6 ]3 n4 N& s: v
5.1.3 re.findall方法74
3 {- @& G$ G( N' m3 P
5.2 使用BeautifulSoup解析网页76
! r; @! s' o+ t: @: ^# u9 d
5.2.1 BeautifulSoup的安装76
3 D+ [" n) }+ r# i2 e6 c
5.2.2 使用BeautifulSoup获取博客标题77
* J1 Y. }1 E9 l U1 K! U) N
5.2.3 BeautifulSoup的其他功能78
- Q0 o, O% E6 ?3 Q7 y
5.3 使用lxml解析网页82
2 L* X' t+ o7 \& N/ W; C7 t
5.3.1 lxml的安装82
. Y4 w0 ^5 Y8 [ C2 I( F: H8 I/ [
5.3.2 使用lxml获取博客标题82
, `. G$ p$ f0 c x
5.3.3 XPath的选取方法84
0 Z/ X6 E' q5 `: q; L B
5.4 总结85
! R, e* S! u- ]: }/ l: ? b
5.5 BeautifulSoup爬虫实践:房屋价格数据86
% z8 c- J! Z! T& n: u& d) k! I
5.5.1 网站分析86
7 _6 ]/ |$ a$ _: _% o
5.5.2 项目实践87
' q% [: I1 u" p
5.5.3 自我实践题89
0 z* {1 n: J9 ]6 l3 f+ Y9 ~
第6章 数据存储90
* g' v4 S/ F+ Y
6.1 基本存储:存储至TXT或CSV91
4 K" X3 ^# f9 [! ?; K
6.1.1 把数据存储至TXT91
9 g$ G1 c& a. J8 P* {
6.1.2 把数据存储至CSV93
) n) T- B; \! L
6.2 存储至MySQL数据库94
% }: ?: S9 `, ]2 [6 y
6.2.1 下载安装MySQL95
' L( n" w) k* M# O
6.2.2 MySQL的基本操作99
1 Y: L& ~6 U2 v G% G: m
6.2.3 Python操作MySQL数据库104
$ {1 x7 O5 h' h: z9 a
6.3 存储至MongoDB数据库106
+ B; E; F& K( }3 Y
6.3.1 下载安装MongoDB107
- I$ E9 O# d) K7 M. l7 _( z
6.3.2 MongoDB的基本概念110
' @# x! m1 Z2 M5 F( P
6.3.3 Python操作MongoDB数据库112
; H( R- b( r U, Z
6.3.4 RoboMongo的安装与使用113
; I: y4 ?% _" a, l/ R
6.4 总结115
! C, G8 o3 C; J: Z
6.5 MongoDB爬虫实践:虎扑论坛116
% T" a" i0 f2 v D" h, Q8 `" `
6.5.1 网站分析116
4 _6 e/ a# n4 s, o* \3 w
6.5.2 项目实践117
( W# \/ R/ N( ]( J! h4 b# D
6.5.3 自我实践题123
( l/ n4 b& q% x! q; S; D8 s
第7章 Scrapy框架124
* Z- k" k3 N4 T+ H% `" J9 N
7.1 Scrapy是什么125
# A# A: m V! T; m9 _
7.1.1 Scrapy架构125
% Q6 `0 ]$ P; M1 k+ x j
7.1.2 Scrapy数据流(Data Flow)126
- k& c! `0 f, W
7.1.3 选择Scrapy还是Requests+bs4127
% L/ A+ v3 y1 G( z7 }: s& h
7.2 安装Scrapy128
4 L+ }( c9 y- Z) D1 i7 B# d( E2 F. Q4 ?% G
7.3 通过Scrapy抓取博客128
# E6 A" x, L: F* w0 k+ Q
7.3.1 创建一个Scrapy项目128
" f& b' V) V' A% C
7.3.2 获取博客网页并保存129
1 P! d# \5 L! `$ d( b
7.3.3 提取博客标题和链接数据131
5 m6 M9 U# ^& l8 g, ^
7.3.4 存储博客标题和链接数据133
1 |# j- i1 C$ X$ X' r
7.3.5 获取文章内容134
, x" h' ^1 q' H8 `! ]0 Q1 x
7.3.6 Scrapy的设置文件136
% C4 J5 u3 W; V' B/ [! S; m2 ]
7.4 Scrapy爬虫实践:财经新闻数据137
. [& [7 ~6 Y* [6 b2 u( q& e2 |- _
7.4.1 网站分析137
" t; _8 I; c; A2 s+ F% w7 l. r/ x
7.4.2 项目实践138
- a: |, a/ @4 k! s0 E7 F
7.4.3 自我实践题141
. C3 D6 y: u: v% f4 T
第8章 提升爬虫的速度142
+ I; y0 A. z' {! O
8.1 并发和并行,同步和异步143
) M+ U& l0 H: _- _& R1 r, ^
8.1.1 并发和并行143
; D' t+ B" {1 X4 d
8.1.2 同步和异步143
* M4 {1 }$ E: _1 n5 l
8.2 多线程爬虫144
& x4 B( p- l6 L' O
8.2.1 简单的单线程爬虫145
4 B( v0 N" w. ?
8.2.2 学习Python多线程145
6 e8 f1 {8 G7 L9 L, r2 B
8.2.3 简单的多线程爬虫148
/ y! M+ @# ?5 M; y G, T% h; t
8.2.4 使用Queue的多线程爬虫150
8 @; g, Y9 v6 x
8.3 多进程爬虫153
* f M1 R4 Q/ g! _
8.3.1 使用multiprocessing的多进程爬虫153
- S/ N- U* h0 L' T+ E6 C Z+ n
8.3.2 使用Pool + Queue的多进程爬虫155
: g& v6 L! o) Q+ X4 b5 _6 J
8.4 多协程爬虫158
" R" w4 [$ n' x" A* `
8.5 总结160
; R% a/ b! W1 k) h: S% j0 i
第9章 反爬虫问题163
/ P1 ^9 v' g- {& U+ l0 q6 n! H/ m$ C
9.1 为什么会被反爬虫164
4 }+ v' ^2 A& B6 @# j
9.2 反爬虫的方式有哪些164
9 v S, q' g( Z+ }# R* _
9.2.1 不返回网页165
5 w+ m' k. f* E/ z- Q6 Z" T
9.2.2 返回非目标网页165
3 N+ d9 x# l9 S) R& X
9.2.3 获取数据变难166
: H" Z- v$ x, g$ @6 W
9.3 如何“反反爬虫”167
% }- S6 }; g9 P6 V" @
9.3.1 修改请求头167
2 E- v, b% h h5 U* b! x; a2 J
9.3.2 修改爬虫的间隔时间168
+ R3 p w# C! j' a& p
9.3.3 使用代理171
8 D- s2 Z! X$ o( i( T
9.3.4 更换IP地址172
7 U: c8 Y9 l' S6 G, I
9.3.5 登录获取数据172
% Q }8 w& P+ p$ f3 C7 V+ L* I$ o
9.4 总结172
. n, P% s& ]4 b) ~0 K _
第10章 解决中文乱码173
( T7 p: H8 D5 }5 `( j1 K; O
10.1 什么是字符编码174
1 P9 }! o& b. J# ^7 f/ K* g3 ^( s
10.2 Python的字符编码176
, v7 Z1 w* b @ o
10.3 解决中文编码问题179
$ {6 O' L1 A4 }5 Y l4 h1 H/ U, @
10.3.1 问题1:获取网站的中文显示乱码179
% c# C+ G6 C( d- ?# w4 [$ d
10.3.2 问题2:非法字符抛出异常180
$ `6 B0 c$ j; o, e9 N
10.3.3 问题3:网页使用gzip压缩181
1 |5 J. b( q( q8 V
10.3.4 问题4:读写文件的中文乱码182
, _% r# ^1 w7 B" ?+ \
10.4 总结184
2 j, w# d5 b, ~
第11章 登录与验证码处理185
6 [0 J7 s# \* f% ]! K4 P% K6 C
11.1 处理登录表单186
- {8 A' c [1 e
11.1.1 处理登录表单186
" i8 o ], ]" V! r1 E1 e
11.1.2 处理cookies,让网页记住你的登录190
_* p0 o! B/ ~/ C
11.1.3 完整的登录代码193
3 t8 `$ n" F$ {
11.2 验证码的处理194
N5 c1 Y6 y5 w/ |, x! |
11.2.1 如何使用验证码验证195
1 E* W( Q ~1 r9 E
11.2.2 人工方法处理验证码197
9 @1 S8 B+ a, c' j' J2 n. \+ L
11.2.3 OCR处理验证码200
1 M# K# i0 w: E' G; l! B
11.3 总结203
3 L' b& v) z2 r V/ ]* ]3 T4 O
第12章 服务器采集204
' i7 I" H. U6 E2 N
' R# I g: d; q0 w; P
此书已加入到VIP会员卡,只要购买VIP会员卡即可免费阅读上百本电子书,这张VIP卡除了免费让你读书,还有更多的权益等你来领,往下↓拉
9 n1 g% A' `7 u7 y
1 o, `) E/ j- ?3 b2 i7 X
2 Z* S6 H" g* G; F
阅读电子书的方法如下:
3 ?7 J1 M, c/ D4 L, Z
: ~, i" Z9 }8 M
打开CSDN APP(软件商城搜索“CSDN”即可找到哦)—>登录CSDN账号—>学习—>电子书
0 F1 e2 b) x6 v; O7 g" o7 y
1 ~- N; Y$ I6 x* O/ G5 q
$ M+ E) G: U0 N7 P, M( b
————————————————
/ I8 s7 _6 P( `
版权声明:本文为CSDN博主「好书精选」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
4 O; d& Y, B* n* |; z5 Z. m8 M
原文链接:https://blog.csdn.net/weixin_37649168/article/details/104265388
u) x+ P6 c% H, a
2 f K% q# @1 O9 Q {$ p
9 b0 m, O# R- h7 G3 h6 H
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5