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