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