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