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