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