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