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