仅需一行代码写爬虫–simple_crawl1 `* {6 X4 ]7 k5 L3 |0 Q& L- }- {8 I
simple_crawl* x" A" L0 l% b" a
仅需一行代码即可达到爬虫效果2 N+ {! X( h i+ l; r. M( ]
项目地址(欢迎star):https://github.com/Amiee-well/crawl 2 F; M8 y/ X. {+ L$ b1 O# x使用方法 " F V8 }( B4 B- F! G6 S* gpip install simple_crawl8 e/ W" [' {0 M6 J% f+ x
' d/ |9 V0 J# m2 x
### 以下源代码为简单介绍,详细功能介绍再源代码之下6 G: x3 t: I& n7 _3 i
from simple_crawl import request, Z1 _5 V8 V; t/ O: P, T
request.parse( % I+ J: s; ^- z1 M4 U- [ # status 参数为运行状态,支持单线程多线程多进程协程以及联合$ J- ^. Z G2 D* F8 b/ T! d* R
status="aiohttp", ; }1 e3 Q: E5 M5 X # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式 3 J' _1 N: v, ?0 N; y7 h url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)], W5 V, O- @7 F& b/ X # login 参数为获取登陆信息,如淘宝等网址需要登陆信息% v4 y \4 g; R9 L! U: J7 m% P
#login="taobao",6 j8 K9 j% k7 E2 L$ W. c+ }: E
# type_url 参数为返回源代码格式,支持text和json,默认返回text 2 D, c- M& ~. n4 W1 [0 o, f type_url = "text",( X3 D9 N7 z& \0 C: D X) p( f' k
# Parsing 参数为解析方法,支持re、xpath和beautifulsoup + O7 B0 p/ f! W Parsing = 'xpath', i+ X$ U3 x7 s" e/ R3 V6 r" _2 a: W
# label 参数为爬虫解析过程,字典格式,详情见下方 6 l% ?; B2 |( Z# T0 b6 N label = {$ x, Y0 A8 _; N& Q- A0 C
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str], ! _2 o) f+ u# I8 W* Z 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str], 2 V( ~5 T+ e) o; o5 l- F" A 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str] 7 g* d5 Z9 ~( H- j4 c" r$ g },- G: b% B& I3 G6 z0 k9 N; ~
# write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱 1 p- g2 O9 I9 Z. l& \ write='result.txt', & I2 Y( h* w0 `, W! p2 S # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫5 m `& D l! O
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href', ' {4 Q( r C8 J7 S# v # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫- m) a. i5 D/ K9 V# v- @7 V' v
page=[True,"now_url.txt"],3 z; v) v0 n' |, r# B5 z
# clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息9 F8 D% H: h5 E1 O
#clean=True,- i4 E; n0 h: v$ V
# texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序 . ?% z( u0 u$ \+ { texting=True,3 {* g* P+ F6 u& X
# Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态 2 K; z( U7 i& R \; v: o0 a Thread_num=3, - {# D1 ], U3 u # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态 5 B; S' h2 E- n) {" E cpu_count=1, " q, A6 @& n$ B* \/ V% {8 W # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态6 X, U# F1 p3 t
sem=5, 0 w8 \+ ]$ Y, j+ m' O # write_SQL 为是否写入数据库,默认否 ! i/ T- s2 S, |$ L6 }! P1 L" @ # host 参数默认localhost+ F1 f" y$ F! }: f8 J
# post 参数默认3306 / m! X: ?# j* F8 |, L4 C" i! x # user 参数默认root* v0 g( i+ s7 @, W
# password 参数必填,必须正确 + E! N. I* s1 I+ k! O # db 参数为即将存入的数据库名,若不存在自动创建 6 ^# R! A1 n4 ]3 x5 i( o! @ # table 参数为即将存入的数据表名,若不存在自动创建! X6 O. h/ }; ? ~
write_SQL={% a/ N7 O6 l U2 L0 ~* @1 u
'host':'localhost', & g$ I& I- q0 j" C. @/ k! y 'post':'3306', 3 [& A3 R4 V' c7 M# J6 a5 k) E 'user':'root', ! W! d* T) z& D' K+ F 'password':'123456',; y; {: J, f' e2 v, O
'db':'example',& v* `$ @" {6 L! g3 B
'table':'example'. w6 v: T. {2 p2 L6 _
}8 X5 \, K# @$ e8 p$ v; F
).run()8 H* \% a; i/ R# d
& ~7 P7 S4 B5 r1 K6 K" @介绍一下crawl参数设置: $ v7 n5 J/ G: P ! e! U( U. r: D* z''' 7 z% _8 S9 s/ z5 {0 s$ t, G9 E单行代码爬虫程序执行 ; C+ o6 X# G1 g4 M W' J: @/ e3 Q:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档5 Y, \! v' ~9 P" L$ M
:param url:即将请求的url地址,仅支持get请求 5 t5 D' A/ r. O6 S9 P:param type_url:请求url后返回格式,支持text和json格式返回 % X2 z7 N/ L1 Z& |' |5 y:param Thread_num:即将启动多线程个数,默认为1单线程$ f# q& r: U9 k' c9 T2 m; }
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5: u+ u) |! z! Y. [+ z
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半' t l$ |" k, K; q' K
:param login:模拟网站登陆,保存登陆信息 8 x; E/ k$ H' \3 j% Q4 k:param Parsing:爬虫方式,支持re、xpath以及bs4方法 |* v9 I1 I0 v" f! Q+ C:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫, / P# U, h/ \* t" `5 a 多次报错结束程序,默认否" [9 o9 q% h; r, c- X
:param label:选择器内容,字典格式保存, 9 a$ r* E8 _. J% D/ k3 P+ j9 ^ 字典值为列表格式,第一个参数为选择器,第二个参数为转换类型 3 X6 c; V. E0 A: H6 W 第一个参数必填,第二个参数默认str类型 0 f5 s8 p! G$ _4 I( ^3 n2 w5 i0 q:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否 4 W9 S3 }$ x% M, M:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫" R+ ~* V+ I$ C* Y* |( w6 `/ Q
:param page:是否选择断续笔记接手下次爬虫处理,默认否% w/ l0 L8 e* |: I/ ]1 N
:param clean:是否进行简单类型数据清洗,默认否5 M2 G2 c2 x; M! p7 B; K. R
:param write_sql:是否写入数据库,默认否3 |( o% l1 k7 I
'host'默认为'localhost','post'默认'3306','user'默认'root', + y& X. p% z9 D# W 'password':'密码','db':'数据库','table':'数据表', 4 \3 e1 o* [4 x& k. |- B0 S o 检测库是否存在,若不存在则创建,若存在则直接插入, , d0 M+ h2 I* b; l1 u7 z 检测表是否存在,若不存在则创建,若存在则直接插入 / J: G5 `9 }, o5 N:return True ( ?# r0 v* v5 T# x1 @'''/ O* B$ ?( Y5 a3 N Z; x
介绍玩法 $ S" g3 j1 S5 h# w& v接下来介绍的均为调用第三方库的情况下运行: ; @/ O- j9 |$ I# d* e 9 L1 L: X* ^1 z1 Qfrom simple_crawl import request " G3 y! l; L: L# B) U. ^第一种玩法:输出源代码 4 g9 j* L% J" ^- ^% l调用requests库进行源代码请求。% [; s7 f* I9 T' ?( F6 |. R
- g. p& p" _9 s7 _
特点: 2 u5 F1 Z% }3 s1 G) Y9 Y$ A- h, g' f请求失败则调用ip池处理重新请求访问, . x8 A! a0 a$ r) W I5 C3 W出现五次失败默认网址输入错误。$ I4 w0 K" v' p2 k
支持text以及json字符串返回。默认text。5 {6 v1 q0 g9 R. C6 u- {, R% C- A
" \% U) L) `* p4 ~# q缺点: 9 e# e% q3 {6 F& H" j4 ]5 R暂时只能进行get请求,不支持post访问 - I8 _ C; c% D2 v7 j. |+ d+ w' y2 C+ f: {! S
:return text or json! c( z% A; _) m" u9 X
$ F; n& i% E# N: {+ ~; w( r3 Urequest.parse( ; |; y; g9 u7 o0 s url = "https://www.douban.com/group/explore", E" P! K! v8 r6 m+ i) z type_url = "text" 8 P9 I+ A$ O: p% d- [7 l).run() 0 t) Q' C7 H7 i1 b, v, n( t# return text 5 C8 _, f3 f9 x$ R6 P3 \: V 1 d1 U! D3 I/ C( L) Z8 ~1 f+ u2 I3 v第二种玩法:模拟网站登陆并保存信息, T5 J# m" Y% F/ Q- C( _
调用DecryptLogin库请求登陆访问。 $ [7 ^6 l8 ~* @* F o8 `2 `: {& X6 V
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源 4 I" M3 P" l! v; }在此放出文档地址: h; C' G7 n, N4 M) S |
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/8 s: {6 w) _/ `1 T5 k' @
8 T7 s m7 ~, t, S0 X8 a1 n
特点:" L- x9 T; Y) A, ~0 v( p8 f
将DecryptLogin库中二维码继承到此库(非二次开发)8 A& h! \3 H# @3 g$ b
支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆) - w% S6 e' e0 I/ p2 v/ E. j& L保存session.pkl信息到本地方便下次登陆运行+ B( N: \2 ?" T( `6 K
) F* s/ O8 y) R4 I5 t5 X) S1 ?
缺点: A7 E( _! i' E: C+ n8 N+ B; i/ Qsession.pkl登陆信息过时无法自动删除。 & b# |% c2 x0 c8 ?& g: Z0 _导致下次登陆疑似cookie无法正常登陆。 * ?' x G! Z' g: Q 7 r! u0 L" G8 Y$ ^1 o# h. F/ J:return session ) l& u8 x! |% s v. D0 z4 g' F$ }7 u9 B4 E( d, F+ l$ w
request.parse(: d- @) Y3 t( K6 Q
# 臭不要脸的推广一下我的店铺 + w4 o7 a. ^9 ~0 ~) M* w* t u+ t url="https://shop574805287.taobao.com/",8 w1 {+ w- m9 e) S) b: y) d4 K
login="taobao" + P6 r! j. Z6 r/ U: s).run() % v1 l! ]& k9 [' [# return text8 c: y) @% q* L8 a2 b2 Z3 b v/ d
0 C- q/ F2 |3 v: U- G& |6 p
第三种玩法:爬取网站信息6 y0 O3 k. ^& y# Z0 F. w; v
爬虫库自然少不了爬虫的过程2 ]2 k/ _5 p2 V: v5 Q8 v, l1 L
: V5 {8 B" f% ^0 j! z' _
特点: $ Y. P; i9 S# z0 Y' s支持re库,xpath解析以及bs4选择器。& I+ d! M7 W9 B( v* S
爬取方法为字典格式。单方面输出。6 d% _1 a' Y* _, }) s
字典键为保存的字段名称。* i, V# r8 j, s- F7 s4 e6 j
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。+ S6 d$ o6 a* ]. F4 Z: z4 E
4 n( S* C2 L9 @3 u3 y* Y
缺点:暂无(等待小伙伴们发现)5 H+ g X3 r0 ^: g7 d
" b$ a3 f. W% p0 [) k
:return reptile_results, A( b) m; J6 o
/ H7 W/ N9 n6 ]% E) n, x7 g6 S0 x
request.parse(7 J! n0 \2 V1 k4 R
url='https://www.douban.com/group/explore',/ T( R6 z5 T" s( N% r
# 字符串格式,选择器方法。 4 F0 X' v5 ~# U Parsing = 'xpath',; l, }8 Q$ w% B/ v9 y' J
# 字典格式,参数如上。 ( M" T: N. T8 y! K7 x- E G4 J label = { 9 ~& b9 l, Y$ D; M% c! O 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. I( }$ ~& x- N& ?
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 j! D& H1 O1 c* o# M+ E5 z
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ Z* w# c: w1 |2 N2 e3 V
} . h- t# R, A, [: K).run()9 n2 ]8 P! V0 X; G- F, Q( v
# return reptile_results(list) $ A" k) v9 ?/ ^. ^9 f' d- G2 M' y( ~% |( H5 x
第四种玩法:自由保存信息 0 G' b" a- M t+ d目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。 $ S# z" x" p; T, h, \( W; M5 T: f8 g6 J
特点:+ k7 u6 o6 @1 ?* x3 r0 w3 o8 R
写入文件均为数据格式传入文件。 " b' K% y3 H% Y, J: r& V ~: O且输入格式规范方便阅读and省事。: a% a6 M# P# v6 W' M" T
: R! g; t/ \3 I0 V; l$ r8 q8 H- [
缺点:, W- Q2 ?3 H+ Z, L% H
保存格式仅四种, 1 {! R8 q; r4 a" A不方便用户之后读写操作。 / n) x; s% E$ N2 Z/ R* ]5 C" f- Y8 B3 ~, r
:return file& }0 g8 Q# P2 ~2 x, Y& K
7 N. }' H8 ?& I; u2 vrequest.parse(6 \3 R8 u, C) l. H. n" A
url='https://www.douban.com/group/explore',$ p% f/ u, Z# `* U
Parsing = 'xpath',- j7 A, `, Z9 @. n
label = { - l5 S7 p6 N. z5 q* K% q 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! [2 a) n. k8 S; a1 t C2 m7 w; o/ y
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str], $ Y9 n2 H+ A* X J5 }* t j 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 ?6 e& X* j: b* `0 f! o
}, 5 T9 w: @* n3 R) w K! d' y- G, f # 字符串格式,具体保存位置填写* N! y' w5 ^$ U' r' I+ d# h' R
write='result.pkl'3 O/ ^3 o" A2 o' L. {3 n9 D, s; R' v
).run() # o+ I" t9 D. v) _7 R) h6 x) K# return file# _! z2 C% m( Q; O: D/ b/ H