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