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