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