QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5442|回复: 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* }' c) U1 r! r8 c
    simple_crawl- y) m7 L4 D4 y% n5 x
    仅需一行代码即可达到爬虫效果
    * i+ K  N$ s" h0 d! ]# R9 n项目地址(欢迎star):https://github.com/Amiee-well/crawl8 o7 w* R8 |1 c7 ]1 i! M
    使用方法
    & J- e% t6 U  g" Dpip install simple_crawl+ |7 L0 `, k* p  L* O; f

    ! h7 Y8 b; }. u9 Z; u### 以下源代码为简单介绍,详细功能介绍再源代码之下5 w% z. j# l1 |
    from simple_crawl import request
    # |3 W) ^6 _6 K$ jrequest.parse(! ?+ F/ a: D3 ?# |, {
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合6 R/ J) [8 M% ^, p3 d  J& [( O
            status="aiohttp",; y, J6 M# \6 q$ D/ F* i4 N
            # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式& @7 Y% [' E0 J+ X; J# a
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    & O3 T1 v2 ^" e) d* V, ~        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息) x$ b, C+ `3 F  \  {; b( [
        #login="taobao",
    & o7 l: K7 F/ i- N4 F( [) ]+ P    # type_url 参数为返回源代码格式,支持text和json,默认返回text1 J- T; b+ r! I( d1 e2 Y$ e$ ^
        type_url = "text",
    1 {4 J* E6 [; v* N' F    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup3 f, ^$ ?; N+ U- `" _& a) J$ ]
        Parsing = 'xpath',
    / v! }: d& h1 T% U9 o- I% X    # label 参数为爬虫解析过程,字典格式,详情见下方
    0 O0 ?5 j: X3 g6 n. {; \  Z, t    label = {
    ) D% J$ e, ^7 b            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    / d7 j9 B& ~0 G$ M" C. q" b& P            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . K3 V. B- r9 o* S6 Z            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      G* m8 Q+ Y. K2 s     },8 _7 o- L6 |; Y) C( d" `% y' k' E9 J6 H
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱0 X7 D3 w% @4 N' V$ A
         write='result.txt',
    9 `7 P2 z' j2 N# B5 v     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫, P0 m5 M; F% _8 M$ m7 i
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    1 E1 t7 _7 _: J; d1 c- g9 A! L; a     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫- P# t% B/ H' q4 r1 X; b8 W) h0 D
         page=[True,"now_url.txt"],5 m* t$ h! ]' E' I- s
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息7 [, ~$ t9 Q7 |" w' F) J2 Z3 J
         #clean=True,
    $ [& ~; I& ?; p  K" Y4 C& Y, g     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序, c. N; R% p, V- B
         texting=True,
    # R- X% g* Q! G     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    5 [4 x5 {; A2 }6 J% v1 R6 ^5 h5 h     Thread_num=3,2 |4 z/ y! s; H7 P$ o
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    * m0 |. w# l: n; B: x% J     cpu_count=1,) `. p# H$ i/ I/ k& P5 s# `% i
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    0 O5 P) _2 r+ g     sem=5,+ v  i6 e1 |2 W; J* k2 E' v
         # write_SQL 为是否写入数据库,默认否0 ]( E+ q& k& i; R1 W7 l+ n
         # host 参数默认localhost
    ' ]1 T8 K2 X0 P9 p4 ~4 z* }8 r     # post 参数默认3306
    9 _0 @! m1 f8 Z% r4 `  L0 a% Y     # user 参数默认root
    % `9 C  @- W  j  S" \     # password 参数必填,必须正确
      Q4 i: y) w9 A. x$ v; D4 N     # db 参数为即将存入的数据库名,若不存在自动创建
    ! u& ^0 d* q0 m& l6 _0 h     # table 参数为即将存入的数据表名,若不存在自动创建
      u3 l0 M! Y( r3 J' U) \% Z* r     write_SQL={; |8 W! T# W4 O, J: G% v7 o( |
             'host':'localhost',
    / S5 y. Z7 t+ H  d, N$ Z         'post':'3306',! b  v; l2 Q1 X; O0 T9 D
             'user':'root',( s% \6 H: w1 u' [4 M0 y
             'password':'123456',( T* O7 Y2 V- `# H& ~( _$ I! W- ?
             'db':'example',# `3 j& F/ l5 G; `; G6 M. Q4 f
             'table':'example'
    + P6 Z1 C# f4 M5 G      }9 w+ Z6 p: K- z) u0 T
    ).run()
    7 e1 m; t2 O5 `3 ~1 Q
    ) V7 L* H( J( o. N9 J介绍一下crawl参数设置:
    5 G  F+ P) x* k# F* p/ n
    4 x5 k1 I* m; J- |'''
    9 M# d+ ]2 P0 I- r+ A1 W单行代码爬虫程序执行
    - L- a& a2 M* Q0 t6 ~:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档4 ?( `* h$ B0 S( |* n  I
    :param url:即将请求的url地址,仅支持get请求5 j+ S$ A/ e, \; E, T# t/ w- {. z
    :param type_url:请求url后返回格式,支持text和json格式返回
    " I* t' v  I6 @) b- ^" V:param Thread_num:即将启动多线程个数,默认为1单线程
    $ o0 g: W* C" T' a5 m:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    ( r+ }- K% @! _:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半( \( L2 J! b2 a% X, U
    :param login:模拟网站登陆,保存登陆信息
    + @- X8 \( ~. f1 A2 b3 ], k:param Parsing:爬虫方式,支持re、xpath以及bs4方法9 `4 H  L! Q# T
    :param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,- J" [+ N" Q, L/ q/ ?6 U3 Y
                           多次报错结束程序,默认否# X4 a- t) W5 Y% e& r9 Y) v0 G
    :param label:选择器内容,字典格式保存,4 j( P) y5 Q% O8 J/ O( k
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型1 L) k. E9 H% g3 U: S& S
                         第一个参数必填,第二个参数默认str类型: ]0 t3 p* U) K- g- ]
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否: P" f0 L4 |' Z$ j/ I- a6 P
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    / s, v/ R" r+ J4 F. V! ~:param page:是否选择断续笔记接手下次爬虫处理,默认否! v7 Q; `. B+ B2 D  H" e
    :param clean:是否进行简单类型数据清洗,默认否( z0 r% H7 D) W! ^
    :param write_sql:是否写入数据库,默认否8 y4 H9 _: c' c! s5 _2 W, v0 M
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    % L" ~; n' T% s- w1 }, }: ^                         'password':'密码','db':'数据库','table':'数据表',; F$ a; L! l9 d8 j- `
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    $ Y3 I0 r  x  o                         检测表是否存在,若不存在则创建,若存在则直接插入
    8 L9 a. o/ D' C$ }  u:return True
    2 s- o! r3 Y# `' Z( K'''
    - G" t3 ?: t( T8 Q介绍玩法; _4 c/ x# w  S9 U6 j- T9 X
    接下来介绍的均为调用第三方库的情况下运行:7 z3 I6 P) s) g( n3 j+ c/ Q/ p7 x

    " ^3 m! F7 L* d# q* P- i" N; Xfrom simple_crawl import request
      o! ]' C; J, ^! ^# X1 |) H第一种玩法:输出源代码; ]/ M( a0 Y9 ]
    调用requests库进行源代码请求。
    % m2 k, z! k$ @3 ]+ y' M, n3 C" L# T% V. x$ C. x8 Y
    特点:
    0 n3 F; S: S: a" \/ g! G: n* [: v请求失败则调用ip池处理重新请求访问,6 T7 B6 x/ @  ?5 H: D; |, @: m
    出现五次失败默认网址输入错误。2 T: Q* U# u+ F/ \
    支持text以及json字符串返回。默认text。
    ! N2 o+ s$ U3 h, D' k! g
    + r3 W* g: h& [5 V缺点:. r+ x6 L; m3 E2 |7 \% E$ p
    暂时只能进行get请求,不支持post访问
    / E) |. ]9 e# }. d5 {4 l  i: v3 @+ W$ [2 u9 p
    :return text or json* z' j/ }, x# d9 }% t5 C! i9 \
    , P7 S5 |- |& o( V
    request.parse(
    * X) ?! f+ q8 ~8 e5 X2 `. u        url = "https://www.douban.com/group/explore",
    , l$ p4 f5 a1 n  s' b" h; i& K" X        type_url = "text"3 y( F. K6 k2 y* Y
    ).run()- F, S, p. y+ k6 \
    # return text0 I  M4 k. W# H/ {4 _2 D2 u
    ! ]0 j* {1 C3 b7 z
    第二种玩法:模拟网站登陆并保存信息) X2 g5 w0 o" j6 n
    调用DecryptLogin库请求登陆访问。
    6 ^" }" o4 l# q4 G" t
    ( W. k0 l0 v) y  q' z5 W1 s" aps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源4 T! m7 C/ ~$ q6 W6 n
    在此放出文档地址
    * c1 ^5 `* k8 x- dDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/9 f( z! w  z1 z! v4 _: K
    7 \8 r" y1 J/ e1 u) U& o/ l
    特点:- A. x7 e. q( r3 Q& o8 W! R
    将DecryptLogin库中二维码继承到此库(非二次开发)
    $ |( }* b9 e; f, j  K( H! M支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆): w, k. v5 u# T+ K0 V  }: _
    保存session.pkl信息到本地方便下次登陆运行/ o' j: M0 d6 R

    2 v" \; d: I3 c缺点:
    ( \- g, k* n% ^- W% asession.pkl登陆信息过时无法自动删除。
    5 I: E$ j  Y! B* W% S2 J导致下次登陆疑似cookie无法正常登陆。
    + q( T; D+ L: V; Q# W$ J7 I# C! [. e
    :return session
    : Z1 g& X$ w! ?( H9 V) {& _$ H3 r
    6 G7 o3 `3 X( D9 zrequest.parse(! y# D' U& q) Q3 S
            # 臭不要脸的推广一下我的店铺9 u# j$ @' E/ A2 N6 \
            url="https://shop574805287.taobao.com/",
    ) D. E* \( V+ \0 ?* {, m$ b        login="taobao"
    0 |! v( [- g- Z# A5 _).run()
    : |) c- r' Y' k! |$ B; k& b6 P0 @# return text
    ) y' e3 A/ o% _
    6 j) J* W: t: F  I8 V( s9 V第三种玩法:爬取网站信息, L5 m0 J8 W  l# i2 A. L4 Y' U
    爬虫库自然少不了爬虫的过程- _" S% n! `" B8 n5 j9 M0 j
    : q1 l& L" q8 o; f8 o  `
    特点:8 n, H# ?5 x. B( [4 X
    支持re库,xpath解析以及bs4选择器。
    8 W& _9 m0 `! a% I, |" u; u爬取方法为字典格式。单方面输出。
      H- D+ R1 T. M字典键为保存的字段名称。! P3 |% ?$ Z, F1 g. B; W
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    & ~7 X( T$ O; O* i$ A, f2 w% e" V/ }7 ~# o' V! c6 ]
    缺点:暂无(等待小伙伴们发现)
    9 N( I/ ^2 s6 [) q( x* h* `2 p& u! _- m
    :return reptile_results
    - u" @( w( F0 n6 N. S5 }7 q# l9 }4 E2 U
    request.parse(2 T7 ~# L9 g; H) a! h1 S' `: R
            url='https://www.douban.com/group/explore'," d  q; h& q! u
            # 字符串格式,选择器方法。
    7 Y8 I# ?: ]* A9 k) e    Parsing = 'xpath',
    ( N) r- P; g0 \) }$ v& ^4 t6 S( S    # 字典格式,参数如上。% @! x( A+ H1 ~: B
        label = {# |2 |3 g6 K, c  O6 U: ]
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# e$ R; f* e. I, B2 r
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  |. z7 R8 j) @' w8 `  m0 u
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      l1 e; s2 q8 A        }7 m. |2 b& E; B) T3 z, ~, d
    ).run()# T+ ]0 s6 r: F, y9 t, ~; I
    # return reptile_results(list)
    9 S. R; t4 X- S) D8 t' Y- I* C1 W' y, q, Y: a' T
    第四种玩法:自由保存信息
    # V  e& i$ H& I9 i2 r5 ]目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。4 z: J0 `2 o) o6 x# H7 Q

    9 t( Q  a0 c1 X1 ?$ U特点:
    ( J' g' c# j7 n- y. c5 t& B写入文件均为数据格式传入文件。- b7 ?" E' q! q3 ^
    且输入格式规范方便阅读and省事。9 r6 O) t* \, p* l

    - J; r# m# q! [缺点:. K( }3 A& t$ u# I5 r) L
    保存格式仅四种,
    $ d$ @0 a& {7 D" T% E" B% s6 Y不方便用户之后读写操作。
    : P5 b4 r1 `. c  c
    % p. f1 ^: I* _:return file
      y5 d, j" m* |2 q& D3 A0 ~/ _7 z6 j3 U4 k% L* s$ }& ?
    request.parse(
    ' E3 q$ \0 }7 b( w% B' G3 w6 H        url='https://www.douban.com/group/explore',
    . y4 C7 j" I. q    Parsing = 'xpath',  x3 \3 b# `- a! d, p
        label = {
    + h1 Y/ U% R8 v- m9 L6 q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 W( m( D9 B; P, D2 n+ M8 u) I% Y        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: z4 b- V$ {0 ?1 r' Z+ i# _
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]% C3 r5 w3 j) Z: |. R8 D
            },
    2 L0 D: ^4 S4 G0 k# K/ T8 c    # 字符串格式,具体保存位置填写
    4 o. @; z6 K0 n    write='result.pkl'% J$ b1 r1 Q8 }7 _, |
    ).run()
    5 z' s' p0 E  T1 N7 o# return file
    % J4 ~0 ~* S- D/ ]3 U$ ^2 N/ z: _! h/ B3 [
    第五种玩法:读取下一页 url 地址继续爬虫
    7 r" Z$ U# o/ c7 O" T/ n4 f这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~7 H  l# I- f0 I1 L" b8 p2 j( M+ R' H
    " W/ S4 ]) t5 T! e$ ]
    特点:
    , w! h. ?* g& p0 A( w继承之前的Parsing参数选择器选择方法。3 s3 E( j; O8 P, w- H9 n
    在这里可读取到解析后的下一页 url 网址。
    # ^! F" ]2 y; i" c; K" L方可继续进行爬虫处理。方便用户使用。; p/ S$ w  M8 Z0 }
    - X& z/ e! R* f$ @% U
    缺点:! e2 R: t( I+ Q0 u" N$ }% M* t+ b
    若爬虫时下一页 url 地址改变,便结束爬虫。2 y8 w) S6 t$ W& A& a+ j! q
    只能爬取所给 url 地址中的信息。
    $ p8 x8 N# O. w- f1 _无法进行某一界面的多个网页爬取返回。, c% C  E0 u3 E
    造成访问页面单一流失。8 @/ [2 K3 I5 J4 L* _) r
    7 u2 ]5 t& z+ M- x4 T
    :return None
    7 {; C# N+ Q" E& b, g4 x( i* q0 Q0 \8 _0 K
    request.parse(* v4 {8 q5 J9 k( G- t
            url='https://www.douban.com/group/explore',+ f; ]2 \' c7 ?$ i* P
        Parsing = 'xpath',
    " [! n! c3 r! v7 P& f    label = {
    * Q) e5 t2 R( }0 t0 d7 f/ g/ n+ u        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , v/ \6 g2 U* g  J6 Y' X        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 l5 J; d" I2 T
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]! G6 J! h7 Z0 u* h8 f* q
            },( Y, v: r6 e  y) q
        write='result.pkl',
    6 I8 {: Y) v( L" M8 X3 N1 J& r    # 字符串格式,根据Parsing方法继续请求下一页a中href
    9 _$ ?$ S3 u- X& o1 k: w. m: T    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',6 A" f) j3 ^; `1 f* {' N
    ).run(); i" l. W! Q$ u5 r
    # return None
    & {0 Y, n8 p( R0 @% K4 l! p% n4 r
    0 B1 y4 y) e$ Q# x: q3 x7 R& P2 f' E第六种玩法:爬虫网页保存- I& g6 Y; c1 z- B2 M" z9 s" `
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!2 P$ S3 |# f* B
    1 @3 g% F, R( H, U) N! X
    特点:1 g* b* v7 ~# W: f5 n  Y4 Q
    持续输出断续笔记。
    : c: l! c: S* E# \, n将此次爬虫的 url 地址保存到一个文本文档内部。5 p( g( \8 s; V. x
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。! f3 E& Q4 ?- a3 y5 ^
    6 s7 s9 x" T- G  F/ d2 g6 Y
    缺点:
    / R% I/ Z4 b7 [& b' u0 e读取内容不单一。" ?* ~1 i! s# H# |
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。" [: N; M# ]- c) }. X% y5 v' g

    $ F* J! c" R. p8 M& l5 {  O: i. O:return url_file; x. F: k3 V8 a& `
    + B1 C2 ~8 ^; C# ]# r* \
    request.parse(
    / K; H  M( a% P( Z6 s    url='https://www.douban.com/group/explore',; M- }* n% J! P* p4 g
        type_url='text',& m  R* h. w$ @
        #login='taobao',
    ' a4 ^7 y& s1 X: l    Parsing = 'xpath',0 g; N7 P" U* Q# y! U
        label = {
    + r( C( j& _: K, J/ G9 b        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ( [5 X4 ]- l0 h        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 h8 _) [3 j  C% E
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 {; _4 t. e' d, p& I: r
            },# t, Y6 v0 i* |# J1 j4 B* \
        write='result.pkl',
    3 j( v2 H/ V; ~) u0 i6 i    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : `5 G+ G1 Z! y6 q* p1 M/ a$ B$ r& h# k5 Y    # 第一个参数为是否需要断续笔记。
    + ]/ Q: F$ j$ S1 ?( Z+ p    # 第二个参数为断续笔记保存位置。
    4 j2 T6 d8 S) z* }0 F7 P" r    page=[True,'url_page.txt']
    % V- J$ N; [! S' F).run()4 \8 w! N) R# m1 B% z+ B
    # return url_file
    1 w" m+ x& S  J' k- ]
    & @0 u6 ]1 u! B  {! d" Q  C第七种玩法:简单数据清洗3 H8 }8 X) F' W' J+ }  d
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。9 ^& R1 e5 E$ b/ J2 s; K+ t

    ' t; x% H! }9 h) U) s" q5 g特点:
      i$ e* }  T: [. B$ l% q# s本人曾写过一个底层数据清洗。* x4 ]1 {0 d+ I. ^, t+ L
    能将列表格式数据进行归分清洗。
    7 ]0 W6 O/ d0 S2 i+ o5 K) H5 X主要内容请参考另一篇文章0 G0 Z4 Q+ F- B/ b' _. L( j2 W
    如下连接:数据清洗
    3 s5 i# Q" r9 U" C2 s
    7 q  V7 h9 r: G5 i, v$ O缺点:+ u; i; d' h  _+ M+ U, P- ~
    数据清洗格式简单。
    ) w: ]5 z5 m5 J: G& H数据清洗内容单一。  Z" s- i9 q6 I5 _0 S- M7 c
    无法完全做到绝对清洗。
    5 i; q$ `; d0 x5 l2 g! f有待改善。
    , q0 o, H4 x- }5 p# L" B
    + E2 h) q, T, }/ F- u:return keyword_list, value_list
    8 D& P. ], Y0 o7 S! [2 |5 {% I+ ~& A2 E# ?+ u8 h+ c
    request.parse(
    / j/ T& i# L6 }. h    url='https://www.douban.com/group/explore',
    + V* J8 C$ \5 Q: i9 P    Parsing = 'xpath',
    ! L* T! y! V- Y( a( T( C    label = {1 y9 `; e5 X% s* O8 Z
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    2 i8 N* F. c3 |6 ?8 ~! N1 D& W; @        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ }* b, I- D7 e1 z
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ' O, I9 X) [0 g        },6 F) V6 V! p/ l+ v
        write='result.pkl',
    4 k- c8 a4 e3 N& u6 d    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ ^: S& c2 j2 D! I5 `) D, a
        page=[True,'url_page.txt'],
    % j& W, T- K/ w& z' r& C: r    # bool类型,默认不清洗
    & \7 s7 x) a5 G    clean=True; d+ {/ V8 M9 b* N! E
    ).run(): g- F# d4 c' ^8 W8 B8 x; r

    2 r/ `/ @' t- l( r' R9 p+ i, r( q! h" u第八种玩法:爬虫存入数据库
    # |9 m. r! @7 b3 B+ T1 n1 F存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    - C. y5 X4 W- J/ V7 y9 k4 p; G3 U* c6 d" A& h! ^
    特点:  J) I4 ^+ J* _. j
    信息存入MySQL数据库。
    9 c8 D. F% R. V8 ~可连接docker远程数据库。
    + M) U0 ?. F  E8 \+ [. s. j数据库的库名可以不存在。3 E) D- @2 z" L3 i2 i' B
    数据库的表名可以不存在。
    ) j5 V; [$ u& ?5 F根据之前传入字典键与值参数判断表类型。, L; j, c% W; Y! Y) n6 n
    自由建立数据表传入信息。
    0 r3 H+ s. R  a0 w8 w) r. B! ?2 Z7 u' A) t
    缺点:
    % ]  Q4 E: B2 Q# r$ N& a仅支持MySQL数据库。$ Y8 @  `8 z8 c: U& Y0 i& o3 y

    1 Y  J- o7 h5 k$ n) G:return SQL+ s2 Q" V( o. T, O; S. {
    ( M8 X1 b! Q# @# B# H+ H0 O+ z: P8 l7 N
    request.parse(8 B; ?- z* K; _9 V0 Z" G: B
        url='https://www.douban.com/group/explore',/ g9 ~- O" H& R: M' H6 {
        Parsing = 'xpath',% ~! f4 N1 s7 p3 ]/ ^
        label = {0 ]( |$ W- y, t" @# ^  e
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    * t) n: ^+ `5 V$ r0 ]        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ x7 }( |$ o. J( X/ J
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]2 }. T7 y) }- C6 ^8 J
            },
    $ {4 o% z2 i: s; `5 t    write='result.pkl',
      h: w2 @+ |' \: n, I+ U- x  Y    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : |. N4 S0 Q% F4 g6 D8 M9 L( v* ~( ]    page=[True,'url_page.txt'],
    : L" i) s3 n% H' a/ @' h    clean=True,* ?: X6 R' ?! u% L& J
        # 字典格式,. {( o; m( O0 }) U
        # host可有可无,默认localhost
    ) E+ v; a) U$ q4 F2 [    # post可有可无,默认3306% V$ s4 C8 H" L, U/ m0 P2 N
        # user可有可无,默认root
    # d0 a2 |( W2 e& M$ o) r    # password必要参数,数据库连接密码
    # ~5 i7 l/ u  q    # db必要参数,数据库即将存入的库名
    4 `% J. f# ?* p- J/ L    # table必要参数,数据库即将存入的表名
    8 t- D, U8 V+ m3 O    write_SQL={& c+ O: W3 F) w$ {6 z% P
            'host':'localhost',7 W# {0 x  c' I: W7 J  C
            'post':'3306',
    1 Y( a) Y! x3 K0 `        'user':'root',
    * g0 P2 Z1 o7 B4 S        'password':'123456',6 H# {) V& W. Z* m
            'db':'example',  \" k  X7 C8 U7 H
            'table':'example'
    8 f5 V; w2 l' V1 ]2 F5 H. {% f2 N        }  M7 f! t* \8 G: w7 _' ^7 Y
        ).run()
    7 y5 T! t, ^& ]( h9 f, W. s3 z& n2 [
    第九种玩法:重新启动爬虫# K: k6 e+ g: Q6 T" |$ F" Q
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    7 o% C( Q8 {& {  Z+ }2 a
    3 J% I8 o4 l: V& ^5 M特点:' h3 J/ M6 d+ E7 z
    检测报错重新启动爬虫% C2 c! N; w4 B9 m' |
    无需手动处理错误信息
    # i1 }2 u( j+ @, ?: p2 b5 N8 C3 F7 _5 R3 v% D, w
    缺点:0 J: h% N8 Z3 V
    无法收集子线程错误。
    " U+ J" {5 B' b/ p3 }
    7 z9 J4 L7 E; Y( f' {* f9 E:return None
    9 Z2 e4 x2 [0 O" m0 d7 p6 o9 T& J$ p; Q0 y' n: m' U/ z
    request.parse($ m  H9 s3 h& a
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],5 H7 U/ X) U) n7 m2 f( I4 y% ?
            #login="taobao",
    6 r4 t! i1 }3 J) ?        type_url = "text",9 c4 F" [. {5 }. a
            Parsing = 'xpath',
    ! G7 v: r1 C) }2 \$ v4 @        label = {
    5 q7 L7 U' {( k0 j8 ]4 F            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , W/ ?+ L9 V6 D9 ?1 y            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- d2 D* i# B. s6 b6 V
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]; L# j! ^! `  l. ^' n; Y
                },4 P& G% g' d5 n8 H; U# `0 o
            write='result.txt',
    ! j' Y; @# d+ d% k: ?1 k' O        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    # j' A2 R- g# ?8 p( K1 m) r+ p        page=[True,"now_url.txt"],
    6 H$ Z: Q7 l2 c        # texting 参数为是否启用连续爬虫# h* q9 S4 F# j# Y1 c8 l& V) L
            # 爬虫程序异常报错后重新启动爬虫
    * c" e# y- S+ p) E, N        texting=True,
    : I/ _0 b* N" h1 g9 u        ###
    2 ?. e: H2 E" x, G# O        write_SQL={
    ; p- ~5 Z: {* i) ]            'host':'localhost',, ~  M# l  z3 S: A* Z
                'post':'3306',
    & D7 l, ~3 i6 y+ \% k! `5 |  {            'user':'root',7 y  \' k0 w  Y. T  H: \
                'password':'123456',! a0 w) w' i0 ^; Q! d% ~& V* q
                'db':'example',7 o- ]+ t% w* @; X% M5 ^+ B
                'table':'example'
    7 x3 L4 i$ p9 c, A3 `            }+ t/ s1 s0 s, v! ~" g
    ).run(). P' T- s5 q( ]+ N6 P
    & i6 [# g$ K. E% z& I" h! K6 E$ m
    第十种玩法:多线程爬虫
    , P7 q% k  |" ?/ z特点:) ?5 K: w3 L: W
    爬虫速度加快,  P8 m0 E! _. b. y
    更好的利用了线程。
    % Y% t5 X0 ]2 F2 D; s/ a
    ; R- U# j" ], ]; ^9 d+ v; t缺点:暂无) v  |( K- i4 K2 v2 d# A* v

    , t& U; ~/ s/ v6 l1 e' c% a:return None
    $ q6 d1 s! `* z+ Y# r, z! V! H* n, m# Y: h* v
    request.parse(
    5 R$ h* s' K$ p        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    . _9 \3 J. ~- u0 D. `: V) N        #login="taobao",4 G$ i$ a# b% W4 p+ _( o3 F
            type_url = "text",+ R8 R; X- x  f0 N
            Parsing = 'xpath',: t3 w+ q/ h5 I) K1 l1 U
            label = {  k: A' T8 l, `7 p0 X
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, d0 M/ U0 f, ]9 S) S7 |0 M
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    - c6 U+ B' `: R  e: e            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    2 N4 I% v) O9 g9 w6 j' Z  G+ s' E            },
    * w. m' V' E/ o$ F% v+ T        write='result.txt'," k5 f+ M$ p+ ]
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) V' t* S' e6 T" C
            page=[True,"now_url.txt"],
    & H! x: C( b9 g2 c  O& E        #clean=True,
    5 |2 t9 y6 b( a- _! }( A8 [        texting=True,
    * b# A% U' [" D1 {6 y6 E8 v        # status="threads" 启用多线程爬虫
    $ f; A9 c  Y1 I  N4 V7 N        # Thread_num 为线程数目,默认为1 单线程
    ! w: V2 X( `+ L0 X/ \        status="threads",
    / v( h# u0 y2 v2 p) `5 Q/ H        Thread_num=3,9 f$ ~/ O  h5 _6 H' E: q! E
            ###
    ! g) f- H4 `7 d! X5 i        write_SQL={. K3 u' N$ D6 ?" x9 p
                'host':'localhost',
      m! S$ p8 R3 k            'post':'3306',
    : l5 E1 u0 ]! O4 V            'user':'root',
    2 [) q, K( t$ `/ {# f            'password':'123456',
    3 s7 p2 e0 c2 |' `4 I            'db':'example',
    4 _6 j. A% f7 K% P5 ?  f& J            'table':'example'/ }/ A, f/ i; g2 h
                }, U( W* B% M! ]9 H$ h9 j1 O  }
    ).run()
    " U1 G+ \* N9 t$ Z) Q$ u3 F! C; _3 D! h) s+ q5 P
    第十一种玩法:多进程爬虫
      |$ L9 F1 Q1 _6 l9 ^# z! Z  \5 l特点:; {) g  [& f3 V3 R% Z
    爬虫速度加快,
    5 Y6 i# q' `; C, _/ b$ P/ o更好的利用了进程。+ w! |! @3 s' a

    ' }1 I6 F! E6 q+ @缺点:暂无
    " z* T2 ?& S0 @- X
    + D6 C$ ?4 h, a/ Z5 \:return None: @4 e8 x. E# G
    ( U: r. \1 ~& U- Q, A
    from simple_crawl import request0 p2 W1 [+ B, o$ D9 e) s3 s
    request.parse(
    9 D8 N4 Y7 r3 w2 r        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* [  o  O% H' w. J& }8 l" E1 e
            #login="taobao",
    5 ?$ N& v+ N3 m        type_url = "text",' S* [. A# D  E) a% Q0 R
            Parsing = 'xpath',; e" U) i- `: p+ {2 G/ F
            label = {
    - Z8 C% U4 m5 u1 j7 |5 e! i: q1 s            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    # p0 O7 r" C# U- t; O. Y# ]            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],# t9 ^$ {- V4 y) U0 D
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 _1 _) U5 ^0 J9 b            },
    " L7 Q8 F5 E9 @: x, v6 G        write='result.txt',/ D1 u+ y+ H9 l$ l$ u; \
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ d8 h& @5 F2 B  G( z7 g
            page=[True,"now_url.txt"],$ l( u' e5 W8 j" D* N' f; ?
            #clean=True,/ [7 s# }* `* @- n: l9 V
            texting=True,% t+ ^" V& e7 L' s4 p' F
            # status="multiprocessing" 启用多进程爬虫, e- d( U5 s) |3 I/ o" y# m  c
            # cpu_count 为启动代码核心数,默认为系统核数一半% f" [  S+ F. Q4 n7 U3 R
            status="multiprocessing",
    - }0 ]8 q. A0 V1 {        cpu_count=2,' @0 ^$ G( |1 _" f6 W8 M
            ###
    , O' A1 a) K0 Y/ z- r: J        write_SQL={9 ^# Z7 ]6 \" C- m* c- n
                'host':'localhost',
    ; j2 ]. h, b9 X2 c; U, ^0 K            'post':'3306',
    1 w  g/ F. e- O8 Q            'user':'root',  ?8 K- k* N; e: b1 K! K5 J; f
                'password':'123456',' l+ N! d% _2 |6 {" {* j! z2 G8 V
                'db':'example',
    + H8 F3 G4 b% E            'table':'example'; @& S% j3 T* K  s, }
                }
    ! S( K; d1 B: X; U4 Q).run()' Y/ k2 S+ O* o9 l! b
    6 Z3 f2 q$ K+ v% n6 Z3 A
    第十二种玩法:异步多线程爬虫
    / J' h3 t( a$ W: J特点:+ y- H! t: v6 w: _9 r6 R& k: D* }
    爬虫速度加快,& M3 ~3 y1 N: R6 n
    异步使得爬虫无等待时间,/ q/ b9 }/ S  h, u* x
    同时使用多线程速度明显加快。/ a3 {& M8 W$ r  L, y, v3 i2 }% `
    1 a+ y( u2 l' {4 {" V* t! B
    缺点:暂无' ~+ c& z: d2 E7 y" h

    7 C. W  O8 X9 o0 g" Z' i9 I' i' i:return None+ k* T' U/ K/ I- X' H, D

    6 Y! i9 s" J7 X+ B! f0 ofrom simple_crawl import request
    " o: Z, \/ t: U& H; h& q* @! drequest.parse(9 i4 _1 K& _8 T) c
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],9 f' F6 B/ V% t
            #login="taobao",+ r& k- P, |. [. o& I
            type_url = "text",- `% v, |$ l+ T
            Parsing = 'xpath',8 U3 A8 G" D+ F4 i9 U" W
            label = {* K2 k, h& x, d2 Q# N3 S% d4 ~. f
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],/ w: r# M, Q9 y
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    - V2 c" N$ J. Z/ e2 e+ u- r            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 B. ~8 {) k4 n; B( A, B9 ?( P+ k            },
    / W7 J* B, H/ [, [8 _        write='result.txt',) z/ r- \# \/ U
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ' E) \& }4 N1 Q" {        page=[True,"now_url.txt"],
    & i% Q/ j0 o3 g; k/ R0 R        #clean=True,
    : ?) ~! L, |2 R* D1 m7 j+ O& _        texting=True,3 [- [, H0 A. A0 ~0 r0 r9 G: a
            # sem 参数为异步引擎数目,默认为5! Q/ T- j0 i: U8 H1 ]5 r
            # 其他参数同上
    " `/ g8 S' r% v. T8 H  G        status="aiohttp",/ B+ ^) H( i/ D% R% _
            Thread_num=3,) p3 C% r9 `7 h, q% \/ D( [
            sem=5,4 \$ Z! A5 E# x+ a
            ###+ C% k% x% I* I. E# d: P8 o8 b
            write_SQL={8 S3 Y- s4 F0 Y6 _- x5 Y$ W  Z, s
                'host':'localhost',. N) N/ r7 z& y' @: z$ G: c
                'post':'3306',
    6 \) Y3 v9 [6 ]+ k4 ^            'user':'root',6 x. F3 k7 O! m/ v3 `
                'password':'123456',1 g6 r9 n( |. m5 Q
                'db':'example',
    5 B' A) m$ k1 {  \            'table':'example'% f4 }" q+ M1 ]  ]5 N
                }
    - R* C: _+ E7 H8 ~2 ]2 a. U/ r).run()
    ( K3 z; b) k) ~, ]4 V
    & O; A. ?- r, F  w0 e3 ?9 t第十三种玩法:异步多进程爬虫
    0 A9 N9 _+ t1 B特点:4 {2 v: J& w' L- m* t# t
    爬虫速度加快,
    6 h$ L5 E2 w8 o( X. F+ o+ e* s异步使得爬虫无等待时间,; g* {3 K* q8 @5 _$ c/ }: x
    同时使用多进程速度明显加快。4 |& v) n9 ~. y6 S
    % Q) j! R6 q* R3 o
    缺点:暂无
    " ~) s* c: G, G# ~, u1 h- c) O. r4 s! d
    :return None0 D8 G0 w  e  S! Q
    + ?$ h. B# h3 A7 H
    from simple_crawl import request
    8 g* _! G* k8 T* ]1 ^/ l8 Arequest.parse(
    ( D9 |$ ~, o+ z# S' {( Q        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],) @- v3 ?  f5 w3 q8 P7 ?
            #login="taobao",9 Z( F1 [8 e1 R" m+ e8 b1 I
            type_url = "text",
    6 e2 b9 W* ?+ L0 ^4 F! p$ R9 }/ \        Parsing = 'xpath',
    . \+ ^# [9 R# x0 _8 c        label = {
    5 |/ F5 K2 ?6 @! G9 ?0 e: q" p            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 L$ V+ d7 J2 F# u7 K7 O
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
      @7 ?. @0 N1 H            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 Q: A6 ~+ S, W7 p+ S  J
                },6 U) o$ o5 g- A/ e# W. @$ C5 O
            write='result.txt',1 w) j" _) I! u% v& y; Q" A4 R
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',8 g+ c8 ?; r* i# N& [* \) A4 A
            page=[True,"now_url.txt"],
    & M6 c6 g$ p& n% H3 a4 c2 j        #clean=True,; Z  ]; u' e% I) O; B+ U
            texting=True,
    9 C9 S/ e9 [! m- f8 @  X# v7 j        # 参数如上2 w; g& U3 j& t8 Z$ _4 {- ]0 O
            status="between",/ t: P  P! S, w6 i
            cpu_count=1,2 N: p: b5 b  R2 q/ g# w  l
            sem=5,
    $ l: k, M6 b9 a4 B( N* t        ###/ u- O' o/ S( B! J) V& L9 B* {' G
            write_SQL={
    4 D1 D2 Y$ _: d- z' a0 Q  h            'host':'localhost',5 f7 L  b& `/ L, ]' k
                'post':'3306',. U8 X6 z* D9 c8 ]2 ?2 T) y& }
                'user':'root',
    5 ]! _# J& c0 k            'password':'123456',
    . ]; z2 E4 D; J: P            'db':'example',; L4 e; X5 [( r* E7 l
                'table':'example', D7 N) K. Y" v1 G
                }
    7 c; |' X; ~8 w).run()/ X2 |2 v* d7 B5 C7 I2 Z

    * n4 m, y. W- Y4 ^( G4 L
    - G1 L( k9 s+ A' D1 W0 k0 a功能介绍完毕🤞
    ) A0 v+ `& s. _5 Y2 p9 x6 [最后还是希望你们能给我点一波小小的关注。) w/ F/ _% C+ p
    奉上自己诚挚的爱心💖
    7 s& C; S6 G5 I1 p, Y8 ~! P; O————————————————! `, p/ j& _3 `  [5 Q8 |
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& d& M  W2 H+ K1 v( G- V/ \" M5 C
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684  ~/ N7 |' R# \/ ~4 J
    4 c6 r; Z  F0 s0 t
    ( B* Z1 O8 T4 c" N8 q! W' h$ ^* ]8 L
    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-22 17:00 , Processed in 0.452780 second(s), 56 queries .

    回顶部