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