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