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