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