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