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