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