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