QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5429|回复: 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
    5 T* O; P4 {& j  Q4 zsimple_crawl9 o  b' V: v3 d4 S3 O  I
    仅需一行代码即可达到爬虫效果' H& O/ ~4 z" p3 u6 a
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    " A2 O& s3 L, P8 h1 d0 n使用方法. w& J: U1 [- d+ L
    pip install simple_crawl/ m- I- A) z" X! t  L; q& I
    4 y( V" H6 y" H9 f
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下3 [- I+ ?# S) ?& D/ R% ~# T. ?2 ~/ |
    from simple_crawl import request2 g" y% K, ?3 s' Q
    request.parse(
    & F$ m6 m2 D2 T3 H/ S; ?+ j        # status 参数为运行状态,支持单线程多线程多进程协程以及联合2 W, Q. h9 A8 z- d' M/ p
            status="aiohttp"," m0 u" X# E  Z. m$ ]' E% ^
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式; `# h) O6 k" b/ E8 Q
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    4 M; I- Q3 \/ T# s! @0 X+ E' ]        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息/ E0 H! N4 \9 g
        #login="taobao",
    , R0 x* l8 c, x7 H    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    3 ]+ d% b9 N: R/ G. o    type_url = "text",
    $ D8 D( s4 E2 M" i5 n9 s4 `    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    * c0 G+ J1 H( c6 b% D: m    Parsing = 'xpath',8 [3 p6 f; B) V% J' h! n
        # label 参数为爬虫解析过程,字典格式,详情见下方, i# B6 ?/ d* V+ {
        label = {
    / s$ S3 S: D" ~) f, q2 d, p            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! m0 [. _0 ^$ _# p8 J
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ Y! Z' k, E* ]3 Q$ _: B1 \  e            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * W, R8 x( u' Z' f$ D) s     },
    ! g, f, F! D. a& ~4 i4 w     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    4 ~: V0 `8 k+ g$ r' o4 X. q7 M     write='result.txt',
    : E" Q! o( }2 z6 N/ c     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫0 l3 W3 ?! T* N) E, |
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    1 Z5 X5 a& X7 J# h# c     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    6 o! }# d  v  y% z  o" e' h3 T     page=[True,"now_url.txt"],
    3 v! U* O  g4 i8 f+ W     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    5 S% _, e) J" F% i1 Y     #clean=True,* K: Z& E& S6 p
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    ! G7 @% x0 B& ]5 A# A: p2 d     texting=True,
    7 n) {) F' p4 b4 _' k8 n$ \     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态  q( a- D* m( v" I, V# ?, J
         Thread_num=3,
    . h3 |. V5 u) u. {     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态) ?) R/ d7 d! {( z
         cpu_count=1,
    , }' |, b8 Q% W     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态2 U7 i/ q1 L8 e% V6 i& p
         sem=5,- y3 A* S0 w8 F8 l) [& ~
         # write_SQL 为是否写入数据库,默认否
    / Q% ?' P8 s0 J9 d     # host 参数默认localhost
    + K* A6 W5 r3 I     # post 参数默认3306
    2 l& D% u5 y3 p$ a     # user 参数默认root1 l: N( E4 n) x. `; j# h
         # password 参数必填,必须正确  s& s8 D# H0 e
         # db 参数为即将存入的数据库名,若不存在自动创建/ e9 \; n' `- Y$ ^/ O
         # table 参数为即将存入的数据表名,若不存在自动创建2 i8 D8 u+ W% }4 L7 E+ t
         write_SQL={
    0 z7 h' `0 M# r% Y8 F' @4 E$ v         'host':'localhost',+ I( k% ~$ i' _5 k5 z6 _4 z7 R9 D& _
             'post':'3306',% O/ P) }+ P+ A* @
             'user':'root',
    4 |, v1 W9 Y& l: \% p         'password':'123456',& r# L- r: H+ K4 s, f9 V7 W
             'db':'example',
    : J& ~6 C+ w0 N; [( l         'table':'example'5 U8 s5 }7 a1 t: g$ }
          }
    + n0 Y% ]1 x5 ^/ R7 [).run()4 B1 i6 j/ u0 Y( x" a2 o

    , o) M/ y. ~2 v2 S1 ^介绍一下crawl参数设置:
    8 d7 {6 o. h& ~. V1 j; S  o* R7 ?$ b* {* H" m1 V% [' l
    '''/ o$ J) T6 V7 E' K# B7 @0 @
    单行代码爬虫程序执行$ c; u- s0 b# W* t  R$ ?1 I
    :param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档; p: c# e& n' b
    :param url:即将请求的url地址,仅支持get请求% r5 X& F' w! g6 U
    :param type_url:请求url后返回格式,支持text和json格式返回
    + n; P3 S  k* k, \, r& u:param Thread_num:即将启动多线程个数,默认为1单线程' \4 c! \! x& @7 I$ A+ I7 Q  J
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    - _0 i  Q# _5 R/ }; Z:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    & R! J9 k" {! r6 k: B8 N:param login:模拟网站登陆,保存登陆信息- j1 c0 @* l0 m! c3 Z% m3 A4 X' q3 a
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法. b6 T/ O$ }' u" o  G
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    $ m; H9 X# r6 z3 `0 f8 c( V! V                       多次报错结束程序,默认否7 V# Q7 J' x% D3 q1 V5 R
    :param label:选择器内容,字典格式保存,2 v# p8 v( M" ]  e0 U  Z) b
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    1 M3 f6 i2 h  m  @                     第一个参数必填,第二个参数默认str类型' ^! B$ w$ \/ _/ z1 {
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否+ X" l1 l  |+ K9 o( e7 I
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫# [* t% a# H6 L4 T7 G* {
    :param page:是否选择断续笔记接手下次爬虫处理,默认否
    5 v6 S$ i/ C' _% ^5 n- P9 ^:param clean:是否进行简单类型数据清洗,默认否! @$ ?3 C  Z+ Y, w1 s+ n
    :param write_sql:是否写入数据库,默认否
    9 w3 k, i: h- F. z, g                         'host'默认为'localhost','post'默认'3306','user'默认'root',& w3 ~% ]) P7 z0 _: r4 ^
                             'password':'密码','db':'数据库','table':'数据表',( G+ B5 E0 {& [) |8 Y( j
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    , J5 M, @5 T5 ?4 \8 X' H0 w, Z  T4 E                         检测表是否存在,若不存在则创建,若存在则直接插入- N, W2 u! B' P. {
    :return True& w% |9 Y+ C6 |" |
    '''
    $ _# g7 _1 K3 r介绍玩法: b( V  K& m4 u; K( x  p
    接下来介绍的均为调用第三方库的情况下运行:5 U5 ]* k9 y' [2 k  p& f
    9 w9 n7 b( E/ Q' t3 z
    from simple_crawl import request
    6 T( K" G4 O3 F) ~第一种玩法:输出源代码
    & C! `# Y2 i+ t调用requests库进行源代码请求。8 Q9 p0 m& U  Y* k6 e* G
    5 a! s0 G3 Y, \2 ~3 P6 p
    特点:
    . |* _8 t- Z' w/ g请求失败则调用ip池处理重新请求访问,
    ! `% e; u% A) h. G出现五次失败默认网址输入错误。& J5 U) T0 ?* N% P& v; }
    支持text以及json字符串返回。默认text。# ?! P. m( J8 ?# L# H6 P( E
    : Y" m4 _; S  f  K
    缺点:3 A1 T6 C+ m# m) R9 |% l: A% ]
    暂时只能进行get请求,不支持post访问
    4 J8 E; P0 O5 T6 u# q8 S) }" e" ~, D7 @1 q- n
    :return text or json+ w' z) |/ K; U. Q

    7 {# Y3 V/ q2 f! L, Crequest.parse(4 R; S$ N0 r& p
            url = "https://www.douban.com/group/explore",
    ! m/ S2 K" O, G& d        type_url = "text"
    , F8 ?" I+ h& Q2 {; n/ C).run()
      G0 e3 _1 e: M" e# R  d, r  \# return text1 p" f. E/ b- x; v% o, u  L
    ! i8 {/ P2 k& l1 o! \
    第二种玩法:模拟网站登陆并保存信息
    0 [0 ^* s5 L6 `' r2 i1 N+ W调用DecryptLogin库请求登陆访问。
    6 Q  ]  ]9 E, E2 V
    + ^0 B$ x: s) j4 w. }ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    - V# X! J" e% T$ H; N在此放出文档地址
    2 l/ L! S* H/ T& A. I* N2 JDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/0 |2 J4 G# j* _3 }4 \9 N

    ; ]4 U3 I2 f1 [  a特点:' J6 }, [5 C( r0 l, h# n& T
    将DecryptLogin库中二维码继承到此库(非二次开发)
    # ?5 C* o" ^, m  R# g$ v支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    . D" K/ I, ?5 V& l3 w& X( o保存session.pkl信息到本地方便下次登陆运行8 B5 Z5 C. @; r: G# m' B

    , c) W  F" ^- A7 t* h# F缺点:7 W" _- O5 i3 y5 D
    session.pkl登陆信息过时无法自动删除。
    2 L% z, }! a$ }6 f9 x8 G6 U! }导致下次登陆疑似cookie无法正常登陆。
    " }- u& t8 |5 {
    ; j4 N$ u. D, K& _  S:return session
    " ~, {/ x) y$ b  Y7 x7 J0 `$ e  ]5 I* V' X; Y6 e
    request.parse(
    . r6 k5 @6 s/ C0 u        # 臭不要脸的推广一下我的店铺. D2 T- i% Z) [5 `
            url="https://shop574805287.taobao.com/",3 F, C% X0 P8 c& \( A$ o
            login="taobao"
    , k% q9 {6 y, E9 @).run()7 g0 {1 m( k- h1 [+ p5 B
    # return text, {& n4 b5 k/ l0 Y3 s4 b- z) K
    8 Q& D' _* g/ d$ `) D; t
    第三种玩法:爬取网站信息, L) R" m8 D  _! T2 g
    爬虫库自然少不了爬虫的过程
    ; e. q$ ]- r0 i
    & Y* k5 @  i: o, }9 C" r4 `特点:
    ! @. h$ {+ o  f: G5 o1 o支持re库,xpath解析以及bs4选择器。5 o) j) C7 l) n& f5 Z* B+ D
    爬取方法为字典格式。单方面输出。
    4 e1 J; C+ C& |2 V, D" B( x字典键为保存的字段名称。
    & g  N2 D% j8 g) N/ s+ e% |字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    * w/ W2 i$ `; H: R% y" E/ j) R/ M! k3 ^- I5 @
    缺点:暂无(等待小伙伴们发现)  z! I: j$ l0 z. q- ], H. s

    # y) D; g/ y. C# K- S% K6 X" Z:return reptile_results
    : ~- X5 Y7 g& o! y9 u6 X  T6 F
    3 N, p9 `+ r; b/ m$ Rrequest.parse(
    ( b  B9 J+ h0 @7 j3 x+ K$ ]        url='https://www.douban.com/group/explore',  g2 |2 b/ q/ K; t8 ^& |  S
            # 字符串格式,选择器方法。
    6 m' C# Q7 |7 }    Parsing = 'xpath',
    % h: E6 M/ |* U& n4 x( M    # 字典格式,参数如上。: j2 D, w- N/ L8 t. a
        label = {
    ' I! q& {- B, [+ R( h        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],6 }1 `! m0 c' d2 y4 l( Q
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    + S% P; p  u3 K1 b, t        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 F. y* A$ w3 I  r. R& V
            }
    - X: e* \3 g9 I- p7 A/ U& i).run()6 h7 `" _/ M# q/ a! z7 O# {6 r% e; R
    # return reptile_results(list)/ T% ~0 i8 I- D

    & W7 z( Z4 }: x) |. i! a第四种玩法:自由保存信息* M. ]; E( {- z* T
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    / |9 `6 V0 K+ a" l" K1 O
    ) I  X; f# `# ^( O* w2 C: A特点:3 w, j1 }: v, V
    写入文件均为数据格式传入文件。$ f9 |$ A, B% w4 l3 T
    且输入格式规范方便阅读and省事。
    # ~6 }4 e& N) w& m9 s% l
    : y! l  D: `  G缺点:
    , [* w" b7 `$ E* y% L8 W; J保存格式仅四种,
    + f4 b+ J5 D* X6 U* B1 \不方便用户之后读写操作。  @7 X0 \, e  n' G/ _# U9 a& V5 T

    & W: F  u- V+ L4 J/ D8 D9 B- ]. G:return file
    / ?/ W( ?2 Z5 `- m9 S( }3 [
    4 n3 p7 }' J/ O! i/ O7 C/ w, X! Nrequest.parse(
    $ l% p1 i, k/ g. _2 G# t: d) |        url='https://www.douban.com/group/explore',
      V9 Y0 j: L: @1 U* H# u2 R    Parsing = 'xpath',
    & Y% `& P9 |) j( h. O2 ?: D    label = {: `6 B2 `/ O6 Z: f0 a. p, X
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    3 d& D5 ~( b2 \' F        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 G+ g0 G6 z' D; B& [; A& ?
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 u  m/ H* O: H2 d! w4 x6 O. n        },
    + m1 f8 v+ |# c8 m# u6 ^! x; @    # 字符串格式,具体保存位置填写
    # U: B5 c$ c3 \6 r9 O# M    write='result.pkl'
    8 w& @  v, H2 R4 n* N& x).run()% G- T: O6 E6 o. K3 b6 ]' K- u; A5 c
    # return file- z7 d; u% s% l; E* @

    ! o6 U6 ?6 m/ ?, f( [/ B, b& i第五种玩法:读取下一页 url 地址继续爬虫
    ) w2 [: d# l+ l这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    ' P# ^! O6 B4 C3 y) d) z' o' |# k0 O' G: r% C
    特点:' L+ A( k2 C& a% l4 E/ v
    继承之前的Parsing参数选择器选择方法。4 m* z& T' b& D; x$ ^# v+ ]
    在这里可读取到解析后的下一页 url 网址。
    & U& A. H6 m  K% K  E方可继续进行爬虫处理。方便用户使用。9 a% D% Y/ T& {% C
    ) u' J- o3 s9 T; C  u9 s
    缺点:6 o% p& [. j: F5 K: W# |
    若爬虫时下一页 url 地址改变,便结束爬虫。2 T% }/ V0 c! A$ N- Z, C
    只能爬取所给 url 地址中的信息。
    + q( M2 I0 e0 L无法进行某一界面的多个网页爬取返回。2 h! o( o1 f- M9 p
    造成访问页面单一流失。
    $ v2 E/ ?. `' R2 v  }  X1 D( T8 A% }8 r! [* z) N$ p
    :return None% o  P1 {( s, H& Y& _

    5 a7 M$ p% ^5 J( l" Arequest.parse(: I" \/ q7 I" X. z9 S& I  E
            url='https://www.douban.com/group/explore',
    0 l/ o) G  T1 I4 Q    Parsing = 'xpath',
    8 [$ a5 g- c8 j* ~; j' J0 U5 C    label = {
    " J5 |9 b9 [" ]! G  E        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, g4 P! n2 B8 W5 B/ _1 r8 ]% z& ^' O
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 u4 |3 E4 j4 P/ m) V5 q' z
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]2 C2 u% n2 V( W- V3 w( B) I
            },
    & ?* F& E: I/ L  ~    write='result.pkl',0 j; v* \' ?# v. g
        # 字符串格式,根据Parsing方法继续请求下一页a中href) J3 z+ {" I5 L3 t+ }8 h
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 \% x0 a* c& P).run()
    1 v4 d# b% A5 W( D/ [2 ^2 j) |# return None
    - g4 ]1 C7 z, g+ a' o
    ! q0 h; }( a+ E  Y3 T+ V/ Z第六种玩法:爬虫网页保存
    + D4 U8 Q9 g$ Y6 F7 ?$ T+ L1 \, J听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!% }% `$ j; {8 B9 m4 r. G) A2 j+ w
    : l+ q  K! _8 B4 c
    特点:/ u4 c, x6 k  [& V: g
    持续输出断续笔记。- B1 |" t9 I0 u1 j
    将此次爬虫的 url 地址保存到一个文本文档内部。+ u  C5 J) }& I' C% U! x6 i
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    5 E/ Z2 r7 s! z
    , X% G7 w5 Q2 \' q0 @( N缺点:' i- x7 B! O# |, [' P) E1 S
    读取内容不单一。& C7 B/ U2 O0 Q$ K8 u+ G5 j, ?& S
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。/ j1 |% B& \* I
    ( Z6 J' F8 c% Q) K+ C* s7 w
    :return url_file
    ( z7 c/ J7 V6 D% f! W
    8 M) A# l' I/ D$ r' n( frequest.parse(
    , w( W: p5 R$ w5 m% d& i    url='https://www.douban.com/group/explore',
    ! }. k0 c9 Y2 L7 L8 _+ j3 D    type_url='text',
    ( t6 \9 }4 r" U' r6 l" D1 C8 H    #login='taobao',8 H9 u0 m. L) U/ ]
        Parsing = 'xpath',
    ( c* ~  x& m5 ~9 G, X& ?    label = {2 W* d# A2 I- `
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ H# f% K. S8 q4 O$ b" |        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ( x; j7 R' |+ D' N) e' D        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 r: K2 }5 U) v; c$ |
            },
    & G# ], v8 F  g3 o) m; g    write='result.pkl',; V9 ^. ^+ {- m/ ?+ W
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    , @8 u& u) o8 r. U    # 第一个参数为是否需要断续笔记。9 Y3 u% p  @) f. a, [1 f
        # 第二个参数为断续笔记保存位置。( \7 l' [+ ^5 z  m2 a% }0 C* T
        page=[True,'url_page.txt']
    5 J4 [- ^! }  ^& x- h0 n: |* v).run()
    & y6 u$ L! @. i9 a# return url_file
    6 a/ z; a4 Q" E
    - o( q2 N% E/ _" b7 x第七种玩法:简单数据清洗+ n' p+ U: b5 b" |
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。# M  b# s% c# x( {( h9 b' \, G8 r

    1 x0 ]7 h4 c8 C' \4 T特点:
    3 R- a* b' t6 W本人曾写过一个底层数据清洗。
    " N5 s* L$ J9 J7 b! I能将列表格式数据进行归分清洗。
    $ L/ a( \# F5 v. Q- C0 j; R主要内容请参考另一篇文章* {6 i* B7 m! ~) [$ e
    如下连接:数据清洗
    ' z5 S4 D, m8 J) e8 B% \" |5 p6 g5 _4 R8 Z" j" B9 S7 [
    缺点:
    5 J6 s  o/ N; N7 B' N数据清洗格式简单。
    3 `  t6 v7 W+ ]9 c) X数据清洗内容单一。4 g7 E) v( @/ I! H: b. C
    无法完全做到绝对清洗。* N7 G7 K0 @4 Y( i% Z' w! s
    有待改善。
    3 T* f$ g& u: O# V1 x( V) N% B& u$ e
    :return keyword_list, value_list, B- p- ~9 ^9 Q3 [# s( o) h4 q

    : D! B& S0 p- W+ j/ o' ?3 q& q) c0 Frequest.parse(+ T# O( u$ H* P, @1 j3 _
        url='https://www.douban.com/group/explore',
    ' {& c. G# c: q$ z$ I9 K9 @% o    Parsing = 'xpath',' S2 f$ w* J# r$ c: H
        label = {  [" K- h1 v5 {( ^6 U; V, X/ I
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 V1 G$ t7 Y4 v5 r+ M( j' j' k
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    % l" V7 c4 A; h) D        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 e& e* \( i: [' }+ A' \
            },
    / o3 u* k5 v: i8 U' h* H4 J' q    write='result.pkl',+ B, y$ N! z5 B7 \* z
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& [' U6 Z) W; ?" o$ N' }1 v$ d
        page=[True,'url_page.txt'],
    ! Z  |% o, c9 Q    # bool类型,默认不清洗9 {/ n6 T6 Q5 _* U1 R( o
        clean=True  i& c: `# R2 U* h; M1 v
    ).run()( B6 [3 D' C: D, W

    + b0 k' m0 E7 ^- ]# b  h% H1 p第八种玩法:爬虫存入数据库5 @9 J" Q( S+ L1 g# y- A+ }
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    " |  R# Z! S. k# H; x  f
    * R3 e! J6 x, j0 N+ E6 Y特点:8 D2 c" `9 r$ }8 ]
    信息存入MySQL数据库。
    . Z2 k/ N/ Y$ Y8 H5 @8 g" u可连接docker远程数据库。
    7 _+ q: X" {* |; k! k$ \数据库的库名可以不存在。+ p& Y; ^0 w8 @! u3 X  P
    数据库的表名可以不存在。
    . u4 d6 K( n& D8 s6 o. l* s根据之前传入字典键与值参数判断表类型。
    ( S$ K* @3 |7 x" B- D; E% A自由建立数据表传入信息。$ k! n1 A0 }) ?$ m( p% `$ M3 i
    ! W9 A8 n& b# h' C& |
    缺点:- d* B' x( O5 @7 q) b
    仅支持MySQL数据库。
    9 y0 J! k& j  I/ g. i; I# e
    + D$ u, ~' p( V% U& i:return SQL) g9 o" i8 G" `9 F1 r) t: b, G
    - J. q5 L# _3 `6 d: Y; @
    request.parse(* E; }5 K1 E$ M8 H/ y2 A' G
        url='https://www.douban.com/group/explore',) B$ e8 L! i1 w) Z, X
        Parsing = 'xpath',' l7 D  z0 C9 s2 m( T
        label = {6 g# J* K/ }2 X4 m4 e
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , o0 R5 {$ X4 K# v0 U( L$ T        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; w  Z0 N6 R( X, Q, l0 P
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % Z4 n" l7 R1 L" l& X& ~5 v* \        },1 D- u' {! g8 T- j( j5 ]
        write='result.pkl',# A* `4 t- i! {6 ]: n+ Z$ V; k
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * ~4 _. r" p; _( _9 o; ]7 c! w    page=[True,'url_page.txt'],* ?0 h6 M  B+ O3 c7 {8 |( w
        clean=True,0 |8 x5 |3 g- y1 f6 |; O. `: K
        # 字典格式,7 W9 v. Y* z* Z0 [6 h
        # host可有可无,默认localhost. D  s. a! J4 u: u3 E; j* o$ q
        # post可有可无,默认3306
      w! W# ^; N- `6 d- i# p# O    # user可有可无,默认root6 V8 z  L0 e% M5 p2 L
        # password必要参数,数据库连接密码. g2 T7 h5 u" K' Z8 X# J/ n% c7 i
        # db必要参数,数据库即将存入的库名  @1 M7 M5 V" `' ~' \0 N
        # table必要参数,数据库即将存入的表名
    0 `+ s3 f9 x) h8 P7 n  _7 p    write_SQL={
    3 O) Q$ y( v9 J# u7 ]4 u        'host':'localhost',
    . @5 l5 `4 P  x' y2 ]* y5 y        'post':'3306',9 y/ ?! z4 P. K+ ]" R5 D. Q, n: q
            'user':'root',
    * }9 ^) {( Z# j  @5 e- J3 L; X        'password':'123456',: R( h) v; A2 {1 {1 E2 Z; V! f
            'db':'example',6 O) k. \2 _: l( }/ D; V
            'table':'example'
    * Q9 K% b$ y8 q% n" B' `6 z7 q        }
    ! N  C1 E. e9 ]    ).run()
    $ i7 o8 w3 s3 b3 G1 d% Y/ C
    ' |& H/ ^1 g2 Z: ?0 p" g7 ]第九种玩法:重新启动爬虫
    6 h6 X8 U2 n# O2 l爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    : ~# Y* M6 c& H% Q& f2 r, A# p
      f; L5 k0 E  s! k特点:; Z  @2 e( e, U  N- c: ^/ `
    检测报错重新启动爬虫
    ( K0 B0 a+ c' O无需手动处理错误信息- l: t, k: Y+ D% K
    5 m* F# ^2 l4 Z$ b' c/ M" P
    缺点:
    ) J: u  _: U' w. j  q% L( w0 c5 ?无法收集子线程错误。
    * n. K/ [6 H, ~( v1 F6 e8 a8 s, c0 a' j7 s. E
    :return None
    $ X0 u5 i. j1 @
    . h. V# e% R1 g* Jrequest.parse(
    2 f) C* z; [; {1 M6 a% p        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ' |7 s; V7 F( p4 W( Y        #login="taobao"," B; ?7 N" I. ]+ j1 S9 z2 t+ C0 N
            type_url = "text",
    , [+ X! b' I. w7 D        Parsing = 'xpath',( q( i$ x) I8 g7 t7 X. T
            label = {
    3 j1 N. F# }8 s; @; F% F            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ u& d4 C( i9 I# j" B3 K  o            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],) C$ h3 W2 J; ^0 ?7 K& [4 m* x
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 _1 p' v6 y  Z( M            },7 ^- b: V! R- D, R4 `8 M  p
            write='result.txt',0 U# [& O$ J% n# f- J- n' m
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  ?7 w2 e' r0 ~0 b5 G
            page=[True,"now_url.txt"],
    ( |1 U+ J; g! E' X$ o5 Z1 L        # texting 参数为是否启用连续爬虫$ W2 L% k3 S" }
            # 爬虫程序异常报错后重新启动爬虫
    0 a  t# w' O# J' D        texting=True,( D: r3 X1 ]: e9 @  C  r1 S7 i
            ###
    - h1 ]) @- l0 L/ {) @( ~        write_SQL={
    ) p* I5 Q/ G5 s2 L4 ~; c9 @            'host':'localhost',# A/ d- L: x* \. N# w/ p0 ?
                'post':'3306',
    , E) W7 y0 b" T$ l0 d            'user':'root',
    8 k  ?( g! R- h* o9 i1 B            'password':'123456',
    9 ~; k1 D1 O; h! k7 x            'db':'example',
    : A" V& X& Q" p4 J2 q            'table':'example'( J1 ?& O+ _* J9 C/ f
                }
    ; h9 C# v" H6 t3 k; u$ D% \+ Y. @: b).run()
    : K# M% A' J1 C" ?) _7 T/ M) S. W5 h0 E9 k8 W: n
    第十种玩法:多线程爬虫
    5 @+ q7 a+ M3 y特点:% t- Y( `$ \* X+ [4 J, @
    爬虫速度加快,
    1 H. E4 H9 ?( f1 \* w更好的利用了线程。
    ) N6 w1 H8 j) [6 E9 v, I- ?
    9 k8 A3 ^% A+ Q: i: y3 n1 T缺点:暂无( Y, i- e& t" e9 s- H2 k; t
    ! o0 j1 ]0 y- |# C6 p
    :return None
    0 W; A; C* T( y& G+ |! M2 ?
    ; P; m! j, ~8 y; ^% P6 P0 Wrequest.parse(3 X7 w# ]: H) @- O' ~6 X& K/ J
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    * K- b5 i) q1 P1 F1 {  R* V        #login="taobao",! S/ [$ n* C' o% O" T* B
            type_url = "text",
    - d; H! Q8 U1 e! o6 N# I; V3 g1 Y        Parsing = 'xpath',
    2 ^( Q) d7 F7 b) |. a- w  w0 \+ M9 B        label = {' L  H2 K1 x3 f; c4 Q; l1 ^  m
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," t, Q5 b5 [4 E7 p  Y) p; t
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- v4 c- S8 Q# Q; d& E- G& b4 B
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 G% g' U+ `0 a/ h! I( q
                },
    % M5 |! l, ?, G6 p5 h        write='result.txt'," g5 ]/ Q3 M  B, K$ u# [0 R9 ~: ^; P
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    % Z7 v* W2 y; ]1 `, y. N8 a        page=[True,"now_url.txt"],
    # R; G+ [/ W9 V1 i+ `; F        #clean=True,- `, g7 A0 T& d; @; \7 T0 d* {. ~$ l
            texting=True,! F& o  o4 w) H& K+ n( g
            # status="threads" 启用多线程爬虫5 b& b5 l" J# h) W. z
            # Thread_num 为线程数目,默认为1 单线程' u6 S) l' E3 g( E
            status="threads",; N* f# r' U6 M" P- v7 A) ^
            Thread_num=3,3 M$ O  e/ r  L$ |% }
            ###
    * D3 d$ Z9 d! ~0 D        write_SQL={4 |3 [% e, X, ^: u8 G+ ~
                'host':'localhost',5 s& L! P- J' I: d7 X4 B
                'post':'3306',0 K) I  R# n$ E! J$ i5 a+ M6 H
                'user':'root',
    - b$ L. G( ~- i) b  m0 b            'password':'123456',2 H2 z4 C% c* }' b/ p
                'db':'example',
    2 r: j, Q0 y4 n9 h            'table':'example'8 n. T) A/ H  v. F
                }
    # @1 V/ c( M3 L5 |& x).run()! _( t6 g# G' z; R* p
    9 W; b8 t0 Y# D( K& P: d& {
    第十一种玩法:多进程爬虫
    9 V7 w6 h+ j: t% @* }特点:% X  W0 }9 r/ y  t" ?
    爬虫速度加快,
    3 D( f( {! `; F5 ^; b3 V! t7 k& a- S% C/ k更好的利用了进程。! q2 A  Z$ D5 ~: q
    : q: V' z! E2 |' e4 S) f
    缺点:暂无0 }- o$ W, l) x8 a& D+ u1 j

    4 v: f  v4 l* k% P1 J: j:return None7 {& b) {$ ^$ {' n# `# ^

    9 x1 B( w; m. P4 f' R7 xfrom simple_crawl import request
    # e. f9 O( {" w& ^4 Z$ U# [$ _; ]request.parse(
    / {' w% B& [5 X; ~        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    . P& w1 [4 [) i# v+ _5 Z' x( X8 l        #login="taobao",, G) v! e6 S. o0 p* r! ?# j) w
            type_url = "text",
    : D) Y! k6 y# E! m; e        Parsing = 'xpath',
    ; a9 g% [- E0 W        label = {
    * @7 A4 d6 x$ t* C9 t7 Q            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 @3 U3 o" b7 r            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 a; p' }2 r6 T, T4 o8 E$ N( |2 V2 T. d
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    + Z9 M9 H6 N2 p( U* T& ?            },+ ]6 T/ U) p& ~/ n6 m/ v
            write='result.txt',
    & \$ C2 |& _( X* ]( M9 r        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) {1 }" O# r2 b' d        page=[True,"now_url.txt"],/ {1 h& a) N8 t: n5 t" [/ e
            #clean=True,! l6 O: k7 f/ h* Y. V* X/ y
            texting=True,; ?; O8 C0 k% l* _
            # status="multiprocessing" 启用多进程爬虫0 I  {5 _  L0 N! K! m
            # cpu_count 为启动代码核心数,默认为系统核数一半. l% G( [( k( k/ y) V) s" U+ d
            status="multiprocessing",4 ]+ u4 s; T: q# A, t; k
            cpu_count=2,
    / I" p/ _: S8 X; c        ###
    - i( j, i8 I! a4 H9 ~* l7 X: Y        write_SQL={8 O% ~' T5 w+ p1 o9 h, m0 Y
                'host':'localhost',
    5 s* o! ]5 L: t1 _: x8 F            'post':'3306',
    1 }. H& Z1 M3 v' H. n) T  i            'user':'root',9 z7 e) D* r0 G! e1 _
                'password':'123456',
    : E/ w! D( O9 k2 i2 @( V  s; a            'db':'example',- w2 U/ f2 j5 [; `; |9 X
                'table':'example'
    1 W& i$ Q, B0 X8 {/ m            }
    # U  ?$ Z) i7 f5 P4 Z: h).run()
    # C/ ^' a0 r" z7 s5 E! v% j8 y2 x) M. t' w( R) N
    第十二种玩法:异步多线程爬虫
    1 z" K  T9 G! @- R: E特点:1 W2 K  |, X+ i( _
    爬虫速度加快,
    . S4 \6 j. a0 {/ w. Y& d; s* |异步使得爬虫无等待时间,
    / }2 W, y8 w2 @% P* I" i同时使用多线程速度明显加快。, y' B  G& c) x* R! P: b4 c7 X; Y! o
    1 y# r! U2 @' W! N+ ?, t6 d
    缺点:暂无
    / w+ @' |4 L+ t9 h
    4 u( j9 A/ r% R# g. v) z0 c:return None8 q7 \( X1 r8 a! A4 T

    2 t, {% R, c% C. v5 w) u1 pfrom simple_crawl import request
    2 K1 a/ r- X3 ?request.parse(
    3 Q% l& a9 f, F9 _" Z! U        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ) |' P3 l7 M) f5 \; ?$ \        #login="taobao",
    - y& t! f# Z, V        type_url = "text",; H& v- f) U5 V) U- A
            Parsing = 'xpath',
    2 s& o" `5 _9 ~/ P        label = {( t5 j2 K* \+ }; P; U5 }: P" s
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],% |; s9 Q; e6 V  r) }
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    4 w9 f- I# ]: W5 C# a            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]% n' K7 f' C( M5 ^: S# T+ H
                },
    ! \8 u9 l' D, U( H        write='result.txt',
    " V3 u: ?; c8 a; ?9 j% `8 X8 \4 H        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : G8 [/ s# v! ^  {        page=[True,"now_url.txt"],, r9 f* m) @  V' Y
            #clean=True,0 P+ }9 Q0 p! q$ f0 E% Q, `
            texting=True,2 ~" p+ V& Y! u
            # sem 参数为异步引擎数目,默认为59 E* r7 d4 O. s& _' c( K+ e
            # 其他参数同上
    ! n7 d$ v: a; L+ l) y        status="aiohttp",2 p7 s. Z% x5 R' C) I. F( j; @
            Thread_num=3,* C3 @+ L# y/ O1 c, F
            sem=5,
    ) M; D" ?( `; I# `0 p& \        ###
    2 O: _/ a0 E; _$ |0 b$ c        write_SQL={: h0 b; |0 E, w# }. C( [( t! w
                'host':'localhost',1 W1 u8 C  N6 ]# E& e
                'post':'3306',) I8 e$ e) o4 ?. X) }
                'user':'root',' R& ]+ Q+ d% U, }# b- a$ h( q
                'password':'123456',. D; E* g' \! m8 Q
                'db':'example',
    + V3 m& M  S. G! f            'table':'example'
    3 \) F8 V7 q* n3 S: m            }
    ' ], [* c' F" i1 E2 ~( e).run()) T5 T7 \/ ]) ?% \
    - J5 ?6 T& L" M: q9 a9 E
    第十三种玩法:异步多进程爬虫
    4 [/ S, y4 u$ B6 J8 }特点:
    8 [4 I9 P  E/ h- ~6 @爬虫速度加快,
    & E9 s2 J6 K$ n4 W异步使得爬虫无等待时间,
      t/ e! A4 }8 S- P$ ]" L同时使用多进程速度明显加快。6 t. r' ~' T: S% n, }4 n$ f* p: {
    4 J: K1 }! O& t# O
    缺点:暂无8 L( B0 I+ N8 Q/ h/ T3 y% X) Y

    " e' r7 Y- Q$ e. v4 V5 z4 U:return None! g6 Z# G: l; Y* n( Y0 ?5 e
    3 a/ q6 F: R" n: G" N% Z, A- \
    from simple_crawl import request0 l8 h) A5 E9 W. Y1 v6 ?* ~8 `
    request.parse(
    7 x/ P1 _8 d& G- C; U; ^) p        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
      D/ ~# a8 K7 W; W% {' X# F, Q( n        #login="taobao",: ]4 c! H$ x- H  C
            type_url = "text",8 g3 t8 r4 g4 c- \) L
            Parsing = 'xpath',  s8 S/ @8 s& s2 X
            label = {
    / b2 m# L! M( M8 v; q. ]            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , o# n- Z% v. ^9 H            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ @% M: A& Y( L  p, L
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# W6 c# J" r9 K7 \. r: }7 _+ Y
                },
    5 F+ U' }+ s! e1 S* x4 t        write='result.txt',, g, \) T, O- o% l
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) p# H4 l" x/ j
            page=[True,"now_url.txt"],( Y* `: O( Z/ t! q
            #clean=True,
    0 [. M! r5 ^/ s: U; @        texting=True,
    : b* ^# \2 K' o1 E/ T        # 参数如上
    + l& w0 m: {0 R! q$ \        status="between",
    7 I2 i, a" [, X        cpu_count=1,
    % B  n5 J6 c9 c+ W+ o        sem=5,
    8 R5 c& }$ X3 j  N: j0 m        ###9 Q4 a& K) ~; B% J) D, C9 p% @
            write_SQL={
    7 k) {7 d8 a+ G1 j# p! _            'host':'localhost',' E. L8 X8 B7 I- R; D! x' M9 J
                'post':'3306',
    6 l/ @8 s8 `6 G: y            'user':'root',
    0 _" _0 _' E$ Z3 [1 `            'password':'123456',
    ; P( G7 t- ?( _' |, x% r4 L" e            'db':'example',
    : O; m% v3 V2 n5 [& r6 X$ [            'table':'example'
    3 b' e% A" F% o2 {2 s: A6 r0 E9 @- V            }7 l0 m7 |, z" M* l& ?
    ).run()3 S4 i8 a7 J* p# C
    $ x( V& i: y( V% n: f. r, b
    ' q" D, `: y0 R7 p- O5 T
    功能介绍完毕🤞
    / v( c3 r" o. x# ]最后还是希望你们能给我点一波小小的关注。3 q5 J! T2 R' D9 l( D. _, o5 Y
    奉上自己诚挚的爱心💖
    ( _, o+ H/ e% @1 {9 @) Z! B! ]————————————————# y% M2 B3 k! V- @
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 j- ]$ `8 j4 m0 Q" w+ S# e
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    , e& m  f( s: n. K! }% D: h, B4 n+ \+ ?. J+ I2 R
    - X3 m6 Y8 Z. s3 \
    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-6-10 20:08 , Processed in 0.503354 second(s), 55 queries .

    回顶部