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