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