仅需一行代码写爬虫–simple_crawl0 N% L9 u6 {* [
simple_crawl 7 T' M. S- v2 t" l. C! Y仅需一行代码即可达到爬虫效果 " F) t7 Y# d V9 c6 G, h1 K项目地址(欢迎star):https://github.com/Amiee-well/crawl " L# ?2 w- B5 O; E3 H% X0 c使用方法/ f6 L; X% Q) T- F; X
pip install simple_crawl# ^6 B' _; Z- M" J8 J
1 ^" R' A' G6 }& M$ |2 e8 V( e* ^' i
### 以下源代码为简单介绍,详细功能介绍再源代码之下1 x) E I% ^4 E9 ^( e8 z
from simple_crawl import request4 D" y. V" V$ _+ [6 {
request.parse( # R' k c" {+ G5 f% t- X2 n* w, R # status 参数为运行状态,支持单线程多线程多进程协程以及联合 1 z% _6 u0 k: U7 x0 A status="aiohttp", - `; T% v8 I- m/ ?' Y" h # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式 K7 j+ G: L! s" y url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ c( m9 ` ^- L6 H# d
# login 参数为获取登陆信息,如淘宝等网址需要登陆信息 9 f C0 q3 H4 X' M #login="taobao"," d$ h6 s) L! X* n2 G6 ^
# type_url 参数为返回源代码格式,支持text和json,默认返回text/ w" @0 Z: i/ n2 w2 S
type_url = "text", $ m3 E0 ^1 Z+ O( f- E7 d # Parsing 参数为解析方法,支持re、xpath和beautifulsoup 9 D5 ^7 h3 W9 x/ G0 c Parsing = 'xpath',4 o, Y& h" }# N. I3 h% _
# label 参数为爬虫解析过程,字典格式,详情见下方 + U4 k" A' }( }4 b9 c b label = { $ \: N1 n1 H1 g( H# ]4 Y 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 b5 v0 g: h6 N, Q: p. k' ]0 B
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str], - [- _ `+ j4 T6 D& k7 n 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 y. P9 w! P$ {, l, }) ]
},# z6 l+ v/ F% r0 p
# write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱4 X) G) b% e7 ?. [" U
write='result.txt', 8 t, ?! _# s4 D1 R) E # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫 4 t( |% `8 q; o- i next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ g8 i8 A3 g3 c; [% q. X) o9 [9 D
# page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫 7 _0 s9 s2 N/ R( v6 R5 l* A, K page=[True,"now_url.txt"],; ~$ l2 E) G7 E$ a+ |) I/ A
# clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息, ~, a# i% T, s5 L1 z- A, d c, M
#clean=True,; V" H* o N: D' C
# texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序 $ P$ i% C1 b) B7 Q/ @2 M$ D texting=True, 6 K( d! f) f0 _, j* Z* l2 b+ j # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态$ @& @7 R3 ^7 k) ]4 Y
Thread_num=3, $ k! N3 ~7 a: ^ # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态: A9 U! V9 ^9 R# J- x
cpu_count=1,, l1 F+ b6 s' B G0 V* q! ?
# sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态 ) Y$ o4 Z' _8 w3 m" } r, B sem=5,& u# Y8 A1 B( Z, K7 o
# write_SQL 为是否写入数据库,默认否 % q. \6 V& @0 \/ a7 M # host 参数默认localhost 8 q& |; r; B7 G9 h b, I- W # post 参数默认3306 7 Q9 d+ {& g1 _. G: a m; S! H, j # user 参数默认root0 X3 C% i. G1 g; A& n' n7 ]
# password 参数必填,必须正确& |! ]' R7 ~6 j/ f0 ^ [* k8 Y
# db 参数为即将存入的数据库名,若不存在自动创建 . ?8 r: `+ d$ ^' y$ ]$ w& I # table 参数为即将存入的数据表名,若不存在自动创建4 M9 E1 j- ~3 U4 Y: j. S9 t% x4 ?
write_SQL={0 j$ ?) _) }8 \' P: D
'host':'localhost', ; `/ U- `1 a) U' P5 d 'post':'3306', * b; a" H$ F, T- G9 E$ a! l2 y$ ^6 a 'user':'root', ! F0 r9 Z" M$ a B- e, @0 W: g 'password':'123456',+ Y$ z. E, _( F: q, I
'db':'example', * L3 r6 A. m* q1 E+ V" R5 n" s 'table':'example' & Q4 P' j r, }7 H3 Z) n+ V } 5 H/ ~! K; E b0 v* C4 r).run()# Z1 V$ v( d$ o. K
$ H0 s& _+ o# G' N2 J# e介绍一下crawl参数设置: 1 v2 _2 k0 d6 c' { `, O W, N; U; f' E2 G& T# k
''' 9 f6 o( ]" R" F! V' a" Z单行代码爬虫程序执行 % @; s) Q9 U7 Z! P0 Y# K# L:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档 - t4 l" _+ S) y9 l2 T:param url:即将请求的url地址,仅支持get请求 6 h" o3 W* V6 A& U% K! m:param type_url:请求url后返回格式,支持text和json格式返回 + m2 ~/ Y5 a# }8 |:param Thread_num:即将启动多线程个数,默认为1单线程# N- m1 \! a6 f7 P
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5 $ ~/ S: G T+ b:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半 , P8 q2 }7 J L/ A- a0 ?* F:param login:模拟网站登陆,保存登陆信息 ) C2 ^# a# \6 Y; S$ C( A) m:param Parsing:爬虫方式,支持re、xpath以及bs4方法 4 F% ~9 d x7 @:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫, 8 x: f- B2 K8 r7 S0 n 多次报错结束程序,默认否 ( Q u, ^6 U3 F9 e, O:param label:选择器内容,字典格式保存,3 _3 u3 {" j$ F' h* M0 d/ z W
字典值为列表格式,第一个参数为选择器,第二个参数为转换类型 * P. |: l# n: P+ j8 z 第一个参数必填,第二个参数默认str类型2 \6 t3 U8 [. L' @0 J" R7 Z
:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否# g: P, t. l% l8 L h& S' f$ i/ J
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫 ! d7 G5 [% l4 [* g O5 Z A:param page:是否选择断续笔记接手下次爬虫处理,默认否0 U' G. a1 P* H& H' h! e
:param clean:是否进行简单类型数据清洗,默认否, N( H$ g9 S6 r A% R
:param write_sql:是否写入数据库,默认否 0 ]! E/ N- M% Z7 |6 s' { 'host'默认为'localhost','post'默认'3306','user'默认'root', 7 ~2 e Y2 O! n, X& @% n* z 'password':'密码','db':'数据库','table':'数据表', ( C$ r+ t) L3 d/ X4 j# V 检测库是否存在,若不存在则创建,若存在则直接插入,% H* ^+ T3 ~0 \
检测表是否存在,若不存在则创建,若存在则直接插入1 A5 |& ^# s& t4 p* V: A
:return True$ B/ G6 d4 U" G4 N; _
''' 8 U4 F3 P, _* a2 k! m介绍玩法 # |: C8 Q$ O8 Q& |7 `2 f接下来介绍的均为调用第三方库的情况下运行: 6 w3 V# J7 K" ^$ k/ f + y: s) u" p% D7 E; t0 w/ D! Gfrom simple_crawl import request X+ |* w( m. E! {3 d8 X
第一种玩法:输出源代码 & V8 `" {* A# [9 d6 W4 r/ c调用requests库进行源代码请求。 % R& C, _' g( ^( I6 F+ B2 N0 K7 |1 D3 P4 Y( q" Q
特点:$ e6 b4 \* u+ s( l& h6 x; Z
请求失败则调用ip池处理重新请求访问, $ T- G, Y9 u0 g7 [' U6 t$ u) H" m出现五次失败默认网址输入错误。 * A& e9 C4 C. b9 j8 d5 l5 N2 `* A支持text以及json字符串返回。默认text。, I5 J, X) R" C$ n
. w$ p9 ^- I1 _缺点: R8 A, t& k/ q2 A9 \4 P H9 x
暂时只能进行get请求,不支持post访问# [) B; z$ W7 p6 y3 h
: B# h9 g9 ]9 H+ k! ~6 w:return text or json G* `% x* F5 @: W9 N, L7 x0 X' C( t& X8 b: C
request.parse(0 G& j& u' @( ~+ Y) i$ h
url = "https://www.douban.com/group/explore", ; |. }$ H3 { ~8 K7 Q type_url = "text" ; c P4 E% r% u g3 j3 k/ }).run() " n% H7 ]3 x( v) K% S# return text , x0 I: |" V/ m9 c & Q+ B1 q" C0 i6 q% e& ]第二种玩法:模拟网站登陆并保存信息 4 n F, V7 n4 _" l7 H调用DecryptLogin库请求登陆访问。, ^; \* N7 i7 h, L; k* s8 S
4 a/ H9 ~3 F- U% t+ |$ P5 {
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源 n/ c: F; Y0 S, y- a0 t在此放出文档地址6 c; q7 G5 J- B0 M, T7 ?; b
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/- `" {" {2 E* L0 O' }9 S# L# E
, y/ @/ d4 b0 @+ A5 e
特点:) P7 }7 \5 Q+ j, T/ a/ ~5 f+ \* Y _3 ^
将DecryptLogin库中二维码继承到此库(非二次开发) ! H6 v. G" `$ [0 n) R支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)- }5 X( L/ Q; }
保存session.pkl信息到本地方便下次登陆运行4 I- U. ?" y4 n4 b
* r, Y2 K3 M' N1 B* m2 Z) I+ {: q! n9 H2 ?
缺点:! H9 f- a' O! n+ M5 I% x
session.pkl登陆信息过时无法自动删除。 7 q# I$ { k! y' G导致下次登陆疑似cookie无法正常登陆。 9 ~3 M' x! o; s' c/ l* z ! ~* @+ e% r5 L. t; Y0 m:return session 5 X& s. v, G0 K7 e( a0 r1 Y7 H! j/ |! T p
request.parse( # n7 n# B2 E" v$ n: Y P0 h0 y/ n8 w # 臭不要脸的推广一下我的店铺4 V( T3 F3 m5 p; {* A: i- R: Y, \1 V
url="https://shop574805287.taobao.com/", ; V) I* k8 z [1 D M, b9 r0 f login="taobao" 9 p/ n* l0 E* \) j% Q1 e! T1 W).run()) p; U4 N1 R* a
# return text( T5 c, g0 N) v
. j, g5 `. c2 d! x第三种玩法:爬取网站信息 , E' e- l, J& \! v1 d w) s- B' O爬虫库自然少不了爬虫的过程3 f6 O* a. q6 \
( g, Y6 ]' |8 m& o
特点: * q" ?: ]5 K# U6 z* w支持re库,xpath解析以及bs4选择器。+ |3 H8 Y/ s! A( w/ e
爬取方法为字典格式。单方面输出。 , I T2 S/ ~ w* |3 \字典键为保存的字段名称。& L# O3 x+ i( m) n5 P% |, T, q
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。$ X2 t7 m$ ~& f: D1 A# G# s% J+ T
! |3 g! ^( d) ?: W! ?9 W缺点:暂无(等待小伙伴们发现) 1 I8 s; x# O; F 6 u1 v' r+ ?% r- a0 [:return reptile_results 5 i& y5 ~1 i$ Y. y6 t @ , Q* v& _7 G2 j7 b, ~1 b+ X% J5 Z1 irequest.parse(: a+ W! |/ h; F* d! I, c
url='https://www.douban.com/group/explore', y* o2 Z$ i- x' d z" U* H; l$ I # 字符串格式,选择器方法。 + R$ e' }: p0 Q Parsing = 'xpath', : o O* @" e1 B- K* H7 f # 字典格式,参数如上。* y7 S# Y/ ~ J! x/ v# `
label = { ; z6 F' k+ G# i 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str], 2 E! I. p# E% X% r/ q& F" Q0 O! D 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str], 9 g1 C1 r- A3 B0 y 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str] 5 g4 \- i9 G, @3 k# N }2 I5 t: t8 X: x5 K5 E0 z! P
).run()9 Y6 |5 _' T- q7 ]% P2 f( y) V
# return reptile_results(list)9 Q) C6 c }- o" B& {2 {- e
3 L. X3 o. `# A# O0 K第四种玩法:自由保存信息 # ^8 B$ c1 p; R" \8 P目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。 ) ?% H! o: ~3 B. @8 s O" S' ^/ B3 ^) i0 i
特点:, L- e) t9 l) H
写入文件均为数据格式传入文件。6 [) D ~) T. p! A4 i2 [* X
且输入格式规范方便阅读and省事。' ^3 z* U7 Q* w* G! r
+ B4 z( L" `, r7 D; ~- k
缺点:3 n( n8 G! H: o, @" U
保存格式仅四种, 3 j0 y+ F @! h) Y# g. W不方便用户之后读写操作。% ^6 d- k: W h# h
7 ?5 M, _" e1 g2 v& ^:return file 7 L, L4 J3 V$ d6 ~ Y$ v z! E% q. M* ] m4 Z
request.parse() g2 ~! s) g8 N3 y- w) g& [$ U# S
url='https://www.douban.com/group/explore',6 y7 u1 o1 S/ u- O0 }1 i, f
Parsing = 'xpath',, V2 [5 o# ?" B5 s- ~( y% ]
label = {* D9 c. X* P. H: @5 Q
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str], " f/ W. G+ ?' C1 Q0 P, H$ d 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 w$ P# y) b8 L* J; a" d- ~
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]& N& T" t, \7 [5 g0 h2 F8 t8 n
}, 2 j/ |6 X2 H% o8 |% Y7 |: d3 \ # 字符串格式,具体保存位置填写 : U; w* c* C) O( L write='result.pkl'0 d( T8 F/ R8 D+ v" ?( }6 E
).run()( T1 Q- q7 _/ X+ g. t9 N' n! I
# return file! b( T4 `4 `( a* G+ S