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