仅需一行代码写爬虫–simple_crawl # f! ]3 ^7 N! R2 Msimple_crawl 3 }* A0 r2 V+ h+ _仅需一行代码即可达到爬虫效果 & s0 Z7 n6 K! c* O项目地址(欢迎star):https://github.com/Amiee-well/crawl 8 F& l7 z1 c8 _6 k/ x6 z; X2 ?使用方法4 f* g! f p' O1 P
pip install simple_crawl : z" z- l- w6 f% z8 a l8 I, ^6 r) R
### 以下源代码为简单介绍,详细功能介绍再源代码之下 ; i2 b& G& J- S- X5 lfrom simple_crawl import request ! [. n) [) R2 y! K y9 t; {request.parse( 5 h# y" }' R6 k. d" r # status 参数为运行状态,支持单线程多线程多进程协程以及联合 $ p4 ^# j! {, Y! T: q! T status="aiohttp",2 Q: k5 J& K O7 {8 O0 O/ s4 o
# url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式 , O2 x( H; T; H url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 u7 A1 ?! D9 G$ _- {; i
# login 参数为获取登陆信息,如淘宝等网址需要登陆信息 1 Z1 y3 A( O2 e& h #login="taobao",5 d2 ` U6 ^/ f0 h/ Z7 h L) [
# type_url 参数为返回源代码格式,支持text和json,默认返回text N% p" |9 B! m. f type_url = "text", 6 ]- C9 A) W* v8 i # Parsing 参数为解析方法,支持re、xpath和beautifulsoup/ V8 L' ?0 F; \& M
Parsing = 'xpath', ' K5 @) u- X7 }; f # label 参数为爬虫解析过程,字典格式,详情见下方 t, ]$ J1 i. W- Y) x
label = {0 h1 ^! G3 E. \& L
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str], . u0 F* h. W- f0 o 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str], / G+ B! d# f, ]- K% Y 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; s. T% F" h5 y. T5 D0 |! H4 y8 Q
},. Y( \) b) u) ^! r3 ?2 ~2 _$ b. H
# write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱! {8 `; X1 B1 Q1 a/ |
write='result.txt',6 i" _! Q# E* x+ ?
# next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫/ I! m j3 ~( T4 d
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) O2 E6 N8 E, z( X' R- D8 }
# page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫 # o, D7 B% p5 R) Y, G3 z page=[True,"now_url.txt"], 7 _9 Y0 |9 ], @9 Y% k # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息 8 r0 \, M) o5 ` #clean=True, 6 \7 \2 s; s' s1 q$ l # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序9 _4 h7 k( D/ Q! @* g
texting=True,4 z! w8 _7 L; b) k8 K* i) ~$ x
# Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态* H V2 ]: V1 D# Z" v- s
Thread_num=3,/ e8 ]6 p; U7 ~" u
# cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态 * |+ v# o+ Q3 ?! _2 I# } cpu_count=1, 4 w% O6 X3 p/ w1 w( m # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态" `! l9 H9 N( ^2 I2 p
sem=5, + h" t- h& U9 ]4 O9 Q # write_SQL 为是否写入数据库,默认否 + }) i0 n8 X% b( J6 T8 \ # host 参数默认localhost - ~3 e$ J7 G$ B2 l9 ^ # post 参数默认3306+ _9 r% N, c! Z: ~1 `
# user 参数默认root ! o1 R& q( s4 T8 k1 C! _ # password 参数必填,必须正确 2 I% B3 K% X1 g/ H5 B6 F2 r # db 参数为即将存入的数据库名,若不存在自动创建 % S T9 M: d( d; g2 `! ? # table 参数为即将存入的数据表名,若不存在自动创建 2 ]4 k0 n7 g* H) T; T2 e write_SQL={( }/ o2 R7 N' `, Q8 z3 t4 ~+ L# x* V
'host':'localhost',6 d @/ U) P8 ?2 \/ e
'post':'3306',* j' E4 ^# M2 B+ \2 K5 d# e) {
'user':'root',6 `: D" C6 U# B8 U6 r5 o, T
'password':'123456',) [7 t0 m4 v. }
'db':'example', . n$ L% K7 ^3 z* ]/ i% N# u5 Z3 T 'table':'example'9 a( z+ m# L! k3 g. R2 H. e
}: X; y e: c; q
).run()9 D3 [* }5 m, Y) U' m' G
6 p! S& t# N. v x
介绍一下crawl参数设置:1 { _% u% ?" F& r8 Z% K; N
5 p5 @9 r& D' ?'''" ]* |6 G) o1 q5 i1 w- @
单行代码爬虫程序执行 : @8 r% ?9 ^; E$ e6 k! k:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档& w# R+ h! K$ L$ ^0 z/ g0 w6 ?
:param url:即将请求的url地址,仅支持get请求3 x, t( W* J" k4 F% N
:param type_url:请求url后返回格式,支持text和json格式返回$ p& l7 A+ E1 @! J8 Q2 a7 o. D
:param Thread_num:即将启动多线程个数,默认为1单线程1 _5 Q' I1 v/ b
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5( D+ q# G; m! P' ^8 d; x: p
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半 4 v9 ~0 F; ]1 ^$ K:param login:模拟网站登陆,保存登陆信息 ) R! P: M- Y c:param Parsing:爬虫方式,支持re、xpath以及bs4方法 0 X: z' u& h% B7 y8 h( ~:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,3 ]0 v. w |0 N6 |* b- ~2 a
多次报错结束程序,默认否 0 ~9 X7 A& d2 J3 w:param label:选择器内容,字典格式保存,. ]; x: ~ G5 z" }! n; V
字典值为列表格式,第一个参数为选择器,第二个参数为转换类型2 R8 [- `2 Q8 j6 T
第一个参数必填,第二个参数默认str类型. e( H; X: l4 _) s+ Z& C
:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否" c/ w+ D: A: {) G. Z
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫# _" O; ~" ]( {) B/ T2 z
:param page:是否选择断续笔记接手下次爬虫处理,默认否 4 N' p' G a$ z:param clean:是否进行简单类型数据清洗,默认否. q7 `- m$ `* K z
:param write_sql:是否写入数据库,默认否2 t' z) u) A& u( w
'host'默认为'localhost','post'默认'3306','user'默认'root', " h6 G4 G3 J4 P4 }5 | 'password':'密码','db':'数据库','table':'数据表', ! e& N; _, G" T* y) y. T 检测库是否存在,若不存在则创建,若存在则直接插入,4 D' t- c0 N1 n
检测表是否存在,若不存在则创建,若存在则直接插入 1 k) Z; k9 G. @% X/ J$ P" I7 J:return True, _! O% B( l- x6 v* M* Y' h2 @
''' 6 O8 R& l6 i) @& R. p Q' M介绍玩法5 s8 P( b1 H: H4 D$ b) ]
接下来介绍的均为调用第三方库的情况下运行: 7 t- d2 g" O1 E1 H 0 e$ I, `7 o% \+ ^0 {. L. Ufrom simple_crawl import request 1 B( d1 M% S5 N6 A第一种玩法:输出源代码 2 ~/ m$ K6 c$ H6 y3 L; X调用requests库进行源代码请求。! |) n5 L G4 z( W2 m
+ M! x) @* ` {. N' O' T
特点:0 {* O9 d2 c- ]2 l
请求失败则调用ip池处理重新请求访问,8 r9 u/ d( b1 C" W6 j3 K
出现五次失败默认网址输入错误。$ u$ J7 z5 k0 R1 ?2 `9 t, V
支持text以及json字符串返回。默认text。 5 g0 `! R3 k$ I- c% [+ h _7 ~; s5 H0 M2 A# H
缺点: 2 u# s& `/ c% e f9 y7 p4 o! s/ f& a暂时只能进行get请求,不支持post访问4 B @ A6 t% U0 t; L
$ l" M4 }( e2 L- e:return text or json# f8 K; x7 ]6 _( x7 O
% y- }" ^$ ]: D6 x
request.parse(. M7 n1 {5 I/ J# y
url = "https://www.douban.com/group/explore",6 Q3 ?+ t3 s; l, N) G" m
type_url = "text") @/ f1 {! M/ {& X& t
).run()3 q( R! d( m G4 X( t
# return text/ t7 N1 H R H, h
& ?' t- o+ s( m1 i% J) F/ j" M! |第二种玩法:模拟网站登陆并保存信息$ P) m( O/ j- O/ F6 X
调用DecryptLogin库请求登陆访问。 & `9 f7 f3 b! y+ r8 t& s 0 F% V; H, Y: s. W* }, h& i0 z. wps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源# |+ z5 }/ L; D. J
在此放出文档地址7 k3 c$ x. L( T
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/4 x. e/ `+ e4 O6 B. b
0 d3 e+ x3 P9 M
特点: 8 J; @1 E7 w* s5 \. A- z* v将DecryptLogin库中二维码继承到此库(非二次开发) 3 Q. }5 t3 }% p q支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆) , D* z- \- p! @9 K保存session.pkl信息到本地方便下次登陆运行 * B! r+ P5 K3 S+ o9 R3 @1 P" W* Q) ?& Z I
缺点:$ h& D m3 S9 ~' B
session.pkl登陆信息过时无法自动删除。 4 k& L7 j* K" ~/ D9 O. W导致下次登陆疑似cookie无法正常登陆。. M" _6 }, ]4 z, x+ Z6 C, w
$ q/ C$ e! ~, \# Q( @* R:return session + [$ ?0 `2 f+ w- ]. ?; b5 W* @$ ]0 ^) W
request.parse(& y9 p0 V# ~1 j u( ]
# 臭不要脸的推广一下我的店铺 % m% G3 |) N( @, n url="https://shop574805287.taobao.com/", ) G4 }, Q ?. j L( k* h: d login="taobao"7 @3 p& m' e: I6 c
).run()& S1 n S$ ^9 S" s' B6 T' A
# return text# I0 O6 K6 @$ x: i1 Y
# y0 f1 E6 \4 g第三种玩法:爬取网站信息 % M4 |$ S0 u3 m- r) G# j4 n6 u `爬虫库自然少不了爬虫的过程* @- K% ` ?- n3 a! R2 H
3 Y7 H! E6 X4 d. w
特点:9 \4 M* r0 }& g e6 t
支持re库,xpath解析以及bs4选择器。. f/ x% T! X- j% l
爬取方法为字典格式。单方面输出。; Q. k( T; x, ~
字典键为保存的字段名称。 5 h" d7 s5 a1 ]4 @% i, I字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。. A r q+ g; S& l9 r
5 [0 B4 C3 @2 {3 h
缺点:暂无(等待小伙伴们发现)! @: N# Z8 {- m2 I* o7 j
# j* k6 G- r% E; ~* J6 y' ^- N:return reptile_results $ X2 p! C9 _! e# ?) B) l! J& u9 @' ~, S. g0 S
request.parse( ; _& {" r- a3 s* p+ L% @ url='https://www.douban.com/group/explore',1 d: P0 M) h9 Z7 d' ~5 G
# 字符串格式,选择器方法。 $ z: H$ H% D* C* z3 ?4 Y Parsing = 'xpath', / x) t. y2 o# }9 j$ R" E8 m5 x # 字典格式,参数如上。 . h, S6 n3 d/ K5 H9 ^% d5 f3 t label = { ! A" U" P2 Y$ J: s. R 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, f& R3 }3 c/ S. p7 H9 j; _* a
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str], 8 ]9 U2 B3 {* n# o0 o' m2 i ~ 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 o$ i7 v0 L$ K5 K$ ^0 T
}2 k4 y3 ?% k, m& C3 ^5 [7 ] y
).run() Q3 m: E7 g7 W: ]% x/ R
# return reptile_results(list) 8 g& h9 {6 W J+ w o. d* ^/ L. R4 O0 p第四种玩法:自由保存信息 0 |6 M5 x+ s# u$ v$ {0 G1 C2 M目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。* z! e) g& v$ F2 f
- R* ?# U/ u) p: _# G
特点:/ _& C" X2 [1 g3 e3 [$ L
写入文件均为数据格式传入文件。& x: z4 p) r: p) A
且输入格式规范方便阅读and省事。 " f d, c7 b6 j9 v9 i `7 D) G' H" ~' z0 L
缺点: 6 E4 o: ?; [% U# ~, D1 p, l1 Z保存格式仅四种,: m! N5 }$ x, e5 ]4 d9 t
不方便用户之后读写操作。7 j- i2 c2 e0 G" e# v3 D
+ j- Q* G7 x# C3 q5 Q
:return file* [" H- H$ X* R) `3 r+ s/ y
9 }) N, p2 M J& Q3 S
request.parse(0 W! B# R, X( @! `& b1 }
url='https://www.douban.com/group/explore', L% N. b" J3 d2 L/ D
Parsing = 'xpath', h) O5 i$ g8 @: ~6 v label = { # [2 S8 Z+ R$ c! P { 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' i1 K) O0 D- Z" c* A2 Q. V; v. s
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str], % l/ z9 ^: q i; S9 O! Y! `- k# ? 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str] 4 ?9 i+ `- T6 P% c U/ D },5 ?: y* \& _$ r0 m7 p$ J8 h6 r
# 字符串格式,具体保存位置填写 " ]2 F9 U, Y6 h' V. u2 @% `% r write='result.pkl' . u* K; c$ S5 ]! e$ s).run()$ Y1 g; l6 \4 a5 U6 [* m# ^+ ]2 J0 Q
# return file % S. s/ H: Q% t3 l' y O% O7 y) K
第五种玩法:读取下一页 url 地址继续爬虫 5 ~& {# \& }( D; ~这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~4 i( A" R! n: G
. ^5 T4 l7 q! E* g8 I特点:6 t5 `: q( }" d3 q
继承之前的Parsing参数选择器选择方法。4 u2 q) }' B! H6 a) b& p2 }3 K
在这里可读取到解析后的下一页 url 网址。 0 r, u; Z7 i' f$ J2 e方可继续进行爬虫处理。方便用户使用。# k9 B; r; d% \2 ^3 y; ?0 {% T
, Z- a. }9 w5 C# Q& U4 B
缺点:' n, g/ F2 N; [! s: E6 g
若爬虫时下一页 url 地址改变,便结束爬虫。 4 h" u8 l% t' z% p% Z B只能爬取所给 url 地址中的信息。. e6 h( Y2 Z1 _
无法进行某一界面的多个网页爬取返回。7 U8 J8 Z; Y8 b
造成访问页面单一流失。/ T1 B0 O5 h- m, I
9 V+ G* C; F4 M2 j. w$ y:return None 4 O3 K9 U1 B& V# S2 i' P# Q9 A, [ l, x0 G+ G% p
request.parse(! c3 E* U$ f4 T. p" f+ V% m- W
url='https://www.douban.com/group/explore',# u% G1 s0 q. o. b% E
Parsing = 'xpath',/ e, E! ]- j4 T7 F/ j( q, n& s) Y" y
label = { - j8 D* X/ {1 K' ?6 U/ j; c/ f& K 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str], + w; T- L+ U3 e" Y- s 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% b& G3 M" R) _3 j9 ?, ]
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str] 5 @. `$ r) C" G8 M* ?* w: f }, 8 Z* O0 o/ h* K2 }$ A write='result.pkl', : V) Z8 r8 _$ F8 U# I& t # 字符串格式,根据Parsing方法继续请求下一页a中href - I3 Y/ F8 r) | next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! S+ B2 u% x1 ?; w, j5 m+ O
).run() % [+ d5 [; _" M j# }# n/ A, `# return None 1 ^- M9 p# i5 g) K" Z e