- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55557 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17619
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 447
- 主题
- 326
- 精华
- 1
- 分享
- 0
- 好友
- 79
TA的每日心情 | 慵懒 2020-7-12 09:52 |
|---|
签到天数: 116 天 [LV.6]常住居民II 管理员
 群组: 2018教师培训(呼和浩 群组: 2017-05-04 量化投资实 群组: 2017“草原杯”夏令营 群组: 2018美赛冲刺培训 群组: 2017 田老师国赛冲刺课 |
仅需一行代码写爬虫–simple_crawl0 V7 _ I/ X& j! m
simple_crawl
+ p' L$ K4 K' |3 ]- s7 C/ x. `仅需一行代码即可达到爬虫效果/ T& R# {4 R$ }) E1 e/ b
项目地址(欢迎star):https://github.com/Amiee-well/crawl, i: M6 K& }( Q4 W( x6 R+ P6 U
使用方法
% k3 T3 r/ P1 ~- Z+ p+ |8 Xpip install simple_crawl7 b ]( _# N- P6 G5 c
2 ?" h8 ?5 H. I2 Z
### 以下源代码为简单介绍,详细功能介绍再源代码之下
0 K7 [1 i! x$ v; W) K% o+ @8 _from simple_crawl import request
8 Q2 ?$ s. J" ^0 f$ T# wrequest.parse(
3 ]: f5 g: z& m1 x; `' U* S8 M; P # status 参数为运行状态,支持单线程多线程多进程协程以及联合! e& L( v* s& I! [' }
status="aiohttp",
) a: i8 y& v1 S2 x% S # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式2 {8 r+ ~8 N2 K% _5 U
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],! \& ]2 r# J4 A* b& F" l4 h
# login 参数为获取登陆信息,如淘宝等网址需要登陆信息: \0 O- |8 Z' H
#login="taobao",: |# f) |0 [9 v) s$ l
# type_url 参数为返回源代码格式,支持text和json,默认返回text
8 A% X( d' s3 W5 {' W type_url = "text",5 m8 Q( x- g$ R, y/ c! Y9 g
# Parsing 参数为解析方法,支持re、xpath和beautifulsoup. D9 f$ @ F/ I h e
Parsing = 'xpath',
4 L9 H6 A- X, Q0 J1 [+ N # label 参数为爬虫解析过程,字典格式,详情见下方8 y. e s/ ^& @3 [
label = {4 ]# x+ s4 h1 a# L& [
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
* k- f* K3 \3 v 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
1 k5 O2 J" ]/ O5 z 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
3 T: N8 U2 i8 p },* G2 ?2 w5 p1 Z3 e- z
# write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱/ _- f% n e! G$ u
write='result.txt',
3 [& P t1 _, L. @! H$ T6 D* L # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫4 U9 p5 d2 [ s3 w6 {8 \
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
9 |# F% ^9 x, e! K/ \# ^ # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
1 q7 P1 t' K. r% n* K1 { page=[True,"now_url.txt"],
7 z; y4 f: i4 B9 r # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息/ b h( D a. S g& ], V9 w% b) s& q
#clean=True,: J3 f: s# n: K8 b' x9 w: t
# texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序3 V3 N& A6 b- ^$ S" z# M$ M
texting=True,
2 i$ M: K+ ]% ~3 q9 P& u" k, J # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态; N. d X/ ]) `/ D, ]" l) Q" c& E& a
Thread_num=3,
5 C; e( g* R4 X) J! G7 E8 L # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
' H. T1 \( n% ~: h% g. I- S cpu_count=1,
% P3 L2 X& u- [( k/ ^ # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态$ S, N) D9 V( y6 d
sem=5,, v( O" o6 o- i# e1 v) H8 {5 G
# write_SQL 为是否写入数据库,默认否
; z/ D( ]$ i3 E% V* l # host 参数默认localhost7 v. v. S0 ?9 Q
# post 参数默认3306% b4 X: r0 d! H) Q' o6 z/ g" X
# user 参数默认root
* k0 e$ ^/ i. ?0 h # password 参数必填,必须正确- o: U8 _3 s' O1 m& |6 U# y
# db 参数为即将存入的数据库名,若不存在自动创建
$ p; D R: @& N% k0 j # table 参数为即将存入的数据表名,若不存在自动创建 E$ L' ] P' B) d {4 F+ X ?
write_SQL={
" I1 W* Z7 y3 w9 g! T. Q8 d 'host':'localhost',* p$ z/ n8 T' s' M6 Q9 a4 q
'post':'3306',
' |* r0 p- h) Q 'user':'root',
( E- N, j; t# Q0 a X/ E X4 N 'password':'123456',
9 c; h9 {: z" h% b% Z4 y6 m 'db':'example',% w3 n0 l0 K! O$ g0 O s6 i
'table':'example': ~ S* K) A/ F: }* h& ?7 h
}
, R' w: c g" N/ M! O0 z8 j).run(), l6 F8 @& F; d9 C/ l+ b T! n
+ h! w s: G% F1 X. V. N9 Z
介绍一下crawl参数设置:
u$ I* y4 R- R5 q9 U0 N$ _
- Z% u/ m3 Q+ n% u) b, }'''/ d/ L( ?: u& g/ j; w! z
单行代码爬虫程序执行& k' @) h+ n& l0 `+ D4 E$ p: x
:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档$ R$ N; d0 ^& Q$ H1 [
:param url:即将请求的url地址,仅支持get请求 Y* A7 e: n! I3 f4 F
:param type_url:请求url后返回格式,支持text和json格式返回3 Y3 Z M# Y: i1 }. D$ E
:param Thread_num:即将启动多线程个数,默认为1单线程3 Z- g2 X7 D1 @; V S0 E! `
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
4 Q' s/ ~; `; j' x) n# I7 F:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半+ @6 c- H* l' K( ^
:param login:模拟网站登陆,保存登陆信息0 l4 H8 V2 c4 a' ^1 @
:param Parsing:爬虫方式,支持re、xpath以及bs4方法
2 G2 s( y1 B' _ e- {5 e1 l. j:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
" `& J+ s/ j# }( t0 l 多次报错结束程序,默认否
, v1 M* t, R/ B2 c: z$ c; ]:param label:选择器内容,字典格式保存,
1 v% N( b% w a/ W; h3 |% ?. a 字典值为列表格式,第一个参数为选择器,第二个参数为转换类型. K- v8 [/ W$ [, S% n
第一个参数必填,第二个参数默认str类型) j* i, }& v. @2 g. d" M- d' P
:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
- d8 {. b4 }. Q2 u# p# M( |+ p:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫5 k, \6 I, K6 [' G5 |
:param page:是否选择断续笔记接手下次爬虫处理,默认否8 a4 a: B+ d( {# `; D/ v- l. Y- ^
:param clean:是否进行简单类型数据清洗,默认否
, x) U. P1 }$ }6 J5 F/ M:param write_sql:是否写入数据库,默认否
! W' |! V/ M% y- ]7 v3 k 'host'默认为'localhost','post'默认'3306','user'默认'root',
: c. C+ R0 J; d( u6 B. r y: w% | 'password':'密码','db':'数据库','table':'数据表',
( Y- f" @% ~' j2 r- K% i7 y 检测库是否存在,若不存在则创建,若存在则直接插入,
; c' e, `5 z8 G( T 检测表是否存在,若不存在则创建,若存在则直接插入) @. x( T/ l3 f( r
:return True
! _5 a# s K+ h$ s'''2 ]0 f& r- v5 ^8 @1 B
介绍玩法. m. P. E: k1 Z: o" T4 l$ o* k
接下来介绍的均为调用第三方库的情况下运行:/ M6 ~- ~* b! S v: X8 F o' o
8 L. T' t8 }8 J& F# H8 ~from simple_crawl import request
6 e2 P5 q9 B3 @" m( [' M- M第一种玩法:输出源代码
G. f) ^" ]" S调用requests库进行源代码请求。
W R1 K. S8 I. s- V# D$ @8 f
* p+ I; |2 Q9 X* E; q6 {特点:6 m4 q5 ^& {; L$ ~
请求失败则调用ip池处理重新请求访问,
/ \2 l5 M3 J4 K出现五次失败默认网址输入错误。
$ h) Z7 d3 ?5 z0 k+ A* R0 N1 J; {支持text以及json字符串返回。默认text。/ [8 ?0 ^' Y _: q' T' _! a
! f+ m7 T6 s, c+ V/ q6 `缺点:
s+ L8 C& O# A) Y/ \9 U7 h/ r暂时只能进行get请求,不支持post访问
* g5 _5 B5 |" i9 ]+ {6 C, z$ v2 P* W5 \* J) r0 ]- Y- z) d% H/ r
:return text or json
9 h- z1 G/ W) R, D } ]& x
; m4 F8 f) ]: }( ?. [/ s2 frequest.parse(' W8 ]- p/ R9 w
url = "https://www.douban.com/group/explore",
! e8 A1 v1 G6 L5 w+ \ type_url = "text"
' ?- k3 B4 m- V3 [- L0 M) C, |).run()
k7 _/ d! E. y/ H6 |# return text
/ J/ Y; ?8 U5 z6 c) s; G# H1 P* Y( R) U1 L; e- p0 p4 z4 P
第二种玩法:模拟网站登陆并保存信息# ~; ]3 X7 [7 D0 |$ B: X2 F
调用DecryptLogin库请求登陆访问。
5 N: h9 J" {( T1 o" S q5 Q$ V4 L2 ?) ^7 Y- s
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源0 r# h! r2 |3 ?3 N; r: {
在此放出文档地址
# m1 @% m3 [5 R" i% r3 V, n7 DDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
6 K% P6 r, f i& z% G7 p) P* C3 t2 p9 T
特点:" o3 z7 l; Q( N7 O" M, n
将DecryptLogin库中二维码继承到此库(非二次开发)- `1 b* S/ N$ t; T8 V; A
支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)% a3 q' K; J4 B0 g: K9 A/ N8 \
保存session.pkl信息到本地方便下次登陆运行
+ H! P0 T3 B3 U9 t8 K# B/ M
' v, ~/ z8 |& y5 e8 B缺点:$ \7 _0 P; e, r0 S) T
session.pkl登陆信息过时无法自动删除。, T5 m G+ d5 y% q! c9 o
导致下次登陆疑似cookie无法正常登陆。
' O0 R) o& B. J" J- i1 t w7 M, G: J: m
:return session% ^) Y) s* V3 j' \; G3 j/ t4 U* ~. Y& ?
. ?. p* V! M2 N" brequest.parse(
?5 t& W( T% z4 O6 n # 臭不要脸的推广一下我的店铺, V. A3 h4 L- E) U% P
url="https://shop574805287.taobao.com/",
& v6 G2 U: F7 j Y+ C6 l/ q d login="taobao"
2 o1 b4 G( u' t).run()
6 w: M; y& l# a8 z! T* y' i% E# return text, k: b# V3 K b( Z& |- D5 b- }8 |
1 m$ r: l0 Q8 a' q( y4 f8 r3 T第三种玩法:爬取网站信息
/ A! Q/ F9 k+ M爬虫库自然少不了爬虫的过程8 G9 [5 L7 r3 w- n2 |4 W8 ~
# Z( u- _* H$ S9 C7 l! `
特点:
: }9 O- u6 R. T3 @支持re库,xpath解析以及bs4选择器。/ e5 i8 |+ `1 M; \5 Y- z/ P
爬取方法为字典格式。单方面输出。 M2 Y1 F9 m; a( I$ S
字典键为保存的字段名称。
2 M: V' z9 B, q$ ?! M. q# H字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
" x1 Y( \ i# G7 A4 k1 O4 T' ? V k8 ~5 Z+ b/ B8 |9 `6 L
缺点:暂无(等待小伙伴们发现)
$ ^5 S) |+ j* k5 W( m' e! E6 \; q$ {. l" z% J
:return reptile_results2 i1 j8 B. w) v9 o O0 Y
9 }) F; k$ n; wrequest.parse(
# e$ Z; t; z' ]! i2 J I' f1 D& \ url='https://www.douban.com/group/explore',
- |, [) h" F! p* L# A/ m; A2 q # 字符串格式,选择器方法。
/ V! s C# \+ n# k Parsing = 'xpath',
2 d# L2 ?9 r& t1 Y3 Q& [ # 字典格式,参数如上。6 j8 r+ }+ m0 q/ M L
label = {' h5 D6 v( n" s1 k7 q5 ]
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 \3 X% A% A- j' ^* E( `3 l
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," ]: q; ?% t7 [$ E8 S
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
7 R s7 ?; `6 Z# m/ } }
O- B; b0 f7 S; X3 _4 \7 p2 a).run()
8 N% l+ r8 }* [, A5 G# return reptile_results(list): b* j2 r5 U! H( e+ m. L1 c
8 n4 W0 G$ t# N' u. s9 J第四种玩法:自由保存信息
8 A: [' s$ j( I8 g f目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
& y2 S A+ i! |: g$ Y* o" b; b! Y) b$ L0 [3 t
特点:, u/ i7 g& k# ~" e! j
写入文件均为数据格式传入文件。" s5 W- u5 o3 [" A! p' L
且输入格式规范方便阅读and省事。# J( W s8 a& O* N9 n
0 \4 r4 k$ m; {3 Z
缺点:
1 r& C* H4 T3 k/ q保存格式仅四种,
( D7 X2 d/ A7 N* A) N. q% Z不方便用户之后读写操作。 Q4 _( b R7 v. M8 r6 v' Z
8 a9 \% c/ P0 z( y, g:return file9 ~: H9 n3 M2 f$ z8 R+ x( i+ f
s! Y' _9 n/ c! b, r
request.parse(3 e* P/ k4 G5 m4 H6 v1 b3 b
url='https://www.douban.com/group/explore',
6 ?; m. h4 l6 [0 P Parsing = 'xpath',* X% t. g6 [0 g; g$ c m- T
label = {7 V$ r! c; e0 t, i2 X
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 I- R8 @) E Y0 D2 q
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
; B6 J2 z- [! b9 e9 P6 E7 h" E# F J+ y 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" D2 b7 E+ A# v- D# r. S
},; y5 x6 ^ j; b2 |* Q' g8 L
# 字符串格式,具体保存位置填写
# S+ y: T! r5 m1 N! N) y5 r3 ?, D write='result.pkl'
" L: H. i0 l7 P( q7 ?).run() V" E- ]3 B; |6 M& ~0 q. ^
# return file
; R6 a: V& S: u
- |) X3 U9 m N: @; C( r2 ?( ?第五种玩法:读取下一页 url 地址继续爬虫
) s6 h$ w4 n& P! ~- h$ {这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~, K3 O/ `- a) w N& y
0 v% X1 ^' P; I1 z特点: v/ N# v) L; `+ |! i
继承之前的Parsing参数选择器选择方法。
& p6 `2 S) g1 w, x S2 p/ C' q2 l在这里可读取到解析后的下一页 url 网址。$ }6 j' W5 H: C# B# {4 A: ~# P$ \
方可继续进行爬虫处理。方便用户使用。
$ N+ X) D; Y- Z& }2 P1 q. n! p1 l# l8 J- G& U2 J1 S
缺点:
& ]# Y' N% R D若爬虫时下一页 url 地址改变,便结束爬虫。4 @' A9 K; r5 n' E, {8 @+ G
只能爬取所给 url 地址中的信息。: i! v+ t) Z7 h, e; V" R
无法进行某一界面的多个网页爬取返回。
+ Z+ K% n* w) O+ J* ?( m5 W造成访问页面单一流失。
% Z9 Z; S0 ^0 A+ h, u5 x7 r6 U4 N& o
, R& \* i4 [1 v. {& M6 ]* a:return None
* q2 E) k9 R, K$ R# s+ |! y, e9 b) Q" h! \* i
request.parse(5 M& F9 R; q5 [7 O
url='https://www.douban.com/group/explore',
8 \9 C; Z( I( @# E1 S& H Parsing = 'xpath',
8 O- x/ U1 I6 b, M label = {
" ]7 H$ E' }" A. `7 ^8 Q 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; f- P3 E! \' X2 ?
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 e( t$ k5 `; F$ G( b+ s) |1 y
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
. R5 _+ p/ ] u" D6 K },6 U& X8 P$ L H2 }
write='result.pkl',* x$ a8 [+ F& {4 e" i2 s2 u' x0 S
# 字符串格式,根据Parsing方法继续请求下一页a中href% E7 y( M! u( q! n
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
; J0 S. O$ A! }. O0 j3 M).run()
# A& I% T& }2 Z- t5 T+ M6 |# return None g% R& b- r5 P9 I# a
) m5 |* b+ }; B4 t+ I9 U c2 r第六种玩法:爬虫网页保存
% s' B5 D* M. ~4 {" n" T听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!5 C/ K' Z N( Y
: I) C) J1 G+ j3 K
特点:
+ l0 k% k' a8 ^1 a4 m持续输出断续笔记。
" U2 I2 a4 x% {4 @& ~ ^, Q将此次爬虫的 url 地址保存到一个文本文档内部。) W& `7 M O. h4 S) m$ Y* Y; Y" x
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
+ {5 J" w$ ^7 G
E0 P5 C/ l: Y+ q" v$ n! a9 A缺点:
& { a6 Q/ t7 y: D8 r6 y读取内容不单一。
5 k* Q" [& l3 {0 ]' N) d; V导致下次爬虫无法正确读取上次爬虫留下的痕迹。
. r6 U* A2 j! G
; _% ?: Q# P7 m, I:return url_file/ i3 L& w) r# q' e
z8 X2 _: g, K* g' G- }# ]
request.parse(* L4 c" J, E Q" [
url='https://www.douban.com/group/explore',% H# W, h8 }9 o- D7 Y
type_url='text',
1 q" {: Y. k2 Y4 W' X% R ]# p #login='taobao',& I, w7 w4 N/ L
Parsing = 'xpath',- i1 |6 r8 R4 j$ y) X1 K
label = {/ A: S P/ w, i5 w
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ Y1 v# n. b, d. h1 V9 x% P
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
, [+ W, S' ~0 c) ] 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
% `- c+ v; ^( ]4 Q* A },& @( F+ V2 l' A$ p: s
write='result.pkl',9 l' q9 Z: ?; I0 ?+ F
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ j, N/ o; U$ L5 \0 j, q7 q0 z
# 第一个参数为是否需要断续笔记。
4 D- t8 j1 C" y6 h # 第二个参数为断续笔记保存位置。 h3 |, ]0 x2 M
page=[True,'url_page.txt']% e: D/ ^. f s( W1 k
).run()
- Y* X5 o6 Y$ b0 ?2 f0 M: R# return url_file R4 M' h8 Y% [) F* E2 u
( h# B# U: v" V5 P第七种玩法:简单数据清洗3 k, @& q6 J8 i' P9 M% R1 p
数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。! Y7 V X" ~( K' w& P
1 F9 L8 K" i9 H/ E& A" ?; Q特点:
( Z6 T( {. N, v6 N4 h' s# S; F本人曾写过一个底层数据清洗。
" \1 r# b( ?! _( |# D5 I7 A能将列表格式数据进行归分清洗。
5 F. x) e' p" G; v% X主要内容请参考另一篇文章. e7 B) G1 M) L( }! ?& C9 i
如下连接:数据清洗% N2 _4 E% p5 }0 i
( t6 D3 T0 f0 R1 T) Y q3 z缺点:
* d: R; _& `& c) ?3 z. ?/ _数据清洗格式简单。0 J* \1 i* |( s* |
数据清洗内容单一。6 D) f5 o# u u
无法完全做到绝对清洗。
( y9 f( S0 Z' L有待改善。; g1 Q1 Y0 p" f) x. W1 ^
1 \8 S9 H4 N' F1 s9 V' D:return keyword_list, value_list. |. x* b) C# a1 w
- E1 }- K# m7 @8 I3 c" W3 \. m+ Q
request.parse() T4 m! y8 T' L& D7 m
url='https://www.douban.com/group/explore',# W1 J0 U! ~. B2 |
Parsing = 'xpath',
; a( {8 c, P# o# C; z8 i: ]" z label = {
0 ?. t! V5 K) h0 K3 F: ` h5 N$ l* s1 ]: u 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' g, [/ s' `" \6 U/ Y* k" Z U
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 X# I$ ~0 B7 q6 W% t( {
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]- R! [! z/ \7 b% u- |& r" M- ?
},
# e& {2 H& W: P0 q0 _ write='result.pkl',
2 j0 [9 R! ]+ u) @- `9 P* E- O next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href', b4 E) {3 k# p
page=[True,'url_page.txt'],: s6 J3 q8 c( h" x( c) X& o [) O
# bool类型,默认不清洗 }3 a* J) P; ~4 y: W
clean=True
) Y. K3 z3 P# n. `6 i).run()
, @ J. }9 K; T# t8 l Y" J) `; R5 [: a
第八种玩法:爬虫存入数据库
9 E& n' ]: }$ i4 @存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。5 U9 D8 |$ ?, o) m7 c
! g( L9 T- s. E7 R. r7 ~: L特点:
4 S( m" D$ S; X: b! W' t- b' w9 y9 }信息存入MySQL数据库。
$ A! y9 F* G0 R% U! a可连接docker远程数据库。# i: g4 m6 _! u
数据库的库名可以不存在。1 i" l; ^) k1 ?; S) O0 j- L
数据库的表名可以不存在。 V/ v, j5 s& g/ R; t$ Z: ~0 f
根据之前传入字典键与值参数判断表类型。: |3 o8 a- @% @# H6 |2 o3 `
自由建立数据表传入信息。
) ~7 y8 P3 b; ^( H) Z: l" W" E+ B3 @7 s1 |! n
缺点:. x+ J! W" A8 W" q' W; _2 G
仅支持MySQL数据库。
& o# C. m$ @7 \, `# R/ W- Q) C3 W% A: k5 D0 Z. f
:return SQL0 i" C, H7 o, Z6 ^
8 q0 A) x N1 ~" Q$ J/ B4 k
request.parse(
5 f' u8 P5 O( O! [ url='https://www.douban.com/group/explore', P& C6 e$ Y% g# [2 m
Parsing = 'xpath',% M& q6 d: Z) J5 ^0 m, T
label = {
- y" E! p+ J* O 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
6 @) b! q; J& d+ ^6 i 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
5 S U8 n: @1 {+ q& t6 ^; k7 Q f3 p 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
; ^6 ]* m d0 N( S' i- D2 m( P },8 @0 E2 L' X4 u7 Q$ }! ]9 h$ l
write='result.pkl',
3 Y6 L/ r5 j3 i0 w1 ` next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href', D/ y" z! O! q- I$ U
page=[True,'url_page.txt'],8 ~1 z- Y0 w3 C0 j: T
clean=True,. @) r8 b9 S; T: o9 F
# 字典格式,
& e- \5 T7 O/ I' `; a1 G6 ~ # host可有可无,默认localhost
: }. {9 i3 q$ t # post可有可无,默认3306* O8 `1 C. N8 x) H8 |
# user可有可无,默认root$ @3 g; {5 z/ q' N% F
# password必要参数,数据库连接密码6 B% x) D/ d7 G4 `
# db必要参数,数据库即将存入的库名- i' b c4 }5 J$ D( w' l' H! f: Z% Y
# table必要参数,数据库即将存入的表名* G0 f4 P; Q; e' A$ }; Z2 S6 h/ ]
write_SQL={* a' p" {: z+ x. c
'host':'localhost',
7 } @4 [! X' ]2 z8 B- m; q$ x 'post':'3306',; {- g- F. l7 T* X$ O
'user':'root',
: ^) ^) F: f9 F+ E+ s3 ?" A/ S 'password':'123456',, e m$ _; h5 h: u# B
'db':'example',
* w; g' V1 ^, `1 I# O9 t6 @6 Y 'table':'example'
5 e/ A$ _% w" T$ p' e1 `8 ? n }3 v) C- w) r) w- i% u0 X) @
).run()
% Z% B! I6 [) U/ ?/ A/ p
8 C6 F3 P M1 m- c" u9 I0 F0 Z第九种玩法:重新启动爬虫4 X9 b6 Y+ h, H3 \. ~0 e
爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。' ^* r. h" G! Y
8 Z2 Z3 ]: j' I* O
特点:
. T7 k8 o5 N9 |2 k/ S0 A检测报错重新启动爬虫
( T. J" n) A0 ~无需手动处理错误信息
$ \4 M. p. s$ m# |. u \4 r2 k& ]/ { L) M7 w4 h1 `: G
缺点:; V; `6 K e5 b" U7 p0 s2 j# u7 ^9 }& M
无法收集子线程错误。
+ V- ^5 t/ Y3 W% B& j
/ V' A5 w! v) ~9 r9 q! H:return None
8 }8 H$ b, j: u; I+ j1 P( z0 `( ?0 R$ G3 J6 @* V
request.parse(" B' U1 R. g1 e# w" @* Y) t% h
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: {( |# E. D' E" b, L+ J0 j
#login="taobao",7 ^% L; H% W2 t% [/ L% |, W% n! H& B, I
type_url = "text",6 b- E& C4 ~5 G( p+ r
Parsing = 'xpath',$ t% \8 p) V3 R1 V9 g
label = {- P) ]0 o% n- x, w, E# p
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],1 Q& u: q$ a( L9 ^9 ^( S
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ @+ ~. u4 n# P0 h
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
2 g: \$ ^! P1 B( u },, I$ I3 t0 |& F; e3 V/ B
write='result.txt',, J$ t) }& E f6 }0 W# h4 \
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',4 ]! `+ f, L# ]1 L7 E! ]
page=[True,"now_url.txt"],
3 B( A; A {7 X6 V$ P, y, M4 ? # texting 参数为是否启用连续爬虫
8 _0 o% h% @; c- j! L1 S8 m6 z& R # 爬虫程序异常报错后重新启动爬虫# P6 \7 v* O9 G- m
texting=True,
$ _ r4 a3 R" a3 D. ]: [ ###
- ~8 l* D6 h& o) j write_SQL={
$ P$ V& R! y/ q g 'host':'localhost',
! u8 q5 ~& |) R: Q& `9 E$ D 'post':'3306',
8 k2 g" B$ a g$ ^5 x1 s' ~ 'user':'root',& L4 |. w7 C8 W" N6 D) V0 V3 E% l
'password':'123456',
0 u# O8 J- u* G" Q7 v7 [ 'db':'example',' M) d, G! R* C( e
'table':'example'
5 L7 ^( I# Z9 k% R W* M/ r* K } v4 N2 j" P6 s- n4 R3 }
).run()% B+ N! G. I; K% w2 G, S
- z3 j6 P; [ W3 q& ?
第十种玩法:多线程爬虫
4 \7 ]/ J0 e% p) |9 B" q/ \特点:
( @. g5 ]8 p% t/ v: n7 J( @爬虫速度加快,
. `% F) T# `) e1 D& V: b, _更好的利用了线程。7 @7 Y( O# @" b
6 N1 P9 F! w* w缺点:暂无% }* M- Z4 V: V* ]! ~& Q
1 ?8 I9 {* }3 @
:return None
& S& j- z0 b9 X3 _
9 t: x& O4 y# ?request.parse(
7 I, d7 d3 i3 F6 B3 j/ v: R- X" O/ N url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 U' c& [6 j+ y8 a O2 H. G3 V
#login="taobao",9 `) `) O3 _* `" C# {7 H
type_url = "text",
" i# {: o0 [3 H6 S0 x' ` Parsing = 'xpath',
# E) I7 t; O4 K1 @4 i label = {
1 U0 r6 m7 }# s+ P& v9 d. d 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- j0 `& b; _- L1 N8 n
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
2 E5 O/ s% u6 T* I2 x1 v. y 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ j9 U8 |* A+ d' d) y# A- u: z+ |2 u
},! ^( M% L3 i/ ?% Y
write='result.txt',8 l# f: t% g* X1 ]/ N/ m. T
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
7 e# }; w! }, Z2 @: t# U page=[True,"now_url.txt"],
^, K5 A" X: w7 e( c1 ?4 H #clean=True,
* m+ B: ?9 {. w; Q6 \- K T+ S% h texting=True,) I5 X+ n, b; {) @: s/ S
# status="threads" 启用多线程爬虫
0 e2 ]# s9 y6 H7 c T # Thread_num 为线程数目,默认为1 单线程2 d8 t$ E: w- l2 o; s6 S
status="threads"," g* K9 ~8 c! c0 a
Thread_num=3,
3 [ b5 u! t# I4 z ###; M& k4 X" J) x; _
write_SQL={) `; y* |$ G+ k% p6 [( U
'host':'localhost',
; g" c1 I. B4 E& r0 F9 [7 P/ @, v 'post':'3306',# n7 x% e6 M/ {8 x3 V! M
'user':'root',% n- M( U6 A+ z; ^) y' Q- Z
'password':'123456',
1 l6 D" D8 E6 N 'db':'example',
' b l% K5 x5 f+ Z% ] 'table':'example'' V2 I' C9 s, r) I6 k. q: S
}
# V6 y# E$ B; Q).run()
7 m- y! M( `- N, k, Q) O% ?0 f" a0 F: F' w
第十一种玩法:多进程爬虫
& F. {& ?+ L+ Q9 V; Z# {% \特点:* `* {' Q/ F' t$ w+ B# V
爬虫速度加快,- J8 d, l# U( A2 ^0 u" `1 _% y
更好的利用了进程。
& x! C4 z$ G' I8 G+ k7 Z
9 k) l. {) T! G1 `缺点:暂无, H% [5 v3 E4 M# R
- M$ t, h' F. Z" n8 j
:return None
/ e7 o1 x( }: m( j& s5 O; i3 c6 |) e) p* m, h! R: G6 T1 r
from simple_crawl import request
: K: v L( I! H1 }0 H6 i4 e% Zrequest.parse(
( @' a5 N" G6 c1 X k" q$ _ url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],4 o$ B5 p" Z) c; [
#login="taobao",( P' `* r/ H4 k% A* y
type_url = "text",% x! G& {6 C0 G! H6 j
Parsing = 'xpath',; J) X6 f2 I9 v! `' J
label = {
2 D" W3 M$ }* h7 W9 A" ] 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
' G6 D9 S, K! D. ?1 F 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
' I0 r8 x. k: K4 Y 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str], ]' y9 a: g* z4 w
},
% T# n- ?/ }% O/ E1 ]7 o- D write='result.txt',' ~0 t# j- O7 Y a, A+ E
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
4 w8 x e' M* k& X2 { page=[True,"now_url.txt"],! j( X/ o7 X1 x
#clean=True,
' c9 {8 q' g# C0 ]* J: D texting=True,
% p! [9 z3 B! j0 v* u0 U) ] # status="multiprocessing" 启用多进程爬虫
, k$ V: x. s# _$ M$ k # cpu_count 为启动代码核心数,默认为系统核数一半
) ^9 O" _: P! H$ p- C1 | status="multiprocessing",
' |$ A2 }9 y8 N cpu_count=2,6 X! n2 m W! x' l1 \4 y
###- V. }. U( R$ u- `
write_SQL={) F% A r% A5 W( P
'host':'localhost',
4 b* x3 A+ ~( f3 s9 {4 j 'post':'3306',4 k* p$ ]0 I0 r: S8 T6 U" m
'user':'root',2 E* h/ d2 t# H$ l: Q
'password':'123456',
# i/ W1 B% v( D2 R 'db':'example',
1 E; u7 Q& s0 O8 B 'table':'example'
1 H0 H z- F$ }2 H }* \& p+ J9 A7 U7 V
).run()6 P1 g4 F/ {% h+ S: v
0 m1 y8 L5 ~7 `9 h& t) v
第十二种玩法:异步多线程爬虫) C7 w2 ?: }9 \- o) F# T" b* R
特点:* e- x2 X" ^0 n1 X% y
爬虫速度加快,6 ?% P. @8 N4 S% a* h6 `
异步使得爬虫无等待时间,- u# c( B- \6 v O8 @ j" S
同时使用多线程速度明显加快。5 [' a+ }! L" ?2 F* l) E8 A
) I1 \. V. O) d: K! f! a缺点:暂无3 D& l5 l0 X$ @' q/ |2 t+ z
- o( B- D v! {
:return None
' U; p9 Q( B( x ~
5 C# Z6 M2 s8 R0 Q% ~% @from simple_crawl import request, m6 }. m* m4 j# p; U/ s, F
request.parse(
& _( H% w3 }: T9 ~3 d url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],( @5 X- I0 d5 B, C6 Q& q
#login="taobao",/ t/ j! O( Y& P
type_url = "text",; A) [" m# B# {! C6 V2 C4 ]
Parsing = 'xpath',
5 k/ R, p& l8 F0 Q7 d. Q7 q9 W label = {
2 J( U, p% l8 [& A8 ~) } 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
* L5 e' ^) n/ d 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
' d( Z1 R5 W( ^6 R" R: U 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
% c7 C: R# ^7 G6 ?: K; ^ },2 h# j+ a0 T3 c( }
write='result.txt',
! g K, X# Y' H next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
7 K0 p7 w; t6 c( O, [ page=[True,"now_url.txt"],
" }) o5 J2 g# H2 Z* | #clean=True,5 M8 a+ Y; P% ]2 T. F: R" Y! E0 Z: ?
texting=True,+ n- C f7 u* d7 l+ v
# sem 参数为异步引擎数目,默认为5
+ y# i5 L; O% | ^6 F8 R # 其他参数同上9 s3 j. X8 ]0 d+ B) C' B6 x7 g* E
status="aiohttp",
9 i1 }& d. x+ w& v1 a Thread_num=3,
3 C/ U- Q, U+ r0 a# f+ N1 ]$ Z sem=5,! B/ E- F, H4 K2 u/ u
###
" E$ h2 w i' L; @( c write_SQL={; U1 S' V6 J9 `
'host':'localhost',4 Z2 h# s3 m4 u" s# i# |$ E a
'post':'3306',. O& C( G" h t3 `5 w& ?
'user':'root',
2 D, r" n5 ]7 C( R' Y2 h* x 'password':'123456',8 Q* l/ k1 v6 ~9 y/ a5 {8 C' T
'db':'example',
- O1 _: F v; ~$ }& m8 p 'table':'example'* F2 p ^+ _3 N" i* q. A! I& M
}6 n+ b7 ~% Y5 D, r
).run()6 y# p" x5 x4 _) n. ^/ H
+ w- b! o& h/ F' M
第十三种玩法:异步多进程爬虫4 d) r0 w9 R% t$ s
特点:
8 w( d# [ P( F8 q爬虫速度加快,9 ?) x5 [' V; A- d
异步使得爬虫无等待时间,' f% s8 w p/ c2 C$ w
同时使用多进程速度明显加快。( J `/ W: a% Q9 f8 v: g
7 k: w+ R l4 ~9 J: x4 ?, H
缺点:暂无9 i/ \! A, K( W2 f! M- m' U
! G1 u7 Z F$ p# S9 F8 I" N
:return None% G1 o3 M7 S, t1 D& h
& R/ x( e$ d; q5 Q7 G6 B- x$ A5 efrom simple_crawl import request# T% g% q$ q: d/ n6 O, y6 C
request.parse(
2 K& w* F0 K s I( V url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
2 |0 Y9 Z- j) U1 G- A1 {0 f #login="taobao", g( Y, v* d4 n5 _! a; Y' k
type_url = "text",
) f6 C- c0 g% [7 l6 r3 D Parsing = 'xpath',
& d- v; r6 h7 U" b% ^* E2 T- _$ X! F label = {2 p/ _! F7 c- Q; e: L( v
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
. U$ W% ~' R( E+ a6 D { 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
" C0 V# a) D& L' t0 J' o6 C: O& j3 i 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
' w! C3 H4 T+ e$ ~: k& c },* R1 k/ H3 S- _7 r; ~1 G! B
write='result.txt',
( v8 w$ \' ?, C7 T next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
* v/ H& ]5 X2 J2 A+ ` b page=[True,"now_url.txt"],2 k: U e7 a& I
#clean=True,
! P! R8 B4 N4 }1 [ texting=True,
8 y; A2 l0 q. g' _3 ]/ { # 参数如上/ S( Y+ ?5 w' z' ~0 I% X$ N1 p8 u2 q
status="between",
. S4 {4 L" ^2 ? cpu_count=1,3 B, E$ g9 r# p
sem=5,
9 s: U4 y2 T* l2 ?$ m ###
" U2 F. f" Q$ A8 l: a- H# }( p9 z j& q; I write_SQL={
# t" J$ f6 \ j I& P 'host':'localhost',
1 N; U( m$ K2 I+ K5 Y 'post':'3306',
8 [& U1 m2 h$ t0 l 'user':'root',: W, v9 g# x( e' p R! k2 f
'password':'123456',5 a \8 E X* \6 a, h& q
'db':'example',' |; n$ x8 n: j* P
'table':'example'
- a. w" t, O( R8 X }% v4 `* }" G* k/ e
).run()
+ c6 R0 a( G" ^: M# Z
; ^: }7 G/ `+ L; Z R! ?& S3 M) }) l! F& W" q
功能介绍完毕🤞
" P8 p% J a" R( j& O" ^4 z* O最后还是希望你们能给我点一波小小的关注。; l" e9 E- _5 b& n4 W
奉上自己诚挚的爱心💖& i7 w5 N* l6 D! t+ F6 F: c$ M! E. j
————————————————
" [. e; v% d, B$ L$ s& D; S版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ b% y" B' j7 I9 V: _
原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
( o/ G2 v+ O$ ]; f+ X" }- B5 ]6 E* Z8 [
' O4 F4 w9 J. F
|
zan
|