QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5541|回复: 1
打印 上一主题 下一主题

[个人总经验] Python爬虫仅需一行代码----crawl第三方库

[复制链接]
字体大小: 正常 放大

326

主题

32

听众

1万

积分

  • TA的每日心情
    慵懒
    2020-7-12 09:52
  • 签到天数: 116 天

    [LV.6]常住居民II

    管理员

    群组2018教师培训(呼和浩

    群组2017-05-04 量化投资实

    群组2017“草原杯”夏令营

    群组2018美赛冲刺培训

    群组2017 田老师国赛冲刺课

    跳转到指定楼层
    1#
    发表于 2020-6-2 16:00 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    仅需一行代码写爬虫–simple_crawl  l* F: q! {  ~7 E
    simple_crawl, Z9 O; T# `0 G
    仅需一行代码即可达到爬虫效果& ~+ r3 h& r4 O) L. M, ~1 r+ M7 b
    项目地址(欢迎star):https://github.com/Amiee-well/crawl+ G+ i* e' L. X2 S' h+ h7 G# |/ f" Q
    使用方法: n) v+ i6 j/ A$ K
    pip install simple_crawl4 |/ b0 R; ?# ^0 D6 v

    2 i6 G* G! N. C3 f% N### 以下源代码为简单介绍,详细功能介绍再源代码之下
    ! l6 ~- A% B: z' p# ]6 w% M( xfrom simple_crawl import request
    * ^6 p8 [; D4 j) srequest.parse(" M! m0 Z& T, s. k& K" `0 P% a
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合/ C% k$ ~6 T. Y2 d* y8 T2 q6 \
            status="aiohttp",
    ( I5 y5 @, k: S$ B$ {8 O* u        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    2 M" ~; ^* Z" C% H        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    / |; x1 {6 \# p( F: i5 S        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息* b6 ]7 H: Q: c6 g
        #login="taobao",0 O7 b7 E6 r* y9 F* z
        # type_url 参数为返回源代码格式,支持text和json,默认返回text0 [3 r0 Z+ z0 r+ \5 f& [+ F
        type_url = "text",3 h4 P% ?  c! o, L1 X
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup- v0 `: i* B! _2 B" S
        Parsing = 'xpath',
    ' \- g/ Q# s3 e1 m2 q5 t% b    # label 参数为爬虫解析过程,字典格式,详情见下方
      ~: X0 u" _7 I2 e: W    label = {
    ! Z) P# d9 q: f* r6 L            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ s/ @1 {" C1 ~7 _
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' ~% F. d, v& _( a8 _6 A/ n1 R            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    " a! L+ t" N4 b1 t8 q% h$ ?     }," h8 h! V# p( q$ r$ z, k
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱  T' A1 m3 Q' f! I) }% l/ d
         write='result.txt',
    , O2 R0 j! @2 ?; m2 D# m  [) o' o/ u3 Z     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫. S8 ~' ^2 C. G! @
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 B( G9 Y6 ]- t5 K     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫( |8 p/ e% h+ P/ M
         page=[True,"now_url.txt"],9 z* `, H, n6 }5 A, H( E4 H
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    3 |* k. w9 s' G! s/ s5 Z/ [     #clean=True,
    5 v: [0 k) A! B/ n6 T  K. K     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    ; {1 d* g0 s# D1 N. g+ R& h" Q     texting=True,
    9 E' A+ ]% f7 b+ C     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态: G0 q! Z9 {$ `; y
         Thread_num=3,& x- \; ^: O  O3 H  V( C4 w$ v
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    / F6 L1 b" g4 A" S     cpu_count=1,
    & c3 S  B( H) Y% r* d9 \     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    / J4 o& O) n7 k8 }$ c     sem=5,, b4 U' q5 N! u% `
         # write_SQL 为是否写入数据库,默认否/ k7 p) G6 L3 x0 `& ?+ ?
         # host 参数默认localhost* `- u4 b! [  g& m
         # post 参数默认3306
    5 }. m+ \3 n. `$ o     # user 参数默认root
    : r" y+ Q2 i. D4 Z3 |     # password 参数必填,必须正确
    - A8 V- Y) a: b. _- t3 z     # db 参数为即将存入的数据库名,若不存在自动创建/ w9 s/ y" P' S; ^: q
         # table 参数为即将存入的数据表名,若不存在自动创建
    # |/ H  E- k4 w  p     write_SQL={
    ( |+ w( |5 q) b& e" I         'host':'localhost',8 V) D& l) y# Z
             'post':'3306',9 P3 X3 J2 K) ^  X1 N) ?" P
             'user':'root',
    ) \7 v8 B5 ]2 @; P: A  V" o         'password':'123456',$ Q2 o  M% h( w; X$ m
             'db':'example',
    * g8 D' {2 a! ^. g7 E; }8 y         'table':'example'
    ' K8 X! g& @' `5 S; f      }
    1 b& S) D4 N: R3 C).run()
      R% L" m/ h0 T, a, e' f' N$ ^6 }- n/ R, R# }1 Q
    介绍一下crawl参数设置:1 w' G) o) r# K4 A$ Z) P
    3 k2 Y2 E- `# ~  f1 ?( U3 y
    '''5 m9 \( z8 C2 u2 F
    单行代码爬虫程序执行
    ) [. u! x. J# k4 q% G+ P7 i* b:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档& l1 _9 w8 I( T7 O2 G2 j" u) w* ?
    :param url:即将请求的url地址,仅支持get请求
      x: }, o9 O. m+ Z! g: E:param type_url:请求url后返回格式,支持text和json格式返回/ s6 {- s3 V8 z6 J1 K1 D) U
    :param Thread_num:即将启动多线程个数,默认为1单线程! R! m7 q# ]6 y' I; {& x8 l1 W
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5( v( a2 o" \/ {7 Q( K+ K
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半$ Y: p* y2 q0 c
    :param login:模拟网站登陆,保存登陆信息, t! Z7 h3 P7 a! b, H( K) }) K
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
    9 O1 s' a" {% ]% m6 p6 y8 _:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    6 P2 {; K3 t  W                       多次报错结束程序,默认否5 S; W) [$ Y- u5 E. ~3 C3 }6 A
    :param label:选择器内容,字典格式保存,. K6 w% Z1 O7 H! C* h) S7 m4 o
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    ! U# p$ `/ b4 m3 f( z                     第一个参数必填,第二个参数默认str类型7 c8 ~' K7 K4 ?$ I
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否+ t, O$ Q' V5 h2 X
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    6 {& I5 M6 a3 i0 F1 g# g:param page:是否选择断续笔记接手下次爬虫处理,默认否  m/ ^" P; O8 [. N" g" l5 T" R
    :param clean:是否进行简单类型数据清洗,默认否# u# X, P, A* }+ ?& E7 C
    :param write_sql:是否写入数据库,默认否9 U' ~& V& w; r) ?, R# o
                             'host'默认为'localhost','post'默认'3306','user'默认'root',5 k: S0 R* x( s
                             'password':'密码','db':'数据库','table':'数据表',* L; S# V7 O6 H
                             检测库是否存在,若不存在则创建,若存在则直接插入,% E+ [9 h5 z! E/ W  G
                             检测表是否存在,若不存在则创建,若存在则直接插入
    : o; e2 N' S! T: z2 V6 w:return True' x$ e& I9 f1 Y7 B+ E7 j& j
    '''$ b$ z9 m; K' @( @7 t
    介绍玩法
    * T5 R  Q9 W- O( w, W) ^$ I接下来介绍的均为调用第三方库的情况下运行:
    6 {: u# x# u4 X) C5 v5 ^
    " O3 {% Q9 j5 m  F  H8 X. Yfrom simple_crawl import request
    - |1 d4 \5 Z7 Z/ M第一种玩法:输出源代码% |  _4 A& |- ^. b( G4 p
    调用requests库进行源代码请求。
    0 b7 \+ }% q  e. c) m
    ' X/ u' z4 j8 E1 R. A特点:2 R+ N7 ~1 f( K  o" u6 d! E
    请求失败则调用ip池处理重新请求访问,, b, W: F9 f' n
    出现五次失败默认网址输入错误。
    8 c3 E9 O' T2 W) Y' w) ^3 E  k0 v支持text以及json字符串返回。默认text。
    & n! _1 b4 I/ ]' H6 X) e6 d
    ; j. F: k  t: Q7 H# @缺点:
    0 @6 K+ t+ V8 f9 L暂时只能进行get请求,不支持post访问
    8 G9 v1 F; v( N$ z3 q+ m6 y8 @; I# h
    :return text or json
    0 w8 K# A1 S+ t( \
    + ~5 S; h4 ^1 w4 c) g% K0 nrequest.parse(/ N5 Z/ C% W$ C2 w& A
            url = "https://www.douban.com/group/explore",) h/ D6 F+ `: x" E0 N5 }$ k
            type_url = "text"
    7 e. m; @9 K# `! n' @5 c9 z- j).run()
    8 S) r3 G7 ]5 M) J: a# t# return text5 g( w4 G2 h7 m- {  R
    6 a9 e: s' D0 J' Y+ |3 I
    第二种玩法:模拟网站登陆并保存信息7 w! k: C) M$ u1 t2 ]% x. l
    调用DecryptLogin库请求登陆访问。
    % o/ @" e: I* e1 s) ]1 I4 J7 f8 z* v+ M! E
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源% \, R6 P; a( F" Y) {) P; {5 R! Y
    在此放出文档地址
    . J% C: P7 |# b0 G" x0 {. l9 pDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    , L& F1 B$ H* B8 g) `. u! t9 u! Q2 ?
    特点:2 a6 n  G9 E7 k
    将DecryptLogin库中二维码继承到此库(非二次开发)3 O' a, a$ l) H& H" \8 X" x
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)$ M( h3 }6 o) ^
    保存session.pkl信息到本地方便下次登陆运行
    1 q1 o+ H; K+ _; h) \. W. ?. p( c! X$ \" |
    缺点:
    ; v5 i2 h# w! psession.pkl登陆信息过时无法自动删除。* S' |* }# f% |0 b; X# U8 z" m
    导致下次登陆疑似cookie无法正常登陆。3 J& O: ~" R! D

    , I% o4 c+ o. j- A:return session
    + b  y, B  S3 y8 Q3 e3 f6 h$ b! ]" B: B
    request.parse(3 p+ z! s. @& Q+ N
            # 臭不要脸的推广一下我的店铺9 x3 |$ R$ [! c  D' }( \  i7 l1 `
            url="https://shop574805287.taobao.com/",( W( i$ Y* |/ _* Y7 c
            login="taobao". G/ ?8 X/ ^# y$ t! g
    ).run()& X% Y1 a: A9 a- P; I" L" j( x
    # return text
    ( I7 I$ M0 N8 ~+ v3 z. b2 l9 g
    7 Z1 ^- T9 `, }' Y9 Q, Z第三种玩法:爬取网站信息& Z7 }7 J" h) j+ a: r! G, l. ~
    爬虫库自然少不了爬虫的过程7 X: R# `0 {& L) w( H
    7 M# m+ J% Z9 t' R4 f% k( m
    特点:0 h3 e8 p$ B. e$ L" Q/ D
    支持re库,xpath解析以及bs4选择器。
    : x& u" E+ q/ b爬取方法为字典格式。单方面输出。
    % f/ f3 `$ D9 s8 u* G" ?字典键为保存的字段名称。
    & E, J& ]5 O% H( l, j0 X字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    * h1 D7 r2 M$ x% r0 D+ G& s2 k2 _4 X& f/ O/ R- h, O% ]' i
    缺点:暂无(等待小伙伴们发现)
    2 B* J1 {4 }! p+ m6 e( y1 Y" z9 Y9 u$ t
    :return reptile_results5 e1 \% G) _" x2 c$ h/ _6 o

    6 y; M) c" g3 u4 s4 qrequest.parse(( H5 ~2 o/ R" h
            url='https://www.douban.com/group/explore',
    4 |) x& E: O5 L* L        # 字符串格式,选择器方法。8 B2 U( g" X4 m8 @& h7 Z: {: ^
        Parsing = 'xpath',% j4 Q% f& f# J
        # 字典格式,参数如上。
    7 _) D: g- X# N/ ?    label = {
    1 [' O* p( j; x% e8 P3 K        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ d% C6 |& k) V  ^3 s        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( g8 `8 Y0 |. m, L$ g6 Q$ b
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : n4 C. [8 d1 R& O  G        }
    ' Q" x4 W- `0 i. L).run()6 h+ k$ |/ D8 t* v
    # return reptile_results(list)/ }# \! Y3 u8 b$ \) X+ A1 t! }) w

    1 }' F" }2 S" |- n" F第四种玩法:自由保存信息( O# E8 T% o. }+ e
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    0 V6 j; t4 Y* J. ^  @
    * ], ~, W# g; Y" L- P- w9 z特点:9 {- C' h  y; H, P0 l, f
    写入文件均为数据格式传入文件。
    - K3 i0 i2 W8 m. F且输入格式规范方便阅读and省事。
    1 C5 v5 o$ i+ X) @8 K8 d: g" e0 R$ s; D; V6 _
    缺点:
    + q" _) R8 D5 w3 |4 z8 [0 {7 i3 w0 F保存格式仅四种,
    " I" Q& s- ~/ `7 _# M: e不方便用户之后读写操作。
    ' k0 F) y7 j3 }; Z1 X! I% }* ~; b. s2 z' W! f5 g' j* s: \2 h
    :return file$ B* @7 A* M- f/ @' q5 c1 @, I1 }9 Q5 a
    ( F& s0 p" Z9 y$ n1 t
    request.parse(6 h% f* i- E7 o8 j- Q" |. c
            url='https://www.douban.com/group/explore',
    5 v8 N' a% M; ]# j    Parsing = 'xpath',
    9 {  H$ t* k+ {  C1 a- `    label = {
    / R7 D) ^/ Y) }0 B  u& Y8 M" g# j        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * b& k- m5 H6 g4 ?" b8 j8 E% N        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 h$ |% X. N: U+ _
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 H* A/ [' {& C( q0 Q! r& S( M% m7 \
            },  F; F+ X! V% v& O+ T) n
        # 字符串格式,具体保存位置填写* Y; n) l2 \/ v1 z& m/ G
        write='result.pkl'  R! V- i# R: c4 ]
    ).run()
    6 w8 Z7 V3 I! h$ Q- h" K7 B# return file
    ; O6 y: V, b: [+ s+ G( T
    ' p" p6 f' O/ a5 O* V8 I第五种玩法:读取下一页 url 地址继续爬虫
    $ }- G$ i! P4 A8 F& a" v这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~9 L) X) x" O9 D3 Z+ Q7 D

    ! N! z: h, W- F( e2 s特点:
    0 Z) k( |$ ?, M8 a  n0 O继承之前的Parsing参数选择器选择方法。+ J9 U6 _: J: G/ x
    在这里可读取到解析后的下一页 url 网址。! Z- k9 ~0 h- `' H; U
    方可继续进行爬虫处理。方便用户使用。  k1 V9 ]" L+ Q0 c: P8 ^( A+ [! p
    5 ~$ h* k5 z! q, w8 c4 n: G$ W! R& Z
    缺点:
    % ]1 F/ D' I$ t8 k+ k若爬虫时下一页 url 地址改变,便结束爬虫。
    / {- n; I% v, M7 S, i" w# l# R只能爬取所给 url 地址中的信息。
    : ]5 _' e. |$ `& L: p' c无法进行某一界面的多个网页爬取返回。3 O  H6 l: k5 O$ d# h+ U" E
    造成访问页面单一流失。/ D, G: F8 H/ G; e# P) m) q
    . T$ N! ]& B- l. N& s
    :return None8 m/ K/ i. u  M1 c3 X% n
    ! C3 k0 Y: z. G) j' e* Q: c3 p
    request.parse(
    , x" Z9 k/ f: e6 \5 b        url='https://www.douban.com/group/explore',
    / B: `8 p. Y$ m2 j5 G% {- u    Parsing = 'xpath',
    & E7 o/ o! F7 a  V# a# M4 a# |    label = {4 h$ i7 l/ A  ~& }
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ s6 x0 C$ x2 B
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
      i! }! v7 z' X& F2 e9 H        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 y* k' l5 X+ z4 B, e# H) n+ H; C( R        },9 B/ j% Z' Z, d8 R4 }! y/ `) s
        write='result.pkl',1 N5 K1 [: x8 H/ ^* u: ~8 y
        # 字符串格式,根据Parsing方法继续请求下一页a中href( I9 H9 V$ k- k5 P5 V2 n" t7 ~- s
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * Y) a9 d' S$ `% K* k).run()
    , p+ b1 n1 j$ X; m* X6 _* l# return None
    ) x7 k0 [" Q! h: f4 h; g
    - f. J- b( u) x  l$ \. [$ a0 E第六种玩法:爬虫网页保存$ t: s0 w; O6 e1 T5 v
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!$ B+ Z* I; D  E1 S

    4 P' B# F8 @# [6 ]! i特点:" {  ?. S5 u8 ]3 d5 ~+ i% b( Q* n
    持续输出断续笔记。
    , a+ d( t$ C& b* {$ x/ ~( A" D将此次爬虫的 url 地址保存到一个文本文档内部。6 u& e& w4 N9 h% T# `
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    ; v4 |5 q/ J& y/ ^9 f5 v1 K. }2 }% d& g
    缺点:
    * n  i! u8 a% {2 z2 O9 }* B读取内容不单一。4 ^4 j) V! Z! J4 p
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    7 W! L: f& m- `7 X
    0 }) N3 ^4 r: |5 L( N4 P:return url_file
    $ L3 V* `2 A6 j' {, Z- e: {: T# `) a5 S8 j& h% b, Y1 N
    request.parse(
    , i6 I0 ]5 t! S5 v1 {    url='https://www.douban.com/group/explore',
      s; t- ]+ Y$ c' p    type_url='text',
    % i/ f) O$ ^( y+ I* m/ A    #login='taobao',6 s1 N. K2 d- p- D; o
        Parsing = 'xpath',
    : C0 e' _4 h5 g9 k( s    label = {
    + H- }7 `, Z( y% ~8 Z* E& M        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . J& l$ t% d  l$ l# O        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ H# X; A& E' R1 d9 J/ C        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 r4 H6 q$ y3 D        },
    + Q& `- I* |  A5 b4 T  @! E+ V    write='result.pkl',  g# N1 D+ s; R7 `9 _5 b* I" c
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) g: f8 ~$ D% n    # 第一个参数为是否需要断续笔记。
    $ |$ h' x- }' u( I4 w+ R    # 第二个参数为断续笔记保存位置。3 T' ^9 p, b3 G: K/ O+ `! }
        page=[True,'url_page.txt']8 A- @" S, L& G; b$ ~! ]9 T: E
    ).run()4 h3 ?8 G( O  x
    # return url_file9 g# Q- T" X1 @3 _8 B0 a
    2 r2 }$ X3 w7 O/ ]8 F
    第七种玩法:简单数据清洗
    * I* _- v  o( t) F3 U数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    # H+ ~/ r) B$ ?7 D) c6 ]: g, B2 h$ j6 N6 ~6 X2 W3 s
    特点:
    " u' Y' M' @  u  G- m本人曾写过一个底层数据清洗。
    8 u) ~4 w6 I) A0 t能将列表格式数据进行归分清洗。6 L! q! T; q1 z! ~2 f
    主要内容请参考另一篇文章( b8 h# S, h" ^
    如下连接:数据清洗
    # t9 u, i7 u+ d+ }+ @* H/ |$ E7 x# t' V; j  F
    缺点:
    & T" ~" `. p2 f( p) q数据清洗格式简单。/ f$ i2 K0 l7 U- r) k
    数据清洗内容单一。6 C6 y7 N0 t' l. \% T6 V. r
    无法完全做到绝对清洗。! s7 {; A/ q( t
    有待改善。4 O. E3 u4 n7 H4 G( i8 A# ^

    0 [9 e0 V0 q3 I' g:return keyword_list, value_list
    ( J) _( p4 d4 Q  `- O9 |
      }* r* F- l( z' w0 @request.parse(& z% {* B$ @+ g0 d/ o
        url='https://www.douban.com/group/explore',
    ( I. A( q$ g: V4 S    Parsing = 'xpath',5 |) A# H0 f$ T7 Q! A' I7 l' g8 \' f2 d
        label = {% f! g2 a* K4 C; ?+ A) O8 J* p0 G* E
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + R" c5 c, G7 T; Z$ q- W' e        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 j" `  \: n3 J" C0 I. s! x. o7 G        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ @$ a1 [5 l1 e+ o" k
            },8 |0 m% r( b/ N1 W7 c) K
        write='result.pkl',4 s; H4 b. M  q1 k7 X6 L8 q
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',% j4 J" X: r  K, c4 a7 f2 X) [4 L
        page=[True,'url_page.txt'],3 `" A. F0 R; E" s: P
        # bool类型,默认不清洗
    2 z2 o3 ?; B# N8 \    clean=True
    : ^, D% i& O" ~( y5 i' @6 S).run()
    + m5 Z  d: K' _
    & x# j: W( L. ]6 C& z9 l( ]5 D6 W第八种玩法:爬虫存入数据库3 t* [: ]1 d# M+ {8 z+ A
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。+ Y8 a8 k5 v6 `
    7 m, m3 u  M/ k* T! \4 H
    特点:5 S* i9 F+ K* F4 H6 t6 a/ z
    信息存入MySQL数据库。
    4 Y! c. {; f, ]7 d: ~可连接docker远程数据库。2 D# O+ m! R1 u1 `  d0 v
    数据库的库名可以不存在。3 Z4 `4 z# p' q+ ?3 L. x
    数据库的表名可以不存在。# V/ c( b& c9 a% M$ w( x
    根据之前传入字典键与值参数判断表类型。! |2 r+ p: ]. j) v5 k* i! y
    自由建立数据表传入信息。
    8 o6 R- Z9 e8 }4 o1 L) u% W+ h# s6 x! \: t6 [
    缺点:
    * a6 Z6 H7 [5 S1 f  j仅支持MySQL数据库。
    * W4 K/ d; y2 L+ X( }8 w
    6 q2 ^/ n( j0 x) T' g* d1 E1 y- T:return SQL; Y, ^9 Y5 g5 V2 Y) D. W) U' C' W: e

    7 l1 T+ s* v6 d, Lrequest.parse(! l1 t9 L) L- M% B5 o+ ?3 i
        url='https://www.douban.com/group/explore',
    " Q1 F3 f8 d9 m1 x    Parsing = 'xpath',
    % N# [! Y* t- u4 v9 g. y* [+ K    label = {9 Q1 c8 E0 H- U
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  e# r3 t3 [6 n
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 C0 O" B7 L8 M# H) ~8 H1 R        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: f) _# F6 z" V" \8 F" p5 P' J
            },
    # F, u* b* v$ C% L5 D, B) O# w. f* A' e    write='result.pkl',
    " p7 {6 Y- d! g    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," M! V8 c0 D4 f! `
        page=[True,'url_page.txt'],  s8 r) h; E5 Y4 {- k$ t
        clean=True,
    - b5 Q! ^) N& n    # 字典格式,6 E  j; o. t5 G9 V; I5 x& Q% H# r: y
        # host可有可无,默认localhost
    ; |  }7 k+ {1 y3 J    # post可有可无,默认3306$ x# h7 A" b- V) ]
        # user可有可无,默认root* y7 S5 m$ h& H, G. D$ G+ B
        # password必要参数,数据库连接密码! i4 m8 d/ Y: P% @/ W
        # db必要参数,数据库即将存入的库名
    0 w9 K/ c. d: ^! }/ K    # table必要参数,数据库即将存入的表名& ~9 @. c% K+ c, J! P% @
        write_SQL={2 n8 ^( s& E# |7 r* y# i* M
            'host':'localhost',6 F8 h' L3 _$ i( P0 {) l: z8 R
            'post':'3306',
    , e/ f3 {3 y* U4 W& g& G9 ~& ]% d        'user':'root',& G0 u3 E9 }  s# s1 }
            'password':'123456',* Y/ V+ w+ ~; d8 A: w# z8 t9 P
            'db':'example',6 ^9 v# i: j" }7 ~( k: T
            'table':'example'. e& L2 \6 `0 X
            }
    5 M& h8 e, X5 x# {2 j    ).run()- e7 }+ }* l1 U' r+ t/ V. W
    " X: g) L' T- N7 p
    第九种玩法:重新启动爬虫
    # D  m$ i; V- F* N) y2 u6 L爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    ) N* I/ H; [" |8 o3 [/ ?5 M# A* b! U' e
    特点:
    1 F4 E6 c1 |; m# ^$ J! ]检测报错重新启动爬虫. V3 s' ], [" Q* j, |! m
    无需手动处理错误信息
    7 Y, ?$ K: P; V' `+ n
    $ E# G9 j# H! K  M& P缺点:
    * i5 \# |2 o. [  j  ^无法收集子线程错误。
    . L1 I- }! }3 x8 K+ Q& O! j! D9 ?
    0 x0 ^7 D: L  {+ I* X, K' T:return None
    7 {" t/ h" }" p# p; e( j  ?, Y- i/ {# L8 H6 d$ ?
    request.parse(9 U" s! k. h' t/ d* p/ _# H
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    7 Y! S( D4 p, x  [. W3 P3 C2 v        #login="taobao",
    + y8 V0 w( l# B$ F  t4 O        type_url = "text",
    # b9 T7 D% Y7 {% x7 J9 U7 P% t* F        Parsing = 'xpath',. K2 ]2 O. ^- E" b: K
            label = {0 g- \# A" z9 t( n+ L
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 ?  B0 E: j# V2 E+ X
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' ?4 p, [7 ~0 i2 G+ j$ N1 B            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]% P7 T( a% z. O9 h" H' R; ]
                },
    ( Q2 o7 u$ ^& C7 |7 L+ K6 f        write='result.txt',
    $ Y6 ]* B5 E& H1 g1 Y' Y. o        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 y# i* o7 ]- D        page=[True,"now_url.txt"],
    , K9 ~4 g* E* c8 j4 H8 B        # texting 参数为是否启用连续爬虫) T5 ^8 p2 {% z( u) U/ b$ y- [
            # 爬虫程序异常报错后重新启动爬虫8 ?; i+ ]. h% L' h
            texting=True,- d. M/ }) O/ l( g
            ###
    5 b4 p6 x+ R- n$ \        write_SQL={
    ! l8 a2 J4 I4 |; S, N            'host':'localhost',
    3 A1 V: z- M+ ]# q7 X            'post':'3306',, G  k, V6 b- z) e3 @7 N
                'user':'root',* I& {# L; o) B( }9 @' c4 A  r* s2 g
                'password':'123456',! a* U5 Y8 x, v2 |- ~) q, u7 O+ E* d
                'db':'example',6 T4 A2 C8 f3 J' X1 w
                'table':'example'/ x, O9 m- _4 F7 k, j
                }7 P6 i; y  s% b
    ).run()
    2 O% V0 d  T& ~: b/ l2 k0 V! n( Y% {7 D  T
    第十种玩法:多线程爬虫
    + n* Z* `5 ^" T' M0 A特点:
    8 m. w: T" y' g" z; b爬虫速度加快,5 _, B8 J3 j6 P0 T) r
    更好的利用了线程。
    4 _9 e2 m/ E0 j+ C& o- f& _; _5 J3 P9 X4 D; z2 j
    缺点:暂无
    5 R' I# j* }9 q1 j4 v" T7 |( A, }% I0 o% z* W2 K+ A! A
    :return None
    ) b- a8 n6 b1 `: G* Z. z. n2 [8 S4 c/ K8 t
    request.parse(
    6 s4 W1 R# W5 F8 k$ m        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],' k4 ]0 H9 X1 ~& D8 t' H3 f" o
            #login="taobao",& U, K. F& g1 ~  P" }
            type_url = "text",
    " n4 E" f9 b5 h9 E$ X4 p        Parsing = 'xpath',/ s, N/ D" g/ W" T$ ?9 E4 i
            label = {
    ; A7 }0 I2 ]; x/ }, s- u# ?+ R            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * F7 S: s% Y' J* M7 J, H            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    / C( H3 K! L) p- [  T- r9 f! ^! z8 U  N- E% c            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; K0 w' D# o. @  t5 Q
                },! X8 {) j7 E+ T8 a6 m
            write='result.txt',2 {2 d! Y' `; Q5 t7 D/ |
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    . B* |9 N8 q$ s        page=[True,"now_url.txt"],. I8 [/ `7 r/ _" R: ~2 {7 e
            #clean=True,$ k& z+ [1 l1 a) b& q7 N
            texting=True,
      d& g$ _6 O+ ^  J5 ?        # status="threads" 启用多线程爬虫6 S1 x+ c/ H5 w  ~7 s) o
            # Thread_num 为线程数目,默认为1 单线程$ y& Y+ l4 X3 C' a7 o- ?
            status="threads",
    . z1 X% S+ r. p) u1 O) g        Thread_num=3,. R0 O# M/ O; e# Y, F$ Q
            ###
      [: Z# X( b# R        write_SQL={
    1 [8 L& Q. F# j$ a3 P0 z            'host':'localhost',
    / f) u7 L* _& {! S            'post':'3306',
    : s4 }4 z( L' \# q/ o            'user':'root',
    . L# T+ v$ Y) h1 v- C            'password':'123456',1 z- ]3 S" D! F% B3 d6 D9 K5 k' b
                'db':'example',# P+ K5 A$ R8 K
                'table':'example'# N! \) G2 ^/ w
                }
    2 q  l0 P3 w$ \  [, w0 p% f% B).run()5 a( j0 O4 P. Y( }
    1 x) m# b3 Z% T) a5 K9 d
    第十一种玩法:多进程爬虫' _) I# Z+ L8 T1 n
    特点:4 G0 o0 u7 n9 t8 y
    爬虫速度加快,( s8 m/ \% |( `/ t
    更好的利用了进程。
    ! j$ H4 g) }9 t" O) s" Q
    3 z' ^$ D5 [1 a  ^& D缺点:暂无( B+ O) H" `: }0 j- }5 A, B) \

    % T- }/ K) z' @1 S5 Y8 e:return None
    0 _- j, }3 G( L0 v: ?3 H: P
    , {4 }* J) q$ B& _9 `from simple_crawl import request
    * t6 c3 N. \& T0 w2 C1 M9 Wrequest.parse(6 g. E( [" t, B4 h- Z
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    " e+ E- x3 S3 c7 U5 a* i% \) d        #login="taobao",
    : O$ A4 w% O. {        type_url = "text",
    % X) k7 H) y' M* N2 d6 I, n9 d        Parsing = 'xpath',
    + {. r$ b- K$ {$ m# |5 h        label = {1 F0 l4 {; |0 i& [8 P  O
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," B/ n) X5 S) F' U/ @/ e- M
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ A9 H" R# w( I5 t2 n
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]* A. D- ~" w8 H- b, `$ r
                },! T$ }) W- s4 R$ W; g
            write='result.txt',
    , X. Q# {$ U$ d' @        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) J  r% D+ w4 r" W        page=[True,"now_url.txt"],
    4 S0 {  F7 D# D  T" E* q$ F; ^/ T        #clean=True,
      v% {6 `0 _) J1 ^% B        texting=True,
    ( ?' s. u+ V% r        # status="multiprocessing" 启用多进程爬虫
    / I0 A! _1 `) B0 b8 d. r3 m        # cpu_count 为启动代码核心数,默认为系统核数一半
    0 G- s7 A2 f, Q9 X6 ]3 m        status="multiprocessing",1 O7 F' |6 F) B
            cpu_count=2,. f8 g3 O/ j" L- Y4 i
            ###
    ; _" p0 n$ l9 _# D        write_SQL={3 Z  o. ]) p. n. O
                'host':'localhost',+ B1 ]. @1 t. M  O) ^
                'post':'3306',
    . T. e% P2 t! ]0 L; L/ d            'user':'root'," [& W& P5 y. F; m; }. _, M, g( [/ x
                'password':'123456',+ w" n+ d5 t$ B
                'db':'example',- ?7 |( h; r; j4 U
                'table':'example'
    2 i3 w9 S3 D+ w1 L, f            }, d+ w, A9 E$ R2 f/ q$ z
    ).run()* o% x+ B* P4 \  Y( k

    3 c+ ]! |7 a- J8 B" {" u第十二种玩法:异步多线程爬虫" b6 L- E2 I9 w, ~
    特点:
    4 t3 q4 o( b9 M! X# N爬虫速度加快,) a" \, ?1 S. t
    异步使得爬虫无等待时间,
    & u+ r* \7 Y; s$ K/ Q同时使用多线程速度明显加快。; z$ L. k; n# Q- t2 J$ n
    1 k9 i. q8 v8 n8 X1 v8 V
    缺点:暂无$ M# o# j5 |) N

    - X  [$ T4 E: [- M* C6 |:return None. L% @2 b7 |6 p: ^5 b; C  U
    8 Y) u+ ?5 c, f: k: `
    from simple_crawl import request
    7 z4 n6 D+ g+ R# Yrequest.parse(
    5 D6 H- Q$ R) m  R$ G: y% c" R- E        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    + s0 u! N& ]( b3 Y        #login="taobao",
    1 \# N0 `& C% |' I! ?5 d" S        type_url = "text",
    , d; Y7 L  p5 x+ m* n7 g        Parsing = 'xpath',$ x3 n2 K, P# ^2 x; B8 U  O
            label = {- p5 m8 a( q2 [0 v) E
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 c6 F' H  }# k5 n; A& E; P
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    / ~( P8 N2 ?. {            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]' I" ?# K' T" W2 n
                },
    / a0 e) f7 M- y6 |7 R7 }! v" q        write='result.txt',% r, a2 s; c1 S& l, P
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " ]( e. ?  P) {& c# T! I0 I, U& n        page=[True,"now_url.txt"],# s0 L) _( @! c) D  E
            #clean=True,
    2 G- E. P: w& `; ^) J        texting=True,
    , I- W7 ~4 V! n& Z: v+ I9 F        # sem 参数为异步引擎数目,默认为5
    * r# P/ K* u6 [7 N1 B0 K: F; l9 c$ l        # 其他参数同上
    4 m1 I5 n# ~1 U- @# r+ h' q        status="aiohttp",. f: l. p: e+ ]5 p4 o
            Thread_num=3,
    9 d& ^# x3 q6 N        sem=5,$ A% q) L6 O9 i  C/ Z0 T
            ###
    3 U5 C. n, S% e% m5 F        write_SQL={
    9 ~$ ^8 m+ u& o3 ^            'host':'localhost',
      p) T8 ^- N. F  Z( B            'post':'3306',
    . t' f" K7 D1 G; b1 M0 d            'user':'root'," k) J# @0 P" n5 g
                'password':'123456',0 E5 M  |- V% m/ Q& j# I' J
                'db':'example',
    $ S  Z- j  x/ j            'table':'example'
    & X4 }" o9 X& o1 a$ \8 B0 L            }
    , y; x# E6 c4 I).run()
    # l% ^! I3 Y1 z$ J$ @) [% Q8 H" T
    & F) e# k% Z7 l第十三种玩法:异步多进程爬虫
    ; T' J7 c: q7 `1 L/ t特点:
    5 W# E5 w8 q+ k3 y6 K# H7 X( X爬虫速度加快,
    , J! |9 E- o' u# N: \异步使得爬虫无等待时间,! e+ Z0 ~4 ~+ l. e: L2 Y
    同时使用多进程速度明显加快。+ d4 b( T7 @' _, |. n, A' v

      _; \  f# D' B" r# |, a缺点:暂无/ l( k$ B- S2 I2 P! c2 M8 f; ?
    6 x. n* t% D/ l: v+ n5 f; A/ ?
    :return None
    , }+ F* A. b7 t$ R7 C( O0 c
    ! s( |6 ]% q4 ^. i; R4 k, t; Efrom simple_crawl import request
    7 t6 x8 ^% {: C( Orequest.parse(  x. h' f% @& L# [( y4 i/ j
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ( K$ m  k. t  X! g" J  P        #login="taobao",0 w2 T8 g" ~; d" K0 H
            type_url = "text",! |( t( W( r% g' |
            Parsing = 'xpath',
    - b1 N  ]% _9 |  ?        label = {% x1 a3 U4 l! n' P& P) s
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    5 H' g: x; W# n1 C; J) E+ _            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; _& y. B% }% F1 N- U
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: |) ]# n. l( b+ N
                },  [4 B) ^" ^! n* |' w3 y9 w
            write='result.txt',' ?4 J* ?9 T. H3 d
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 M) d6 {$ X1 L5 I2 W5 k        page=[True,"now_url.txt"],
    ( P* V/ S. R8 a# z/ K& q% \        #clean=True,
    ( I6 ]' m" ?/ e3 O        texting=True,
    # A; Y( o" `2 V/ r  a: d        # 参数如上
    1 e7 R+ a- E' L+ B! y        status="between",4 l5 J. @. }8 r) z' S: s
            cpu_count=1,% t: a! ~2 S4 R
            sem=5,; i/ w  q+ _% r. V. d) C6 P- ]
            ###
    ! H+ b2 w' t3 Y$ N        write_SQL={0 m/ F! |6 G2 [: u0 ]' o5 G4 k9 b# m5 r
                'host':'localhost',  S0 ], ~9 ?4 r' q
                'post':'3306',
    4 b  ^9 s+ I' Y  a" A" @/ H% r            'user':'root',
    6 K+ `! u: K3 o) P            'password':'123456',/ P# y5 w5 d; o0 ?
                'db':'example',
    ! @. W: z  Q- Z7 M7 B+ a            'table':'example'+ d, g: Z3 ]9 ~' T) o) [5 x
                }! r' o# W/ v. H' w$ p
    ).run()2 F/ H! b  f2 A
    7 ]  s# f9 e& }& `3 ?! Z7 f

    2 B5 i7 U9 \# O- ^) z8 f功能介绍完毕🤞# }% u. }+ r! N2 L
    最后还是希望你们能给我点一波小小的关注。4 r" B4 Q* z. ^6 C9 a3 I
    奉上自己诚挚的爱心💖4 B/ w" w+ O. l7 I! U6 ~" P
    ————————————————
    $ c0 U. [0 b" \9 A/ G9 b版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 k0 N2 }4 X2 D) W7 _原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    + g! G9 ?/ p% B* T+ U4 }8 m; N& ~+ f, q
    7 C9 T! C6 x! x( c' v3 I" k
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    738391227        

    0

    主题

    6

    听众

    32

    积分

    升级  28.42%

  • TA的每日心情

    2022-2-20 17:52
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    哈哈哈哈
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-23 04:22 , Processed in 0.457697 second(s), 55 queries .

    回顶部