QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5538|回复: 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; u- _2 K3 G: W# n
    simple_crawl  U4 c! @" ?: ~3 Z! g3 D
    仅需一行代码即可达到爬虫效果& o2 e2 M: g( O& P! r8 l. @( j& f
    项目地址(欢迎star):https://github.com/Amiee-well/crawl8 M3 F& g' g' p7 w
    使用方法
    " i* P$ s; V" cpip install simple_crawl
    & {( e- F# Y6 A; c' g8 w. }" A* f1 k2 C1 Q
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下# D" q2 ~8 C% |1 l# R$ V
    from simple_crawl import request
    5 N1 s8 x; `7 Y: e" yrequest.parse(
    ! ^& L8 {( X. b" z6 [8 J3 U3 G        # status 参数为运行状态,支持单线程多线程多进程协程以及联合8 J# w- y: J8 `$ R: r
            status="aiohttp",
    0 p3 J4 o7 g4 T( B+ J3 p# m/ D        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式% l  b1 t. ?. y, j& p
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],' g1 ?- @3 L: Z! a: ~3 d/ H
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    # B) f  u5 J* \% E% [    #login="taobao",6 a# ?4 q  b2 G+ j* W5 u' A
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    * o3 K/ N1 t% Q1 |2 G. X8 o& n% }    type_url = "text",9 x: p0 d9 ]) v, e# U# e
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup( ]/ b( j& }# A2 l
        Parsing = 'xpath',
    : D% h) I. s: Y( o! D8 S3 a    # label 参数为爬虫解析过程,字典格式,详情见下方
    & {/ f* l0 c( H' G    label = {
    ! S4 h7 V  h1 h            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ; O) Z5 l# H5 w; o- E            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ( Q' H1 R- `2 B7 f            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * s0 [' c9 ]; n$ m  {     },) `. d1 O3 M! |: D6 U! s3 D3 L
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    - \% U: U1 G% ]2 A! k     write='result.txt',; h6 r+ y( v5 m( S) D" J
         # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫6 F" ^3 ?1 p7 E- D
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! t. u; u3 F& H/ _! X* ]
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    : r9 Z; b9 a, u. \+ k% [     page=[True,"now_url.txt"],
    ; |. f! ]' f: S# W* t     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息, s5 m! M5 r- v" m! \0 K
         #clean=True,: `, I! l# r+ d3 _; ~# i
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    0 N. w  W2 r7 C4 @7 x! p     texting=True,1 }/ \( \2 n4 n6 B6 N4 A/ B
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    $ P. ^2 R4 R5 P$ s     Thread_num=3,+ e" u7 E* K6 H" Y2 N0 N
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    / o: s, ~& N. Q' A     cpu_count=1,: p: [  Y9 _1 R2 Y1 j6 t7 a  g/ b
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    4 n# f5 w" `% T     sem=5,- h6 ?& ^3 g: D% ~6 T1 O
         # write_SQL 为是否写入数据库,默认否
    4 j+ S( }& }6 y     # host 参数默认localhost# l0 b. [! F( |, y' Y# J/ E. C* }& `
         # post 参数默认3306! H7 c* K. f9 |8 F. h
         # user 参数默认root" {: ?. M' Z/ o/ k
         # password 参数必填,必须正确! e! {& R2 w* `+ A, c# \& G
         # db 参数为即将存入的数据库名,若不存在自动创建
    # F; ~3 _. K; F- I3 g6 [3 T     # table 参数为即将存入的数据表名,若不存在自动创建
    5 S$ a, i6 m8 ?; s  R4 n! K     write_SQL={
    # n' u3 @* r' x         'host':'localhost',
    + [' }! c" b5 J0 y         'post':'3306',. j4 n% K8 q& B3 a5 `  n' _
             'user':'root',) ~& N9 Y: p9 y' A& d9 r6 Q
             'password':'123456',
    ! }1 P# c8 b% k         'db':'example',: o$ t( W1 e2 R* j' M* L3 k
             'table':'example'! N3 V0 A! n+ K& @) c8 S- M+ E6 ]
          }
    ! W) f& ^  |! W8 @: g, J. t).run()) a5 l1 A5 U. z' H6 }( \& o: L6 K
    7 F# b6 R$ N8 J  s$ I
    介绍一下crawl参数设置:
    3 }/ R2 R& f  b: {7 d: F. ]
    4 p8 S; u% ?3 V  t, G'''
    5 u4 p! A  X/ |0 h$ g2 b$ U* T/ P3 f单行代码爬虫程序执行" g. q8 y3 n# ?
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档0 \& [1 g* W6 k5 ?. P
    :param url:即将请求的url地址,仅支持get请求
    ; o' r# Q2 R/ N( W, M  o:param type_url:请求url后返回格式,支持text和json格式返回- ]9 _0 u2 q2 {2 Z7 l! C
    :param Thread_num:即将启动多线程个数,默认为1单线程
    , R& n; ~4 @" }/ h3 f7 }:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    0 K2 ?/ L5 x; `8 Z9 [+ A:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半1 k0 I2 g( J# F  W) w
    :param login:模拟网站登陆,保存登陆信息: L% Z' z) x" u, Z- P) C
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法. p" |# ^' [4 I
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    % Q  d% ^, w/ t                       多次报错结束程序,默认否+ K4 O4 B* A" V# E& |2 E
    :param label:选择器内容,字典格式保存,% U# L, [1 U; a% v
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
      h3 W/ z9 _& o                     第一个参数必填,第二个参数默认str类型
    & e9 ^9 D! h/ ]/ ?6 t7 t:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    ' C3 o* Q3 s( y, f( n1 p6 i:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    - z! V& d: x) e/ u$ x:param page:是否选择断续笔记接手下次爬虫处理,默认否
    - e! y' y& |2 ?' Q, K2 \9 Z:param clean:是否进行简单类型数据清洗,默认否
    2 t9 i' e) Y$ B: ?( f( K:param write_sql:是否写入数据库,默认否
    % e5 ^& G3 [8 Z0 ~; H9 g                         'host'默认为'localhost','post'默认'3306','user'默认'root',3 ?# c  Q# G5 u  Z3 z
                             'password':'密码','db':'数据库','table':'数据表',9 t  V' |8 l- h4 ]- y+ ]% C; O3 I
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    0 q# U0 X( d/ l                         检测表是否存在,若不存在则创建,若存在则直接插入
    / c: m! o0 |5 o2 r$ B) }:return True. g6 C) O" `( b6 W
    '''
    9 G2 N; \) j! H8 Z- F7 E介绍玩法( A: C" w5 m# I7 R  x6 C
    接下来介绍的均为调用第三方库的情况下运行:2 \) [. Q" b% m; X# E

    % K- F8 u" ^1 a$ ffrom simple_crawl import request
    0 Q' F/ ^9 p* R  |: W9 O) ~* X第一种玩法:输出源代码
    + L& S( v/ E: X5 \* J+ B9 k调用requests库进行源代码请求。
    % \9 X" K( i& o. D0 L
    7 E* R- f9 R9 f特点:
    8 z7 E1 }+ `, U! P! }; L请求失败则调用ip池处理重新请求访问,' q3 e0 y. h0 D3 O- n* b8 x
    出现五次失败默认网址输入错误。
    , k; h4 d6 B" R/ y6 n支持text以及json字符串返回。默认text。. T6 I/ f# g! j) G5 N& d5 ?
    5 q3 T8 E$ D1 z& h- e% d
    缺点:
    ; h2 t* n2 H$ l% b# P) `( D暂时只能进行get请求,不支持post访问
    2 Q, S3 e8 k' Q! l6 A' Y0 K& A' _8 m3 z
    :return text or json
    $ k% ~+ `. k8 n* W; z; u+ |7 ^8 k, d6 `4 E6 {
    request.parse(4 d+ Q1 m6 k) S1 t3 y$ w
            url = "https://www.douban.com/group/explore",* y3 L) E! K9 j5 {& a
            type_url = "text"( q9 r' |$ t* y6 c3 ?+ J3 n: R. k
    ).run()
    / K% _* Y$ Q' s# return text( l3 Y  ]- w0 K( H) k

    2 t) Y6 e5 S" F; C第二种玩法:模拟网站登陆并保存信息
    7 b8 L! \9 c: l$ S调用DecryptLogin库请求登陆访问。
    2 B5 C, d( h; k% n  a3 _+ }" X; a( i# \# H+ H3 T
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    % g  l7 y, Y8 [: R( [( }; Y在此放出文档地址; S; P9 a$ m; v2 y
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    ) |" Y' }" W8 m0 c4 h9 A
      p! r( t/ d) n/ e特点:
    ' h$ P$ r, O* @! G) D0 f5 D1 a将DecryptLogin库中二维码继承到此库(非二次开发)
    3 n8 ?8 ?4 s& z) f& i6 ~支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    9 f5 o+ H5 m7 t' |3 r7 K保存session.pkl信息到本地方便下次登陆运行
    5 X5 `# |' Y( M( B) z
    % h0 s/ W) Q5 l6 h; N缺点:
    " f" Q3 P6 e* U$ osession.pkl登陆信息过时无法自动删除。5 }5 K* Z- J9 ^% j1 ~& u! X
    导致下次登陆疑似cookie无法正常登陆。
    % P$ F9 q# U$ ?8 M3 j0 e) e) M! F6 g
    + f; s; F! c& j+ R:return session
    " Q4 {4 }! S8 o0 w
    5 U& _; ?+ ]8 c6 xrequest.parse(7 c! @# j; y# \/ F( F
            # 臭不要脸的推广一下我的店铺7 G- i% Q6 o5 `' e' n2 Y
            url="https://shop574805287.taobao.com/",) \, g) c$ L- v/ B
            login="taobao"9 O0 f5 V# x% {5 h9 ~; ~8 x
    ).run()
    & s8 Q* D8 j* ^# return text
    & b$ ~4 j$ |* t. ?) ^$ B+ ~0 d( V, F; _3 z
    第三种玩法:爬取网站信息7 L0 Y- N4 q3 T& p
    爬虫库自然少不了爬虫的过程
    & Z: R& i, u5 }- F1 a" u0 g1 v
    特点:
    8 }7 K# ^& c$ s! ~支持re库,xpath解析以及bs4选择器。
    8 x4 p/ j; }2 S爬取方法为字典格式。单方面输出。. z  S1 L* @' b, `$ M* P
    字典键为保存的字段名称。  [+ @! k1 t/ b# J- E
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。. [; D4 l$ ~" V# r$ o
    . u7 z) U, b/ b  w8 X  a
    缺点:暂无(等待小伙伴们发现), a+ [3 ]$ u5 `+ m6 e* o7 A8 v' E) i
    7 Z6 M+ H" `1 S% i7 L9 f
    :return reptile_results
    , E* N9 d0 A0 F, R! {& \- U: V" T) S
    request.parse(
    5 o6 u# F. r  E* u( C        url='https://www.douban.com/group/explore',
    ' @; D& G2 V( p% B3 z8 g6 I        # 字符串格式,选择器方法。
    0 |" L8 l% R$ J" A0 @+ `& Y" P' |    Parsing = 'xpath',( G# x; R: v; m7 x% h9 C9 ?& r
        # 字典格式,参数如上。8 o: r" {3 n8 D, t' u
        label = {0 Z6 f- l. E, j" [& r/ E
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    - f  k$ h( |4 }) c# M        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 ]9 G1 m7 N2 V+ C' F: F9 ~( R6 _
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( i+ |, O0 U+ g3 I. H# I        }
    , D+ N  o; u9 y% Z! @$ i).run(), u4 X7 v6 ]! h
    # return reptile_results(list)% B+ M2 _$ k! ^$ x1 I  }3 p( H3 o
    0 f& T5 h2 Z4 D% C6 g! z
    第四种玩法:自由保存信息
    0 c. _9 f. t+ p$ m3 ^0 O- Y目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    2 `1 J3 F0 K& v  Y9 c6 E$ P! y# y# j) t0 m/ `7 o' c
    特点:: a+ |& J8 l" m8 K/ v
    写入文件均为数据格式传入文件。
    : H+ T* j! ?6 V/ x9 d. E- O且输入格式规范方便阅读and省事。
    - N, J" p0 `# }) m2 {
    8 f$ H- Z+ `1 o$ ]缺点:
    2 `5 D( u4 x) k& u  c保存格式仅四种,8 E" M+ J+ h; d1 N$ i9 G  M
    不方便用户之后读写操作。
    1 o& n3 }: x/ w+ b+ T+ @$ E. w. f. y) S
    :return file
    0 f( e' }6 E9 ?$ z0 x4 o. }
    " L/ p2 S7 x) F3 o% X1 v: K3 c. |request.parse(4 x* N$ b" W; r  \- i
            url='https://www.douban.com/group/explore',
    7 P1 D0 O1 F, h    Parsing = 'xpath',# a: z% M" H7 F  ~3 c
        label = {
    7 u7 R. o0 H3 b, K- F( x7 z) r        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , G: d  E2 Y4 K# }  S6 o3 T        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  z& h- x. {& G& p
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 i. k' Y& m$ }' m8 B
            },1 v3 p+ n: t1 e6 X; U
        # 字符串格式,具体保存位置填写- h& M' _# e8 D' J& v
        write='result.pkl'
    ' J2 ?* D! L$ R: T( Y& O  l).run()" m% R) e* j/ S6 C3 n
    # return file
    ! P9 |) ?/ f6 g6 d& J; x, c6 s7 O2 K) k. S
    第五种玩法:读取下一页 url 地址继续爬虫
    5 }; V- o$ i2 @* Z这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    : u8 t( H; c# ^9 W- ?9 k; c7 [: z) L5 s+ M7 T$ [; D$ T5 ~
    特点:* K9 u4 {8 ~' x, e2 S
    继承之前的Parsing参数选择器选择方法。
    & }2 F- p8 M* e# T8 a) b/ V在这里可读取到解析后的下一页 url 网址。- P" B- T; r2 p3 U. L$ b
    方可继续进行爬虫处理。方便用户使用。
    . R( _$ m# p( p& Y  s" E) Y; K4 \
    $ Q4 ^2 x0 n. |2 M缺点:
    2 U0 o( R. q8 J) l8 i* w若爬虫时下一页 url 地址改变,便结束爬虫。, O0 i* c/ D+ @" _" j
    只能爬取所给 url 地址中的信息。7 c8 T8 l7 Z1 m- ~
    无法进行某一界面的多个网页爬取返回。
    . y2 ~9 Y4 U. R1 M造成访问页面单一流失。
    . o' {3 i8 T8 A% {8 \2 ~% |3 X5 i% ^" y3 I! Y
    :return None* G, x) K9 s( u# }! X
    2 N3 T5 v) s7 ]6 N
    request.parse(
    2 u- g% \& h  \# t+ N" Z$ H! f4 T        url='https://www.douban.com/group/explore',
    $ m: r! k  ]7 Z) f( w; ~0 W    Parsing = 'xpath',
    0 s& t; [) S. P  n7 x( O" |. a& {    label = {
    ' X2 r3 ~, x" n$ D* K9 n# t- O        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    4 C0 \4 q8 N* X- W) r: v, V        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 Q4 d8 Z; ?( i% b. ?7 ]* Y
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 O/ P5 g" N3 j- Q( W: B        },
    1 J8 I% ]5 f5 P5 _' _    write='result.pkl'," K; g& ?8 h) {4 P
        # 字符串格式,根据Parsing方法继续请求下一页a中href
    % C7 i3 t4 m. y    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) r7 B' S' S8 ~7 J).run()
      x. \: L1 D( b1 E1 }# return None
    % D$ }2 {# _. g  X. k4 b: {3 i% c- s% `  i9 c+ r9 {" o6 K
    第六种玩法:爬虫网页保存
    & D4 B( K& n& h听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    7 i; }9 x8 K8 K: u" F$ v* t. L/ x; |
    2 q  I+ i6 g6 I  ], p- T: P特点:
    $ \; Q/ S" @  r) O8 _7 r持续输出断续笔记。+ I. {1 M3 k9 |2 x- p0 {9 P
    将此次爬虫的 url 地址保存到一个文本文档内部。/ h" j8 F4 U; Q0 n7 k  O
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    * [% T& L5 T: k$ H2 L& h% K- K) W! I- V7 I; N
    缺点:
    # |. C* a6 F- a+ O读取内容不单一。
    . ]. T1 k- t& C: H' S. }导致下次爬虫无法正确读取上次爬虫留下的痕迹。3 [6 A& f! c5 ^( x! u5 f- f- ?( `

    * w& u5 E) X+ b* Y4 B( O7 D:return url_file& {* X# N' Q* v, A/ a
    6 `4 J8 N) u5 H# _. n
    request.parse(
    5 A7 m$ k8 M5 i% k) K( Q. y    url='https://www.douban.com/group/explore',- Z: N# ~1 R4 \  c( C/ ]
        type_url='text',
    ' B+ z7 M6 b3 U& K6 r: C    #login='taobao',/ c  O7 w. H2 y$ d
        Parsing = 'xpath',
      Y$ S$ @& M% Z    label = {' N& p& I9 R% v$ n& w
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    - k; r& t, r8 K8 a- c. P# G2 z        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," b7 e; e/ m6 Q) F# a
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" Z; b6 \3 S5 O, B! g. U
            },
    . X) v8 a* _7 A8 C    write='result.pkl',
    - U2 t6 \  p& ^4 _    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 ]1 Y4 G# k& ?5 G4 f/ ~, P" m    # 第一个参数为是否需要断续笔记。
    " j. q6 L( W2 @& }: k3 f    # 第二个参数为断续笔记保存位置。' i7 p: U: d" ^! V" h& q
        page=[True,'url_page.txt']9 ^& j& {" Y! G# y, K
    ).run()& h2 D) s! t/ D3 \  U
    # return url_file
    * K; K' c' d- |
    ( ^/ Y) u5 S: R/ b8 j第七种玩法:简单数据清洗" y5 J9 v6 I# t% i( z+ D
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。7 z5 r" @* d8 o; Y$ A6 M; b) n; d

    / V6 w3 ~: L% a& D2 [特点:
    ' v$ f* J$ I* Q8 L* u1 i本人曾写过一个底层数据清洗。
    ; _- F. A8 N$ W6 ]/ C$ F能将列表格式数据进行归分清洗。8 s2 v5 _( V: p' v4 d
    主要内容请参考另一篇文章/ f) N+ p& O" B/ c
    如下连接:数据清洗
    ; X3 p3 U( |" O) |5 h  I' |7 L% C
    缺点:/ Q9 @* T+ {+ _1 p+ z, D6 A
    数据清洗格式简单。3 I  h* M- T2 t$ ~; N. C# ]% q  M
    数据清洗内容单一。
    - i4 C0 I- e6 [( X  H8 {无法完全做到绝对清洗。
    , c7 a/ E* h$ B: @) [有待改善。; c8 o4 A7 B1 j% J3 p; @4 P
    / |% d/ o2 e( b, @) k' a; N/ k# `
    :return keyword_list, value_list9 W7 Y' v/ u: w: S( e8 q: X; o+ ~

    / B2 H2 z% E- a, U8 L+ E& trequest.parse(9 z  |5 E8 m  ~& _. ~) _
        url='https://www.douban.com/group/explore',7 s% e7 X' N3 ]- S! K. |
        Parsing = 'xpath',9 [, z3 I) w- p. }  w
        label = {
    6 y! r# n; [2 {8 H! r, k2 w        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 X0 [% x4 [. X$ D0 R
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    7 ~/ K5 S6 s( o        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    . j. e- v6 c9 B9 r+ w& D) Y: c        },
    / T4 c$ w% d/ S* G/ _    write='result.pkl',0 G7 A3 g, }/ _/ q
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ ^: Z6 J2 j- p3 a3 \* g
        page=[True,'url_page.txt'],
    5 E- x3 X* B: f    # bool类型,默认不清洗/ r1 S: k9 x, {" ^) Q( l! g
        clean=True7 v2 p- M: L2 b4 \
    ).run(): r4 S! R$ ^% J" \5 B2 r  x

    * f/ X! S3 K0 w( y+ J" P第八种玩法:爬虫存入数据库9 m# k  i9 p, K# ^
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    $ i; d7 ^( P6 l4 Y7 ~
      ?& @+ ~$ x! p  k+ P特点:  i  z8 b; v" S" \& L/ m+ P  ?
    信息存入MySQL数据库。
    - X0 r! a. t% G) p! I可连接docker远程数据库。" k* S# o- p1 n* s4 K" U
    数据库的库名可以不存在。
    # g; D! `  p# X& [. R数据库的表名可以不存在。7 Y, Z' P  n8 X" T+ Z6 U5 L
    根据之前传入字典键与值参数判断表类型。4 g0 A+ O/ v6 `% j8 y
    自由建立数据表传入信息。
      A8 k' F. V5 R8 t( c2 J8 a; v3 S  L- ]' z
    缺点:5 H" J; n# w' u* h( D) G
    仅支持MySQL数据库。* C7 h6 j( U* b( j0 @% B

    * I  Z1 ^* I3 j& l: [5 x) s- _1 f4 z7 I:return SQL1 ?! I3 R% C$ H' M; j! p

    % W/ k  M% p7 y# x# Qrequest.parse(' w, p3 V4 S5 a% n
        url='https://www.douban.com/group/explore',
    " W' _! E4 ?6 ?+ i5 c# i    Parsing = 'xpath',
    . D( L, s- O8 W# f% U    label = {
    9 G$ ^5 F) v5 L        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    % F. W% X! ^  i; o0 L        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 Y) U% z: M2 g! ^% ~; l. P
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & c; J  W* `1 [) w        },
    ; e, a' W! ]; j    write='result.pkl',+ O* n9 W0 m  n& e' F- g
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    7 |8 Q  P' J# R  l    page=[True,'url_page.txt'],, N+ b  J) q( }4 e7 Z& [4 T
        clean=True,
    " u1 k) J% Y3 i7 D" d8 t. Z- r1 Q    # 字典格式,
    $ |- ^+ z3 K3 j9 Q! E! v5 ?    # host可有可无,默认localhost& g4 f, P; G1 ?
        # post可有可无,默认3306* \5 k7 d5 y& a7 J
        # user可有可无,默认root
    * H* b1 g! b4 Y! `4 @+ G    # password必要参数,数据库连接密码
    % Q5 e9 R" n# H* U. f    # db必要参数,数据库即将存入的库名) X- n5 p1 B' N3 R! M
        # table必要参数,数据库即将存入的表名* m1 d6 J# D0 Q. e$ P
        write_SQL={
    4 x% w) k) z  t% j6 z6 o3 b        'host':'localhost',. t0 x9 N4 W) s, N5 U# [
            'post':'3306',7 j' V- j9 a! [# h4 Y
            'user':'root',
    % ]+ Z& ?; x& Z. f. S        'password':'123456',( c4 [5 Z# \. L4 O$ P5 T+ G
            'db':'example',
    5 {' w. H4 P8 c0 g  H        'table':'example'1 }1 H4 X. |, |6 j% |; S
            }: [3 |9 ]. t$ u! Z* R# `
        ).run()
    2 L- u' e5 t8 p: `+ ]
    $ W/ Z( `3 q5 t第九种玩法:重新启动爬虫' S4 ?; M$ `1 [6 C0 M8 V
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。: J1 u7 S( l) Q6 j- `/ Z

    ; U( b1 J5 X* N: ~特点:
    / f+ f1 i6 P! e  ?8 ~" [$ r检测报错重新启动爬虫
    9 ?) o7 v! P7 o+ O4 D4 P5 P' F无需手动处理错误信息7 p; B7 R; j0 d# H

    3 Q4 N3 z% @, n7 q# _# X* n( K缺点:
    2 U9 N  `8 s2 D8 h' @/ C无法收集子线程错误。
      ?' i$ O+ k! Y* A( g$ M8 B% G7 w. [7 D
    :return None, ]- f* z" K2 C8 R( [

    1 F/ L7 s2 E* \: X2 z" P* n9 _/ O* brequest.parse(
    ( r: Z2 W( C! `+ a; J9 f* n% y        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    8 b, J3 L+ n* O- r$ k5 e        #login="taobao",
    " T0 J6 U6 f. Y) V        type_url = "text",- q+ {$ \. t7 |* v
            Parsing = 'xpath',
    - M) ]; z( d' H  \& {7 d9 U        label = {/ O: v7 Q% L. S& ~; _/ k% O# v
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],* @: ^  O: L2 X' f6 B
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( n& a. X! x9 P& A
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str], T% N' j( H' x+ S$ [4 B
                },
    + q' A/ A' Q7 J        write='result.txt',
    7 D+ h. T, B1 H8 y* F% g        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! v- y+ `7 A3 v6 `
            page=[True,"now_url.txt"],7 l- V6 d4 B) y( j' T, F! c
            # texting 参数为是否启用连续爬虫
    + o% M- }  y, W/ G/ C2 A        # 爬虫程序异常报错后重新启动爬虫
    5 P# D/ h. _; }- y4 q* q- m# X: @        texting=True,9 j/ R1 U3 Z- D% R6 O
            ###) P, k2 f6 V! @8 t
            write_SQL={
    . ~& F, U$ c4 I  r            'host':'localhost',9 P9 S4 t% V! u' C$ G' h- l; X
                'post':'3306',
    5 Y) A& `# M: m) ?8 W            'user':'root',% a7 d* G5 M- {! S/ @, z
                'password':'123456',
    ) u2 S7 o9 f- g            'db':'example',7 z: P( p- G$ t& C/ n( G8 P
                'table':'example'7 v; a! }  ~5 u" ^8 f* T
                }
      o8 e4 t2 s) z+ A/ L).run()5 i" n& o( ^: v/ q% B6 C3 c" P

    / e% V( @  Q4 ]" R第十种玩法:多线程爬虫6 E% I9 B. b* f6 j+ y
    特点:
    % W( |- c( v% C4 e$ D) \" ]# a爬虫速度加快,3 f# H5 v2 l4 B! |; z
    更好的利用了线程。* s& T2 d- S! O  Z- r& c4 {1 F
    ' {* e0 y0 a; n, f& \5 t
    缺点:暂无
    & ^  }2 Z: Z, h/ c0 q4 |/ l" A5 a  o. L/ Z# c
    :return None4 I4 k3 ?0 z# M
    - ~8 U3 h% |& m2 z& N
    request.parse(! X( H9 s1 |: {0 I4 j$ P! L
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)]," s* t0 {  L3 t/ [; z9 Z8 y
            #login="taobao",
    7 r8 t. D5 k' ^% m+ [/ z2 h        type_url = "text",# n8 K1 Z+ Q7 C9 ?
            Parsing = 'xpath'," L5 L! W, h# v' S" c& ]
            label = {( K1 m, E5 Y' ^$ [3 x+ W/ ?+ S
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 m. E& }9 A! @( k& y/ Y$ A
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    0 Z* W  S8 c) ^7 M2 _1 t1 b2 i            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      u: M2 X. [% Z. ^! i9 }( L            },7 l* O# a4 ]1 C; ?, ~5 ]1 y
            write='result.txt',3 V5 B: a9 e* I. R  ^1 S* f
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  m- B1 x, y! r) p: R1 Z! a
            page=[True,"now_url.txt"],
    + |! L% l  C* l1 ?        #clean=True,
    $ @6 B# B, k# o        texting=True,/ E. g- @& p9 Y4 a, J6 E  F0 c/ U6 o
            # status="threads" 启用多线程爬虫; y# g: H2 l. n! e0 f! |6 Z
            # Thread_num 为线程数目,默认为1 单线程7 z+ W& t# F1 o8 n7 P
            status="threads",
    . A& K5 w  I+ n( k+ V) A        Thread_num=3,
    ( A) x, s. h. x: Y4 u+ P        ###& _  D: ]& o. K3 N6 k" v, [( ^& p
            write_SQL={* `1 ?$ n& M, J, V6 j5 O/ }/ [) h
                'host':'localhost',
    - ~- G" i  v  X) }) Z+ {3 s            'post':'3306',
    . Y8 ?. W4 g, _: S3 |; O' k            'user':'root',  i; p6 `) }* _+ ^
                'password':'123456',! z: O# p4 |4 e* x
                'db':'example',8 Z7 K; @* T1 N3 V8 [4 K
                'table':'example'2 F7 ]5 m8 C* O# ?% J0 u5 m- y: t
                }4 x; i# w: }; _6 ?" [: \2 b) R! u
    ).run()
    $ S+ W! N, @1 F- E9 y& y2 ~8 f: m
    - E# ^1 y. N' @/ n2 x5 h& [9 \第十一种玩法:多进程爬虫
    0 c, ?* q8 K' t/ ?" P( D, ^特点:
    ! l0 r& d+ c& Z8 Q爬虫速度加快,$ ]+ ]: l5 N8 _. |
    更好的利用了进程。( W: q5 F, ~- M; x3 {

    , A8 |* Z) l( T: i- w4 o缺点:暂无
    5 `* V2 d  F% q$ w& _, g1 ]6 l& b  g' _1 @% I' v( K% W9 r# X/ E
    :return None) `$ p: ?$ I8 }

    - F# }* R7 {. u: Qfrom simple_crawl import request/ \4 |0 O6 n4 q; J
    request.parse(. k2 w' C. X& r+ ^
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    4 g: x# B# @7 A        #login="taobao",- t. V. `! A6 W3 x# z- |' d
            type_url = "text",
    5 R/ o4 i7 B, ?5 m        Parsing = 'xpath',9 h/ a  k2 W0 ~5 t: o6 H* X2 p1 l; ]" D3 m
            label = {
    0 v! B" W3 T1 E8 L: _1 W            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    5 K8 z6 Q1 R7 E! r5 Q8 @1 s            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 I" ~" l: R# j, y  ?. t5 P
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 }% m* q& K. o/ f: v" j% L
                },
    + e" E) U! A5 v" W) o" G( i# u        write='result.txt',
    * g: |' U& O  `+ K        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    - t; |1 L; N5 c  f" z        page=[True,"now_url.txt"],9 L8 N  f% r# \* v' C3 P+ _
            #clean=True,) j$ s9 `: J. D, ]
            texting=True,# d1 l4 q% m* I- w1 Q: d) T# N; ^
            # status="multiprocessing" 启用多进程爬虫. z- h  {) |% r; b1 ~
            # cpu_count 为启动代码核心数,默认为系统核数一半
    " B% N) }/ z3 O        status="multiprocessing",
    % x8 m% T' ~: T' B5 J6 G        cpu_count=2,
    2 @! i, s  t; n3 L+ K- A; |        ###
    6 e' V& r. A! Z' l6 J        write_SQL={
    + ]0 ?; m* g- x            'host':'localhost',  a# g* a# S. ]
                'post':'3306',
    # F7 B( ?5 i& C, A* m            'user':'root',
    $ e" z1 [/ z0 n            'password':'123456',
    + s3 m; M# m, @$ u, \            'db':'example',  H- n  p( |, n
                'table':'example'
    * F8 k; v% U9 a            }3 }* o# `1 b; ]( m& U
    ).run()8 J5 ^* M& u0 @% p* C' {# W

    " ^$ \; @5 d6 ~1 f$ t1 l第十二种玩法:异步多线程爬虫& C" ~: Q" s8 G# K, p" s* J' T
    特点:  w1 X! h0 U, {' |1 h/ ?
    爬虫速度加快,
    : u& P& k/ M# S3 ^# O" N异步使得爬虫无等待时间,& Q0 o( V6 O+ n( ?
    同时使用多线程速度明显加快。
    $ v+ c- ?# `2 {& A, d3 y  q9 A7 A( z' W) u% p& A
    缺点:暂无/ z; d3 [* I$ X! n( n2 D

    7 q  X/ E9 d1 B& r$ G! A7 u:return None
    ! e* f/ O! V+ W0 O5 d! X9 c
    ! h7 J+ q$ Z  Bfrom simple_crawl import request1 ^6 k; V7 \# g8 J3 |* x
    request.parse(
    9 F0 b' M: s. l3 m' f+ A        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ) @8 \: x5 _4 S        #login="taobao",0 u/ X8 ?/ }( R' A1 X4 z5 L
            type_url = "text",1 o9 X2 f* j( r- z# I+ H6 v
            Parsing = 'xpath',: ^- m/ G3 w# B; m
            label = {- U& b  L( g1 P& f% {( j
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    5 [+ L3 Q% r3 k# i2 \' _4 }$ I            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  i) E2 [' \1 O, I- a7 b
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 ~  D4 }$ ?" L5 Y( p$ z. m            },
    % }& q* j* Q; r* L, M2 K: f        write='result.txt',
    ! V, m+ O7 P* M3 q" f        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  k% p" f9 R7 l! B
            page=[True,"now_url.txt"],% V  m& m# N. p
            #clean=True,1 a5 U! h- }: T  N" W0 W
            texting=True,% F' _" ]7 W$ G  {2 R' U( R8 _
            # sem 参数为异步引擎数目,默认为59 t& V0 V) b; `& v2 i% W
            # 其他参数同上% ~' m! z( N( s8 M0 O
            status="aiohttp",9 Y. Q# _" X4 [8 i
            Thread_num=3,7 K' [( t& w& F2 N
            sem=5,0 f2 t" L; D  G/ I
            ###8 e! N) E# m9 N" r  h7 H
            write_SQL={; t/ t# X: P' {' K, q3 ?; y1 C+ ^
                'host':'localhost',
    ) `* l  c+ t5 }            'post':'3306',
    8 C7 V* [% q: O. u0 C! l: T            'user':'root',
    % f+ `4 _; u# G4 w/ p. a+ G            'password':'123456',
    : X7 e- @  K) G! T9 n/ m; ^. B1 q            'db':'example',  |. [' }6 [* P$ [* v
                'table':'example'
    # O$ G: I5 p7 m5 `. [            }
    ) I0 Y- g$ X; O- D/ z).run()
    " J/ w7 e( M7 f. o' d/ I
    5 h3 T9 E5 Z9 K第十三种玩法:异步多进程爬虫
    4 h0 J2 L1 p$ E% ?$ L7 \& `5 n, \$ G特点:- z7 \' Z8 q6 Y( P# u  B
    爬虫速度加快,# k! A$ g9 @8 [/ n: o
    异步使得爬虫无等待时间,$ P8 m, a! \  q7 J
    同时使用多进程速度明显加快。
    8 n& X' d% M. \1 _8 j
    4 n2 p4 i% N. j6 O: Y缺点:暂无( ?& l: Z7 `/ k" z7 T
    2 v, N% z  r/ a4 G
    :return None
    " q* U6 O6 C. b
      f" g: j+ s5 n3 \' _' Zfrom simple_crawl import request
    3 |& _( P& I* e5 w1 z" xrequest.parse(, U* y+ u* ^8 H6 i2 [
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    - N* ^7 R, g5 q        #login="taobao",
    ' P2 P& d7 G5 f- j        type_url = "text",  X0 l: W) u8 ^* O. J; s  g" ~, T6 k+ x
            Parsing = 'xpath',
      W8 H; Y$ @$ Y  }$ P) U        label = {
    . D% H' F! ]/ D* K6 P            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 _4 Z: w; T1 ^
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    0 q1 }* l6 c( b5 n            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ w% q0 \+ g1 X# s1 |
                },9 v4 v1 |- ^" P* z; A$ M$ ^: G
            write='result.txt',
    + B: Q. Q- q% S; q) ]/ g2 }4 r" i+ B        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',4 ^" d' M* r; G' B2 v
            page=[True,"now_url.txt"],9 _& v1 e9 C  S' o; F4 W
            #clean=True,/ k' l$ Z& w. q& I& H, X0 ^8 s/ b
            texting=True,( L! A& |; ~! Y
            # 参数如上
    8 {+ D( w0 _- W/ P/ M  Y        status="between",( q; J) e3 d" w; M1 B
            cpu_count=1,
    3 u& @+ G' \" q        sem=5,% i! x" M$ a" O
            ###
    ' p; @& @$ l4 X) `        write_SQL={9 s% N3 W, W$ {7 ^/ m. m4 o- F
                'host':'localhost',# m5 z  S5 T9 Z; {
                'post':'3306',
    3 q- E) j$ N& \8 G( r) o; D& q1 u            'user':'root',4 {- T% ~' h) o5 I6 H
                'password':'123456',
    - G! [) v& @% a% K8 L( ^            'db':'example',
    . b, A' D$ O+ `            'table':'example', b( B7 w/ P' D/ K; Y  q% g+ }
                }) W' p4 ^- q5 D2 V* }  m" |2 V6 t1 R
    ).run(). A* ~9 O, S2 Z8 M! ]+ N

    # H3 V$ F' h# D- k1 r; k5 b' e7 d4 x, u) T$ R- f" @8 S
    功能介绍完毕🤞+ {& g( \+ G& P" Q, f. c
    最后还是希望你们能给我点一波小小的关注。
    / n" d- k  N- _7 Z: A! n9 i奉上自己诚挚的爱心💖
    . T& T  I. T! O& C8 o————————————————
    * k6 c' o0 m6 e% {版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 G2 Y: a% y; d原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684+ v/ y* D; f/ p) i! s9 u- }
    4 e: k+ a6 e3 Q+ ^+ E$ O
    ; e5 X2 Q, o) p: }4 v9 D
    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-22 21:34 , Processed in 0.500859 second(s), 56 queries .

    回顶部