数学建模社区-数学中国

标题: Python爬虫仅需一行代码----crawl第三方库 [打印本页]

作者: zhangtt123    时间: 2020-6-2 16:00
标题: Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
0 f, s+ T1 F" X2 T% p. E& fsimple_crawl8 U6 a" K1 ~, d8 F: v
仅需一行代码即可达到爬虫效果
- ^/ I) N; a7 v; l0 H& _项目地址(欢迎star):https://github.com/Amiee-well/crawl
; B5 H" z- J$ W) ?9 ^使用方法
, G% [) W/ P" I/ x7 K4 U+ N: W: a, Y4 Jpip install simple_crawl
3 q! _% G: O2 ^2 V9 D1 n# s* D# N! k; [, q
### 以下源代码为简单介绍,详细功能介绍再源代码之下
$ T& W' S1 ]  L/ Kfrom simple_crawl import request: P, ^, V' d* d& {  N
request.parse(  s( ?8 D& C& I$ G% z
        # status 参数为运行状态,支持单线程多线程多进程协程以及联合7 z3 a7 x: S! W0 d! t* P- A, y
        status="aiohttp",0 j. ^- t: M) i5 ^6 q, s3 m2 }
        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
5 ~; K# D# U0 U4 R; O% L! U' q        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],. I! H- n: e2 @/ _. }# @
        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息: S: R1 {$ ]0 v* B9 F
    #login="taobao",
$ @- ~6 `4 u. L    # type_url 参数为返回源代码格式,支持text和json,默认返回text- x! x9 \" P% D0 w/ a3 n! _/ t
    type_url = "text",! d( _; K- J( C* i) L& R  `( d) a
    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup3 R+ }& ~4 }) g- T+ l
    Parsing = 'xpath',5 i/ R4 c; h: }! R! @; S6 D7 L$ L  |
    # label 参数为爬虫解析过程,字典格式,详情见下方6 E6 \' B* |, a* X
    label = {$ a. H0 y& Y1 m& H9 O
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
$ T+ D9 k" ]9 U- N  V            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
/ \4 ^. ~# _1 v            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
, P2 t+ z$ U$ A2 W0 H     },
. t* ]: P/ e% T6 B( P" L# E/ i     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱5 w, I! y$ K+ W! C
     write='result.txt',
# a+ {2 e/ F' P) m2 C     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫% S6 i% q/ s1 c1 _5 D
     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
$ e6 l' d; B6 @/ k% x% K6 W     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫* m9 ]5 J" W: _6 h" @0 l
     page=[True,"now_url.txt"],
3 ]" {" \7 Y5 W" d/ U8 E$ v     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
. d/ U& F5 p1 ^6 H. l# f) k     #clean=True,
; R  ?% l2 Q# V     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
/ W& p8 F+ ^% O' `7 o     texting=True,( {. u5 f' R/ C7 d
     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
! E* U7 V, x. _$ P+ R     Thread_num=3,$ Z  {! @( i. P) p) Y) J. J3 P
     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态% Q& R) q- A  u7 L3 i+ J8 E
     cpu_count=1,
6 \" Q3 G" |' s% h" T$ Q' ?     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态9 q9 ]4 {; w1 F1 I: }+ f. u' n
     sem=5,. I* ^9 w! H* w1 j5 H& k
     # write_SQL 为是否写入数据库,默认否
% j- p6 a0 h) i, e1 V+ k( t6 I     # host 参数默认localhost) x# r3 L( ?- L- T3 E3 G8 A
     # post 参数默认3306/ x$ x5 M6 p: R2 C
     # user 参数默认root
- Q& c: ]3 R' u/ ]$ P4 V     # password 参数必填,必须正确
7 G3 Y& F) q' l3 L# h     # db 参数为即将存入的数据库名,若不存在自动创建& W; j& s# c0 L/ P7 \, k1 m
     # table 参数为即将存入的数据表名,若不存在自动创建
' \5 ?6 q' n% \0 L0 Z     write_SQL={
* x  E) t8 J- }9 b4 ~         'host':'localhost',
( {, ]6 S% [- P) I. j         'post':'3306',
3 a/ t, i/ u* w: S3 x# A0 n         'user':'root',
9 B0 p* k1 Y+ |) M7 m& `5 N2 S$ e         'password':'123456',
& o& H9 c) n" f$ M) r! U         'db':'example',- C$ i" O; q( U9 C* J; Q3 p
         'table':'example'% ^% l( X& C- v" ~4 p7 C- M# w
      }
' R( K' U5 Y1 J1 L+ H- O! b).run()% C, `( s* z; I3 P" B8 d
4 W* V9 f: R7 [
介绍一下crawl参数设置:6 Z% N9 L5 v8 Q% c& p
0 Y0 f1 d+ z) @7 u! j0 \& n8 \8 z0 _
'''6 P/ R# j5 [( x
单行代码爬虫程序执行( ]; t$ p; o6 b: [# a2 h; A
:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档/ B! Q0 m3 Y. b
:param url:即将请求的url地址,仅支持get请求
4 B- c" p8 @- J1 x) d:param type_url:请求url后返回格式,支持text和json格式返回5 O4 \3 H, I: _1 f: a8 a- R# W: n
:param Thread_num:即将启动多线程个数,默认为1单线程7 U- k. g% V! C3 {5 P- \4 E% J2 o* ]. }2 u
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5! M) n1 U4 U. h) ~0 K7 X
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半, o& `5 K# n2 m7 U2 F
:param login:模拟网站登陆,保存登陆信息. W# E, k( I8 [$ c5 O* ^% }
:param Parsing:爬虫方式,支持re、xpath以及bs4方法: T; j0 o/ S3 l* J. \# U; V
:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
+ c2 ?/ U" g/ `+ D: b& R* G                       多次报错结束程序,默认否7 P1 `& R& Y  @' w
:param label:选择器内容,字典格式保存,
( M* Q7 T/ y9 w* w& K1 ~% i% j                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
/ r' p8 B7 C& T3 l5 h4 ^. u                     第一个参数必填,第二个参数默认str类型( x! {6 M6 V$ s1 C, V/ M$ m( c0 Z8 {3 g6 B
:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
, ^: y0 J0 f1 N4 G2 h:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫) G$ ?9 a% k9 {. b: j
:param page:是否选择断续笔记接手下次爬虫处理,默认否0 b$ P+ g. [3 X
:param clean:是否进行简单类型数据清洗,默认否
7 }5 O  o) [+ p7 F:param write_sql:是否写入数据库,默认否& U* b7 C  A2 G& c
                         'host'默认为'localhost','post'默认'3306','user'默认'root',
0 G8 y' C9 E) w3 ]! D! E9 u) R                         'password':'密码','db':'数据库','table':'数据表',& s' ]$ E1 x6 S) L: @1 s. N
                         检测库是否存在,若不存在则创建,若存在则直接插入,
0 h9 C& y7 X$ ~$ M0 M% \                         检测表是否存在,若不存在则创建,若存在则直接插入" n8 ^. f" d8 ?2 F# n! [
:return True% y9 @" O1 Q! `  e5 T! i) k/ B
'''( O' w) Q* |1 t8 H% q
介绍玩法
; q: x( y9 N# x. s/ V! v4 @$ d0 j8 y接下来介绍的均为调用第三方库的情况下运行:
- l* a, c, I4 t) d
$ n  G  U' P  M; E5 O# Pfrom simple_crawl import request0 ^# b) y' v$ R1 U9 @
第一种玩法:输出源代码
3 a8 Q/ b6 C3 `6 @+ Q! F调用requests库进行源代码请求。
, ^' D, M) O3 b# ^. Q3 P/ `, h1 P* b2 @. W
特点:5 O6 D$ O, y2 h
请求失败则调用ip池处理重新请求访问,9 V+ {: |. I, K+ x3 A* M
出现五次失败默认网址输入错误。8 O( @) k. t% w4 J' j+ b( C
支持text以及json字符串返回。默认text。+ e- c) D6 [& ^6 F/ |$ F" A$ c

! R: {0 B% E( T. Q% c* D" c8 E缺点:
' I, b5 e7 @1 `暂时只能进行get请求,不支持post访问' b# E$ |- Q6 z" T6 h) j/ ^8 S

# }8 q) \( {) \$ [" Z4 M2 _6 Y:return text or json
3 ]2 I' A: s4 M8 _8 h& L. j' Z8 l& U) h- I$ H9 i( A# }
request.parse(
1 o8 |9 l$ A. l, R        url = "https://www.douban.com/group/explore",5 }" D3 ]% f! J# ]: `: t8 r: `
        type_url = "text"
: P- N* \" Q5 I).run()& R4 x% C* q0 S/ K
# return text
+ }# @! A& @$ m8 i3 G
! Q9 ^* ^9 G/ p! {/ r第二种玩法:模拟网站登陆并保存信息8 ]+ D  i% b9 o& n' R6 c' P
调用DecryptLogin库请求登陆访问。
% D. l6 c9 |9 L" K
( M$ e( G; W  c, Gps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
, X4 g6 B0 }- u: |7 u' ^1 ^在此放出文档地址9 H  j: r( `! {" m
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
/ B1 A- V2 U5 Q
! t# w; \: b: e) R特点:
0 w- W) p  y1 f3 E4 B6 r将DecryptLogin库中二维码继承到此库(非二次开发)
5 P# x9 t  J. L% A支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
  Y5 C" n& ^6 p  E9 H保存session.pkl信息到本地方便下次登陆运行
6 F, J' H+ ~, a8 _2 e
: D4 `8 \! j4 Q- t* I0 j; j缺点:* v3 I$ o. U" D; l, T
session.pkl登陆信息过时无法自动删除。
% e$ O' F: t% W0 p' F导致下次登陆疑似cookie无法正常登陆。
+ k. J8 U' J7 u6 U6 d" d
4 Y# g( w! C( Z* l4 Q:return session4 |5 X3 ~# W3 g' t3 K

2 w% P0 b! D( @' o  W9 drequest.parse(0 ]- V: ?/ q( _+ L8 [/ \- B
        # 臭不要脸的推广一下我的店铺
8 X3 o2 R, ~* V* M7 r! m/ H        url="https://shop574805287.taobao.com/",( J+ ]4 _' v, D: E" }9 s
        login="taobao"
' n! ^  T, y' s+ j0 \: H).run()
* [6 |: g" S3 \; W2 I- D( m5 b# return text
- c8 c! y9 }- @! E0 g( E* y) w4 r: j( S  E
第三种玩法:爬取网站信息& i# q3 O, r) ~
爬虫库自然少不了爬虫的过程$ R& \9 v1 P. a# n% S

+ e& d! O5 \! }$ ?  N特点:
& t- s& C  b, J8 i) ?支持re库,xpath解析以及bs4选择器。
) E6 d1 [0 r3 S爬取方法为字典格式。单方面输出。
1 d1 C' V* Z7 b& Q字典键为保存的字段名称。( s. G+ }. x' @
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。. Y" n6 _9 X% _1 Z1 T  X
" c5 ]2 Z6 i/ w% ~( u: T
缺点:暂无(等待小伙伴们发现)& m( e6 Z3 t- n1 @
3 J! I7 H9 F* o% l; A* n9 K& w% M
:return reptile_results! `7 f" `! E( g, `7 @, g+ x) F8 n
! W$ K8 Z9 H2 z6 V1 u
request.parse(3 D8 ~" P" Q1 K7 R) E
        url='https://www.douban.com/group/explore',9 B' C6 ]' l; G' j; v, h. Y
        # 字符串格式,选择器方法。
& W: t* x$ K0 g% o, I2 f    Parsing = 'xpath',
$ I4 b2 Q& T- M! a1 m0 B    # 字典格式,参数如上。, N- u7 L, z; \  ^- T
    label = {- y5 m) g  W! L; O, l1 s4 I" _2 w7 a
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& n3 `5 K1 L7 O3 ^" j/ R) D, L
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 Y1 x5 }% \5 R* A+ p# ~; a# |
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: Q. T) ~! ^9 l! e
        }' P* O' J) }4 i$ B' d$ ?  ~
).run()
4 z7 r$ @7 X6 h# v# return reptile_results(list)
5 |! M, r# m- [5 ~% F9 `
+ |" P$ U+ ]& `. _1 z; }第四种玩法:自由保存信息% V1 N! m) Y9 D8 b
目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
8 t3 B- P! ^0 k' |
! \, }" S' w, k5 u% {0 X特点:
" I0 ]2 T7 S: k% b' H  f写入文件均为数据格式传入文件。
  s* |% u; ?5 F6 [  ]且输入格式规范方便阅读and省事。, M0 b: ^4 z9 T* S5 I4 G+ O& O

7 V' h- Z0 ?0 h+ V. d缺点:
  ~1 _% X* i/ Q7 z1 D% K, {& _保存格式仅四种,
: u3 j5 y% l; j+ {- A不方便用户之后读写操作。
4 y, ]+ X3 t# l' c& [2 m+ q* b+ U
& `% a% i( b8 n2 ~% B; r# A:return file
# _- S3 x; b$ w/ a: f7 }$ f5 D  K" M; w- S- [1 \
request.parse(3 N9 K$ r# I# t
        url='https://www.douban.com/group/explore',; i/ F$ G. h' ~! n% M  B1 I
    Parsing = 'xpath',
9 s6 q# P8 J( d- M3 j    label = {6 V& E$ c4 ?" j  j% {
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
  [" W+ O  z9 z$ n5 k7 G        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 A1 R; m8 t# u! l  A# x) c& Y, w
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
, Z" E  Q  t, f7 s( D' W        },
. f6 M- r8 |! t; V" a+ B8 i7 y    # 字符串格式,具体保存位置填写
3 [# L4 A0 x3 I* X( W    write='result.pkl'" f& V( c) \5 {, s. |6 q
).run()$ c+ N' N! I2 g% t: C0 O
# return file9 z: C- G; X5 f  B# I% C

. w7 O" S5 I; `/ K3 v" `第五种玩法:读取下一页 url 地址继续爬虫
/ X; }- H1 ^! x+ c# A, d这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
, g6 m# W9 t6 C: R6 h! j9 C0 j9 q: r0 }
特点:
- g' U6 E0 e1 Q4 [# ?9 S' O继承之前的Parsing参数选择器选择方法。* c6 x; j% ~! \1 w" |
在这里可读取到解析后的下一页 url 网址。
: T, a0 L& c$ {7 S5 n方可继续进行爬虫处理。方便用户使用。
0 |: Z" P* e  B8 x5 R$ e% s' V! m% J* T
缺点:
' `% G7 I( T2 p若爬虫时下一页 url 地址改变,便结束爬虫。6 p6 G0 h+ d& f1 q6 F
只能爬取所给 url 地址中的信息。
6 a) E) b5 X0 {) w7 u( ]无法进行某一界面的多个网页爬取返回。
% E' O" h% @) \4 x造成访问页面单一流失。8 _1 H. s/ o" _1 y) z( j

' `+ Z( J' x" K- G:return None
) A1 Q+ e! M# F& I: L& q, l, E3 M' L
request.parse(& H- L' J+ x* r) |0 x% C
        url='https://www.douban.com/group/explore',
8 r+ E+ h4 x/ e5 h    Parsing = 'xpath',) o  l& L" V' d1 d
    label = {8 @( p0 v# ?$ C2 n) e9 z6 D( f
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 Y" L) L% k# s9 I5 k/ y. Y
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 H8 B2 t0 t$ N
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]7 R' \5 f0 O! ~
        },
; ^# |; Y8 v& P    write='result.pkl',  a$ W, {+ _, [2 O% i" Y4 _
    # 字符串格式,根据Parsing方法继续请求下一页a中href+ V% @: E' R. `0 P4 w1 K
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
, M. H! B9 ^3 q, u" ?* [).run()3 V& T$ x. W2 ~, G5 D6 z  L6 \# O
# return None 4 `2 d# l# F% T- K8 a- v4 P5 o( ?

  T7 ~( U1 H: I% J/ H" D3 @# ?第六种玩法:爬虫网页保存5 H/ c# J6 ^+ x7 k/ ?
听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!! ?. I0 n8 g0 p* s

# i' W, d' Z6 i, f/ H& C特点:) z) G  U- f8 Q/ a
持续输出断续笔记。, R# L% }; Q  P5 C1 v9 p
将此次爬虫的 url 地址保存到一个文本文档内部。/ n. I( W* K3 J
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
3 {* u$ E* c% p, Z3 {9 m5 I- m8 D5 o+ F7 a8 g0 R
缺点:$ p; s8 o! ?4 Y) P
读取内容不单一。
; @2 J- V5 Q* j4 s% M6 y3 ^/ c导致下次爬虫无法正确读取上次爬虫留下的痕迹。2 K8 l9 |; P% F5 o$ L$ J

) q6 h( W7 z: O:return url_file
& |6 d4 b2 o6 y4 _; R0 i2 ]
: s$ v1 i9 D, _$ o/ T6 t2 Nrequest.parse(
$ }% e$ P% l( J6 _* ?7 z8 Y) _    url='https://www.douban.com/group/explore',
6 g, Y4 S, g6 s" v3 j    type_url='text',/ }3 x; F* r& K8 J4 H  v8 D4 d8 b+ F, z4 |; [
    #login='taobao',
- u$ r3 F% h. X3 a0 H- t    Parsing = 'xpath',
, h( d. I$ @/ k    label = {* N( ?4 w; g2 t$ R8 y  g% T+ ?3 {
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
) v9 R' D' P# t        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
( ]3 F; F3 y' l  K( @4 I# M( X8 B        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
+ A# X' P0 I1 ^5 W8 ~- }2 C& t" ?# [% N        },  N8 r- Y  d) L( w2 A: k/ H
    write='result.pkl',8 X: n/ T! z7 s8 Z$ X2 ^% G! Y, V5 S& x
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
4 M: r: u  J# g  b    # 第一个参数为是否需要断续笔记。
! o( ]1 x! ]5 a; g+ E3 ?$ ?: m! p% h8 t    # 第二个参数为断续笔记保存位置。
  I3 u+ L* Q2 j( L    page=[True,'url_page.txt']; t9 c3 q; G$ r( h9 F
).run()0 o4 U9 X1 n4 R( L8 W
# return url_file0 s: I' D! H& a; O# `6 s" V

. F6 A. F- a0 v+ E3 a+ Y! s7 @第七种玩法:简单数据清洗
  v8 y( s! f6 w# i; h! y数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
) p8 Y/ q, S& ^: c
) i; m% i2 v5 ]/ t& F特点:
7 S& _2 D( Z- u9 C8 i本人曾写过一个底层数据清洗。9 m7 g7 b% m$ J1 Z
能将列表格式数据进行归分清洗。$ x. V+ B. G% v) B0 f4 v/ d
主要内容请参考另一篇文章
# _( A9 x7 {0 _9 l& Y7 s4 K- f* L4 k  Z如下连接:数据清洗
; |! h4 b# l8 n7 ~0 D5 W' o9 j0 c$ j3 @4 K# w* Z9 V5 M
缺点:
. q& V' _0 D1 r数据清洗格式简单。3 B, X# o" l+ K# J% A* E* ]' w+ H
数据清洗内容单一。
# d( F. b# Y( o, M无法完全做到绝对清洗。
3 T  F) f/ b% o+ p) X" u有待改善。/ r4 {, B! n5 h: w& R3 q+ A4 X
( v6 \! s( p3 b
:return keyword_list, value_list
: B$ R( y. S' k* X; B% R" Y7 w& U7 X/ e3 ~  h# m) n
request.parse(! ?/ B& s% P7 {5 c3 P
    url='https://www.douban.com/group/explore',
# {- K1 v! c4 O$ J+ K+ q$ D8 F    Parsing = 'xpath',
$ }. C0 o2 L9 Q, _9 \9 l) r    label = {
, S$ A2 U/ X6 F! E        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
7 I3 k+ R3 K) J$ z        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
3 b" ?: U% K# v  z+ B# s        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
7 x" I8 Q1 g( Q& V4 e1 D        },
& f* D' E, G; N% H/ T    write='result.pkl',- N. d5 V+ j  l
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
6 f# D! H1 a6 k' E( E* e    page=[True,'url_page.txt'],
* t9 c. P7 S0 o7 X    # bool类型,默认不清洗
& z5 [$ e  ~9 r) I# E. |+ b" E    clean=True
+ v" x( T( H: Y8 C0 v).run(). o% Y/ V1 p% v# v/ E7 K5 F
# @- n/ Y' T! k- `: \
第八种玩法:爬虫存入数据库0 ^7 R- O, I5 g4 Z- S2 q
存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。5 J4 N% I- ^/ b7 y; Y6 `) L$ V8 o

$ E5 U. H7 `/ u0 ]特点:
! J% |% w# {+ J0 r信息存入MySQL数据库。
5 |: a$ h/ n8 v& Q6 M可连接docker远程数据库。4 e- D4 d0 e, }$ {% v6 u9 {
数据库的库名可以不存在。9 T' U4 ~$ j7 e. B" S2 [
数据库的表名可以不存在。
( d, |9 G. e. O6 A% V根据之前传入字典键与值参数判断表类型。
7 _  P( ^5 j3 K4 n( |1 G* X' N8 \自由建立数据表传入信息。# K8 Q6 o" N) l: m' i# d
5 K& L3 C( A2 A3 d6 G
缺点:
/ F% N" b# ~  K* O+ p仅支持MySQL数据库。8 n4 g2 ]3 W# ~1 i

! }0 _3 m# }' `$ g" I$ ~3 b, m) q8 w:return SQL
. k# v! u/ |2 ^# h7 V
8 l5 r, {3 N, r- B3 Lrequest.parse(9 n& w8 K4 y: J
    url='https://www.douban.com/group/explore',6 K) g& ^( ]9 m' f; i) m$ o& o
    Parsing = 'xpath',
' i! c( s( ]; Y4 c7 A    label = {+ F8 p0 j% O! b2 ~3 e
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],' q4 I* i* D2 ?
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 y9 O9 p  O2 r. A# c1 o1 p) y
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 N5 g8 t! J) @) ~6 L9 a
        },
  Q; a: o( Z6 K2 Z    write='result.pkl',
) h0 q; w/ L$ L! O0 L" v; l    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' P' |8 k% f7 G9 |5 N- t3 A1 T0 e
    page=[True,'url_page.txt'],$ U& X+ F+ z; m/ W; V5 p
    clean=True,
  P/ S6 `! u" f* ^; K5 \  l    # 字典格式,
# E5 H7 K) x6 z* R9 H! c    # host可有可无,默认localhost8 K: p$ L) I6 f# [6 I
    # post可有可无,默认33064 `, C# @4 ^2 K
    # user可有可无,默认root7 {7 @8 ^% x+ R1 \2 _
    # password必要参数,数据库连接密码
; Q, _# Z; m* _  f; p$ `1 x    # db必要参数,数据库即将存入的库名
! Z! j: p  o/ e+ t, ^. Z    # table必要参数,数据库即将存入的表名& ~  ~0 ?1 b% b# O5 y- L: {
    write_SQL={
. r' f( n8 o- s: b) g9 _        'host':'localhost',
% \6 h  [$ l7 r% G; r3 @4 m; @5 Y4 j        'post':'3306',. u7 n' w$ G! _4 Y6 N
        'user':'root',5 ~9 x8 o! b) D- w. K# l/ Q
        'password':'123456',
1 n( d+ Y2 v4 \( T1 i2 Q* d- s8 I        'db':'example',
8 P( {. ^2 w0 u        'table':'example'  \* }& I$ N0 X7 W& m: N6 d
        }( V" B; g) P& a8 V8 x0 i
    ).run()
  w/ |4 ]' ?7 g8 {
) V% {8 ^: u* S8 g第九种玩法:重新启动爬虫' u% }/ ]- a& |8 K' [: H
爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
+ k" ^5 L/ G0 Z0 t' F& U
6 F! I5 ^8 b* e0 |- u7 W特点:+ `" y/ F$ y! m; B  `
检测报错重新启动爬虫; M( m5 S+ U4 a/ K3 a4 z/ B+ w+ k
无需手动处理错误信息1 }0 H! Z$ a( |( T

( T" q3 d( m9 G. T; _1 \4 \8 C, `$ x缺点:
( ^" Y  W/ \9 ~0 I! [5 w1 R无法收集子线程错误。9 U$ I7 N8 z8 {6 \5 O( T3 C
% o/ ~! S& a% @# }, A
:return None
# L' e* l1 H' ^- ~- T
6 c/ o* }, B) _5 A  v4 Irequest.parse(2 Q$ o* Q+ }0 ^4 b  b- b6 G6 O
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],  v; [! Z) V+ I, I" {
        #login="taobao",
+ U0 V8 B1 h% g3 C6 a* F        type_url = "text",# V5 p' P4 R+ h: e
        Parsing = 'xpath',2 ~1 z1 `5 w( {, T) @
        label = {
' U( H" ~; c4 o: d  ^) G- W9 H            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. ]6 N4 q# |  f; J5 J/ p
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ w1 y6 v# i/ w: c8 j% q
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
+ E' j7 l3 C, M# X: c( ~            },
7 P" I1 \9 x4 A% w" @+ o. e        write='result.txt',3 d: W+ [& u  \" {% E& P/ P; s$ d
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, }4 b- v- C6 c7 i! i0 u. e$ X
        page=[True,"now_url.txt"],
$ }' L& ?- i& B) p! v2 C        # texting 参数为是否启用连续爬虫
7 Z; P( X& m2 L& N" j        # 爬虫程序异常报错后重新启动爬虫! W  F, D7 T7 X2 h# v( @
        texting=True,
+ a! {5 x, N0 g5 e, l' G# f9 L        ###
$ i7 p. c* g; x        write_SQL={% y# x) {5 y9 |6 ?( g6 [
            'host':'localhost',
" R: i2 E! |, I5 _7 b2 j! U1 R% e            'post':'3306',
$ `. d5 ]: M+ C. M/ ?. e4 u            'user':'root',
- ~# N. V4 r) ~: j            'password':'123456',8 @1 Z; [  ]! Z. ^
            'db':'example',
' N' v8 ]" X, n- v            'table':'example'/ M8 w1 J; K. z6 l
            }
- p1 f$ L. n& Y. |# j' f).run()
) |4 z( E7 R' A
$ A$ ?  Y6 `7 N( b9 T2 R6 B1 G第十种玩法:多线程爬虫7 }( s6 \1 d' ?' h" |% V
特点:) Y1 T3 X* o  j& ~8 }: u0 {
爬虫速度加快,+ [/ K) b7 E& |/ T6 [% c2 h
更好的利用了线程。6 D* ~$ n, A8 `& W, r9 S+ g2 W, ~6 m
: d# b/ ?9 w% @4 ]$ E: G" X4 _( T
缺点:暂无" O" q/ N+ ?% @0 L% E
2 ?* R5 w& w' m% d( f( t  u# }0 V
:return None
2 i" U  l2 [5 O$ x
% p# e- W. v1 G( x. H. c4 S( J$ D# x$ Brequest.parse(% h6 x: }6 g) X( h1 H7 p
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
  H' ?5 G( Q5 b, Z        #login="taobao",, |: z2 j( K/ x2 q
        type_url = "text",
5 ~- i  \9 M" A- e2 Q9 \        Parsing = 'xpath',# P; t+ b2 h0 Z: O: [9 p, U* E
        label = {
- p/ @; J" b: D4 E0 k            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; C$ x5 d4 _  E+ @: H* Z9 S
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],8 U( @% z2 U: U! {" v9 r' Q
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
7 z; C$ J- f  \2 n, n( I. A2 J            },
' N3 J$ {, B6 g- C" e1 p" Q        write='result.txt',/ K) K& m3 y* ?6 _' ?- I( V1 P* H
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
" G' I- t- W3 r/ K* s        page=[True,"now_url.txt"],$ {" B3 N# X  O% b5 v+ F; q1 U' b
        #clean=True,% s5 S( i* w9 t" R1 o- b
        texting=True," K6 d9 l% c8 V/ v: l
        # status="threads" 启用多线程爬虫* A" D! ~1 y3 P$ u
        # Thread_num 为线程数目,默认为1 单线程5 w5 k" G6 v3 M! ?: |
        status="threads",9 E! v  u# Y* h9 j; C+ M! {
        Thread_num=3,) `3 e) I+ |+ ?0 W) i) R- ]+ I
        ###$ b) Q& T2 J! o6 B% Y
        write_SQL={1 O, @0 m* p- d4 W. R
            'host':'localhost',8 X4 k+ h0 M2 B1 @
            'post':'3306',. I1 i5 _$ x7 u" K; Q
            'user':'root',
) x4 z8 q+ y/ x5 d! V            'password':'123456',% \4 I# a$ q1 q0 `! y. I
            'db':'example',
1 j8 @4 e& [5 E, I7 {! N# g. O            'table':'example'
0 O5 S4 b/ s! }8 p; f            }  F# d$ r8 L) o, ~, O, H
).run()4 @4 _1 S) n5 k+ n& N

/ m3 `. E4 _3 T4 D( f4 E第十一种玩法:多进程爬虫
8 D4 B) y! i# u特点:( r- O: P- Z! x9 l1 M
爬虫速度加快,# R$ R# E* L4 f8 x( U9 K
更好的利用了进程。
% m. V* @% _" o: Z. ]' y+ Z( B. t. O& _# m) W6 [
缺点:暂无* z. J+ ?7 F2 [  W% e

6 p* ~# V# O  ~3 E( ], B- \3 J  W:return None1 b5 }7 D, w/ T" @8 V
) R# [1 s# w' H6 m' _5 ]6 h
from simple_crawl import request
+ y/ A# |! X' Brequest.parse() M, U. L& Z+ Q6 p& Z
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],/ d/ G7 ]' V  X+ a& w8 }
        #login="taobao",
, |* t) ~: P( k3 P4 |6 W# C2 B        type_url = "text",1 t2 S4 d0 X1 h# k1 N+ B
        Parsing = 'xpath',% D; R( S. w9 W8 Z1 z; Y( K; c5 Y
        label = {0 K) G: M5 K; l' T9 ?' G# G2 f. R
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 w/ }! k, I# I2 e, Z- P3 M2 \8 L/ c; F
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 A5 p# v% X7 n8 Q# P- f' }
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
# P: L# n  Z: P. e- I' Q3 J, N            },: |5 a6 `) ?, X  l8 F) K3 b8 b
        write='result.txt',
+ U/ v5 ]" T. o/ u. m3 `7 v0 S, I        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
: q/ L! w( Y/ N% G9 q5 u+ S        page=[True,"now_url.txt"],
6 i7 E) ~, e& ?& |) x# q4 J/ s        #clean=True,8 u' l" x- q+ \5 F$ \
        texting=True,
+ X2 q% R' Y: S1 P2 @7 y        # status="multiprocessing" 启用多进程爬虫' ]3 g+ i7 c% j1 Z* C. L* w2 R! y+ ~
        # cpu_count 为启动代码核心数,默认为系统核数一半
; l' s# J6 I! v# R* G  U, n        status="multiprocessing",
' U! M! u  |" U) l        cpu_count=2,: C# H9 H9 v7 o/ d0 q& H9 _
        ###
7 w1 M1 q2 d; [! q1 S% v        write_SQL={
2 P& b. l1 B/ X5 |4 y            'host':'localhost',2 e% G: x! K- q8 U
            'post':'3306',
8 f$ ^8 [# Y% w2 i            'user':'root',! w1 k. U8 q5 A/ H8 O
            'password':'123456',
9 h' T+ }" L+ [. G2 R4 d$ J$ ]            'db':'example',
6 u3 [, l1 c2 ~/ _. ?# Y. b% S            'table':'example'
3 q% i3 H2 L% v0 h9 N/ _            }
+ S: c8 F; O, J: m).run()5 S' Z+ d1 }: @; e2 z2 d( d! N- j+ H
/ u9 b% j2 u2 Z. B! B1 ~: k) C
第十二种玩法:异步多线程爬虫
! a4 G' b: X$ \; S. A1 |  u& I& o特点:$ W+ ]1 y2 z" V6 {$ U8 W* q
爬虫速度加快,4 F; I  I- K5 A0 U  ~
异步使得爬虫无等待时间,% z9 v& h# u; m( ~
同时使用多线程速度明显加快。  J' n# U' P& K6 N7 ^7 q

- O% f) ?' q+ P' X缺点:暂无
5 u+ L' h/ _, W5 b/ P7 T& w8 X% i6 @* u" a, M  ]6 x
:return None* r3 j/ i5 m1 O! s  p! I* q! Y
  X, `. y& {. w  y/ h
from simple_crawl import request
9 |: Y  I/ e% _3 ]3 q5 Z, Frequest.parse(
7 v! {$ t$ [# t+ u        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],; D% I0 @8 ^" @& f4 i
        #login="taobao",
1 F9 r- v; l! l, ~5 v6 I, G0 {" W        type_url = "text",* }2 ?8 ~( h/ z5 C
        Parsing = 'xpath',3 G6 ~0 O$ s2 \
        label = {
( e) Y; `6 l  M  h# k            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
: N. }1 @- d! V8 }            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ C+ ^5 W1 E+ _) v: ?! @, E
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
* H1 p& ]* i5 J            },
# Q: Z% b- U8 p3 O        write='result.txt',9 e: T6 ?' U" J4 t: p1 S
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',7 n6 K- S2 s: S! w$ m; C
        page=[True,"now_url.txt"],
& P$ l8 X; }, q/ r; F. @, n$ r8 ?        #clean=True,
4 H( J( e! P' G' _* a! l* r: ~        texting=True,# x# h# G9 ~5 u* s
        # sem 参数为异步引擎数目,默认为5
% U% @% I4 J$ C9 A1 S& i, y' L        # 其他参数同上6 G1 M8 I. \& k4 T
        status="aiohttp",
9 K8 @2 E9 ~4 X# A        Thread_num=3,% Q2 S2 \# a9 z& }+ x. O  a3 n
        sem=5,* }: z5 N5 ], C: k
        ###
- w% E- R# R& t0 ?        write_SQL={
$ }5 C) Z. L* z: i/ y& Y# B" f            'host':'localhost',' Y' ]; Y3 C2 ?  V- a8 R# W
            'post':'3306',( z/ b* J( t& `4 U& i1 I* H8 s6 d
            'user':'root',  m+ V5 n& V7 ]& g0 k/ Q
            'password':'123456',; ?) Z. v. y; g
            'db':'example',
) A; H) `8 ^- F. n; r            'table':'example'( b$ D( F" F. V% Q
            }
& p3 @" j/ W( |) J* c).run()
* K; [$ ^$ w) [! u* a4 Z" h' X' e. i7 P
第十三种玩法:异步多进程爬虫
+ _: l! O1 X2 B: m+ y特点:
( Y! c* B2 L5 R, u1 }$ F爬虫速度加快,
; H" D1 E% A0 K0 G) Y1 _5 n* Y异步使得爬虫无等待时间,5 J  w, i0 M8 J' f. y" K1 Y
同时使用多进程速度明显加快。
( h6 f  n1 k" c. I" k$ L5 r8 P: y8 }) L) a; k5 f0 E2 \; d$ s" k
缺点:暂无
3 F6 u2 m& y0 ?* m
4 m4 C6 M/ l; A# Q' t  A# c! E:return None$ l7 g7 U9 d/ ]$ ?. s& x
( ~) {# @; A) d1 z
from simple_crawl import request3 y, Y) V( L& P- z
request.parse(" K" \4 C, x3 o+ f
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
5 y3 @" j6 ]8 Q7 I" O0 K9 x! S        #login="taobao",
* e& z. V  j9 T3 Y: r- j( {- _6 e        type_url = "text",
& B0 P$ d8 w) H' w6 l0 i* ~) A        Parsing = 'xpath',
) y0 I. n' i, S0 d        label = {
+ u7 I, K0 d  r% {, y6 W            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! a0 F7 Q: S8 z& B# e: ^
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
, d3 m+ j1 d. }: u7 t/ V0 Q            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 k+ }/ c) N: {1 V# Q
            },; i" v9 [9 {0 T- g7 O* d) r, M
        write='result.txt',; M3 g- b9 ?1 y4 _1 p! X
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," ~) u  h+ x7 }0 H; Y1 o7 K
        page=[True,"now_url.txt"],
$ x+ y: C& m; u        #clean=True,' x+ d6 Y% r# O# \. h0 D
        texting=True,8 ~& O8 a  Z+ t# w2 A* m
        # 参数如上
' @- k$ R) ^  o" l        status="between",
2 B. ^! R4 K0 t; e2 [        cpu_count=1,
$ R5 M/ }6 ], {" H" G        sem=5,
) I) U9 Q+ b5 }1 S. @        ###4 `5 w4 e- L6 g0 `) O; m
        write_SQL={
+ h9 R; C& o6 B3 u  N3 p            'host':'localhost',1 B" f/ j  F' {- v% f
            'post':'3306',
5 @5 p$ {' i5 m            'user':'root',. R  n6 S5 T8 T. ?( G$ H) p
            'password':'123456'," m$ P4 E* w+ j
            'db':'example',: c, J6 Y9 o7 A4 J3 I& t
            'table':'example'
) p( M  g" J2 J# U& _+ F) X            }- U+ M  P, H  X5 Z' ^* E" J# \& N
).run()
" J8 C( ~( O( O/ E5 k! F- B
3 Y& g4 `. e0 k: @0 h+ K! y, B! `# v2 E+ q3 g+ O
功能介绍完毕🤞, X4 i0 y% E5 y7 F8 z1 r" F
最后还是希望你们能给我点一波小小的关注。1 p; M/ Y  a4 N  W$ ]2 S3 w4 n
奉上自己诚挚的爱心💖
8 p7 F' z& f8 u4 q: @" [; ~————————————————
0 c2 T3 a4 Q9 ]0 u版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: n2 e/ |9 c0 z* t  ~9 G原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684! @3 X1 D7 B3 M# m9 i

4 N  @# V% H* C
1 }: G% g9 C" p
作者: 738391227    时间: 2022-2-19 15:34
66666666666666666666666666666
0 P+ G0 |! P5 C% @




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5