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