QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5430|回复: 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
    4 C6 W4 r) i  m: j5 t5 q4 esimple_crawl) T, c; E4 @& O) a4 u0 w) V/ ^
    仅需一行代码即可达到爬虫效果
    5 Y- V; c8 @/ S2 ?  x/ q) J项目地址(欢迎star):https://github.com/Amiee-well/crawl
    - ?$ n- {6 f' X使用方法# h' L/ I. ^. _; E, o8 @$ J# J+ W2 V
    pip install simple_crawl
    5 x. M) p1 H  S3 j
    ; U" }9 n6 `- D6 s, z4 [### 以下源代码为简单介绍,详细功能介绍再源代码之下
    . `8 p% i; m) ^1 ofrom simple_crawl import request
    2 J! Q( I( ], O1 s8 v9 frequest.parse(1 G( j- M+ V# W
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    $ Y9 L: X( I" \6 C' z7 z% E6 J# ?        status="aiohttp",
    ; I* m6 d% O1 F% r5 |" m& q5 Q) T$ ~        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    : i: V; Y- W' `        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    + R7 P9 @( _: {$ Y, y        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息3 n* f# p' S* d! N9 h
        #login="taobao",
    ( }- u- r' o7 m    # type_url 参数为返回源代码格式,支持text和json,默认返回text3 E( b6 u( K& H- l6 {& }5 n
        type_url = "text",
    # B, p! }, Q) {! S4 P. ]( M    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    $ ~# {, P1 d. H! t2 ~0 e8 b9 i    Parsing = 'xpath',5 P7 Z5 I) g2 s2 r( D
        # label 参数为爬虫解析过程,字典格式,详情见下方
    - O. [1 f7 b/ [: H5 E! j* [& ^    label = {3 |& \4 b+ h' [  p. ]1 E5 q4 d
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + H/ [7 S; B) S7 ~2 m! ]            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],. ]2 l# y8 _- C# Q4 n' F+ f
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 _. t: `* \4 D& S4 b     },
    , K& |# ]" w  q$ T' {, G     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱: M* {1 F+ R( F* ]0 `
         write='result.txt',
    5 d9 s# ]9 Q1 r) K4 w! V9 a     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    ) j' W- A4 I7 {3 i9 T% T     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * F* T0 ~; h3 y* \     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    8 _. P1 Z# [& r( }/ P  w     page=[True,"now_url.txt"],
    ' k" k; O' N+ ^: P8 ?     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
      ^" m/ ^5 l  {1 i6 r     #clean=True,. f. M5 z# o& ^3 [+ y
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序9 d% A1 Q: ^; w+ Z8 n
         texting=True,
    ( S6 q/ I! O, U) y     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    , f7 c& f6 B' v+ N1 l$ H$ X9 H# k     Thread_num=3,6 |( G  \" C8 e, k& T/ I; e
         # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态  W& o& a; A( ^4 l
         cpu_count=1,
    6 `6 m/ L8 H- E& N     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    " v- y  T( q7 \4 @  x+ V     sem=5,
    0 S* I+ X. X$ d  A1 I' b6 L     # write_SQL 为是否写入数据库,默认否. ?7 E' k0 }2 y# n; v, j
         # host 参数默认localhost$ d' }% g. G! n7 v: q$ x
         # post 参数默认3306
    # R& |  A9 O) e3 Y/ m. Z: C7 r  E     # user 参数默认root3 F6 J- _+ n8 U& g. G7 D
         # password 参数必填,必须正确2 z# z7 Q* D. {. o/ I" p
         # db 参数为即将存入的数据库名,若不存在自动创建/ M2 N" m+ p1 B
         # table 参数为即将存入的数据表名,若不存在自动创建& X  e. t: [; Y/ ^: B9 r7 E
         write_SQL={
    ' z3 W5 J, `; i/ X' c# j, z         'host':'localhost',
    5 [; ?) g" r! M         'post':'3306',
    2 y# |* B6 `: q- I- H" k+ J         'user':'root',3 E/ c3 r2 O7 b. G3 ^! _
             'password':'123456',
    5 [. c: o. F$ H         'db':'example',
    7 K  m8 i7 e  |3 {; G. x+ e: q         'table':'example'
    # E/ D3 H; u' W0 P/ |      }0 X9 e* h9 W% }5 S8 s9 H
    ).run()
    ! o; }* N9 J, y' P8 E7 H: }! O1 R" j) [) d1 @) W' F7 k
    介绍一下crawl参数设置:/ w0 b2 v$ ^6 i+ m

    5 I- u6 P" x+ T'''. m7 L( q/ Y% o$ _
    单行代码爬虫程序执行
    ' v4 G  Z" f5 T6 y8 m:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    ! P6 k7 @6 u3 u" ]  i, `  T:param url:即将请求的url地址,仅支持get请求
    1 M) V5 U/ t1 d" H) C7 V:param type_url:请求url后返回格式,支持text和json格式返回5 ?& t- ~# j6 [$ P
    :param Thread_num:即将启动多线程个数,默认为1单线程* e2 F" b$ `& \( N+ ~6 P; @0 z
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    / d; e! h( n2 ~+ H. m0 D1 o:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    % i; }0 ^5 @9 t/ z  u3 s:param login:模拟网站登陆,保存登陆信息) z% {0 H% y& J
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
    7 v# X8 Y: X. |% J:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    # ]: s+ p6 M2 F/ r0 c8 [                       多次报错结束程序,默认否  s" t1 Y: I6 g" M
    :param label:选择器内容,字典格式保存," O! O6 Y4 J) M3 S6 j7 N6 {
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    / @4 l8 z$ v6 S0 o0 w. Y                     第一个参数必填,第二个参数默认str类型
    2 p6 w9 ~9 C, H9 x:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否* J4 x% U- W# l( F0 [0 K
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫5 t& M" Z3 _% C0 T
    :param page:是否选择断续笔记接手下次爬虫处理,默认否
    : [, T1 I: S9 Z8 f:param clean:是否进行简单类型数据清洗,默认否
    , E5 ^1 A7 {+ ^& x$ ~, v& a+ [:param write_sql:是否写入数据库,默认否
    9 Z6 L. V8 A$ I5 a                         'host'默认为'localhost','post'默认'3306','user'默认'root',, D9 Z2 p2 Q$ E% @9 r" q2 e
                             'password':'密码','db':'数据库','table':'数据表',' a% k& Q3 ^8 F5 b9 G8 _" ]
                             检测库是否存在,若不存在则创建,若存在则直接插入,/ K0 u) q' H! l( ~" l. e
                             检测表是否存在,若不存在则创建,若存在则直接插入
    6 O( l+ ?  P% d( @0 D( U:return True
    ' Q* e" ]4 U# z7 o& m' |'''
    ' K# h* l; r& U. d9 ]" c介绍玩法
    9 `) d8 n( X' P接下来介绍的均为调用第三方库的情况下运行:5 E/ u1 w  c9 R

    ( `( C7 K7 x0 w0 K0 @9 n: Rfrom simple_crawl import request
    , r' h4 f4 ]$ x4 t, v/ I; U第一种玩法:输出源代码% d, e3 ?- X9 D7 G' W
    调用requests库进行源代码请求。
    . K( H/ ]' I4 T5 a' X5 D
    9 e1 N' u% A$ F特点:2 a* w- ?, a6 B4 G7 e4 ]- y
    请求失败则调用ip池处理重新请求访问,
    $ u* B* G; P/ `出现五次失败默认网址输入错误。$ c6 Y, B/ Z" p8 ^7 ^
    支持text以及json字符串返回。默认text。/ z& S$ [7 M5 \- J" I' g5 a4 j
    $ Y/ m' [- R5 B6 }- C) F) d$ P' K4 r
    缺点:' h4 a! E! X# q+ L
    暂时只能进行get请求,不支持post访问
    3 @* w& g" _. y( X9 S6 g( T  F* y9 j* w( H2 H2 c
    :return text or json
    . r! [7 Z9 A- x/ Q' u( u+ j5 M  y; t. e: [2 y; x
    request.parse(4 F+ K) V) J, X
            url = "https://www.douban.com/group/explore",
    . L1 O; F& r1 P6 A( U        type_url = "text") z7 Q# e# @; Y( j. S( @
    ).run()
    + U. v4 ^- C4 ~2 [# return text2 a% a( ]0 G& k& v$ y
    . V  ?, L) m1 `1 O# m5 ?
    第二种玩法:模拟网站登陆并保存信息% x; P+ W( t! }9 x" r" f$ Z1 ^
    调用DecryptLogin库请求登陆访问。& [; N6 S; L( W9 X* n
    ) w3 c% e0 N7 h) [1 }. A9 f- J, {: _
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源. c# z5 r0 m! h1 ]& \
    在此放出文档地址
    3 \1 b3 J( g/ i3 N+ f9 m7 ]6 IDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    & K! `' Y* e; |. ^5 i8 _$ n
    - U/ `, @5 J# B4 n& m' x特点:
    8 M1 q( E! L* i, y5 M, L9 ]4 I# z% x将DecryptLogin库中二维码继承到此库(非二次开发)3 r0 Q: _' J& H+ X
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)1 e+ f2 g. h. u4 @
    保存session.pkl信息到本地方便下次登陆运行" x. V0 p: Z( z$ r1 Y* S
    % ]% I. z' `" T  d5 u, I4 Q
    缺点:+ v" ]5 U) u' t5 c  G- x' ?5 t
    session.pkl登陆信息过时无法自动删除。: t( ?& {1 v4 D6 ?, x
    导致下次登陆疑似cookie无法正常登陆。  n# J- Z. I1 i5 w
    , ^3 `( d# _4 D) J/ l3 Y5 t
    :return session! a, L' m/ F* Y
    7 T8 N! ^6 T; V6 k
    request.parse(% b" a  ?( o7 d5 d  T
            # 臭不要脸的推广一下我的店铺
    * F$ x6 _1 R+ b2 H4 B        url="https://shop574805287.taobao.com/",0 f4 ]0 H- u0 k: ?9 V5 v+ R: W  J5 E
            login="taobao"
    * a9 C3 ^, V' k4 X).run()
    4 u8 G( v0 C) _3 y+ R6 m" K# return text/ v' Y: w0 x& s9 f" D# C" v

    / o5 f/ f( d3 R5 q第三种玩法:爬取网站信息4 u  u0 z8 P" w7 X- A& S9 ]
    爬虫库自然少不了爬虫的过程
    ! `& W3 r" Z: K( Q+ d" v) t; w0 k9 ~( Y, Y2 U$ I/ D+ W& r
    特点:
    2 K; f* w2 Y. I1 e6 |支持re库,xpath解析以及bs4选择器。4 r+ ~3 S$ X6 G  u- ?
    爬取方法为字典格式。单方面输出。2 e% h: ?# m4 C- x3 q% {
    字典键为保存的字段名称。
    ' \6 K2 P0 f+ @6 w" n; S+ o5 n字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。6 A( N) W6 \7 n
    ' e# u$ b+ S5 r+ K! x& ^
    缺点:暂无(等待小伙伴们发现)
    3 ?( X" _2 q8 S
      I) L, O  a: G6 g6 p:return reptile_results
    ' d% j) X( r# t  Y$ |* g- B, r8 S# J* H( u3 Z" E
    request.parse(+ I3 V# ~6 A# X+ _3 O
            url='https://www.douban.com/group/explore'," W, h9 q4 e2 w; Y, H
            # 字符串格式,选择器方法。
    & A1 j1 k- M) |& x0 @; O    Parsing = 'xpath',
    7 X6 c! d* x  c: G+ t    # 字典格式,参数如上。  C; c+ [' X$ o/ K! x
        label = {7 J* Y" Q$ q8 p& Q
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . t  ?6 f/ A. M8 ]2 n: {) `        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ I! u. \8 F/ M( f& L1 k0 w) r
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: k: A5 H1 o$ c$ K% ]
            }
    # U; Q6 x' h+ u: G- |* N* f).run()
    ' R+ k0 Z+ D. e. S0 u& {! U# return reptile_results(list)
    ; J" {5 ~' h" U! P8 C+ {- b  X/ r8 A( E$ G8 K, d% T
    第四种玩法:自由保存信息, p0 J0 G7 h: D
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    8 E# {$ \; S3 ]& p; c, j5 g
    + K+ r* d% y7 o; \+ @特点:& e' |1 b( e1 {# y+ c! e
    写入文件均为数据格式传入文件。1 A1 u$ k* q3 |/ d
    且输入格式规范方便阅读and省事。0 [; \  A1 a8 V5 s

    * p. a" v6 A8 B缺点:
    ) `7 ?; \* b$ C$ _. g4 U2 ~保存格式仅四种,
    & l. G5 I! d- C) D2 A不方便用户之后读写操作。- M' p3 [1 M% x, O. n  v1 l+ [
    : v  N3 Y9 r& v
    :return file
    ) ~- @/ w/ d. y, E  R$ K
    , T+ q8 c% Q8 B8 B1 \1 Nrequest.parse($ b- L* _" |8 S
            url='https://www.douban.com/group/explore',
    # r' p3 \" F7 p) }    Parsing = 'xpath',
    ; ]3 r; c0 k% k( h    label = {5 r& ^: ?7 {+ I% I- a
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      b* j* \: {  a4 }' D        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ e8 b/ ~3 C+ l
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    + \* p  I0 e3 s  u        },8 l! @, N9 |5 b# g5 F$ N8 v
        # 字符串格式,具体保存位置填写
    8 D& ~0 C6 s2 s2 o+ ^  f/ Q: d# z    write='result.pkl'
    " e2 \4 ]  ^3 K+ n! ]).run()
    / x* S0 O( \& `+ n  d! h" D3 Z# return file
    . T+ W7 l2 n% `7 A2 `6 o
    9 z/ |  y( L! s4 }9 a第五种玩法:读取下一页 url 地址继续爬虫7 \, |6 O+ a7 W* X
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~+ s: Z, F$ w' e+ ?

    4 y. {0 Y3 L# |+ L. Y% G特点:
    0 O; [4 a" O4 ]+ C" F继承之前的Parsing参数选择器选择方法。
    2 w' N& r" n1 U5 P/ |/ C在这里可读取到解析后的下一页 url 网址。1 Z; r3 X  p- w  ?# J
    方可继续进行爬虫处理。方便用户使用。* c* ^, t. y0 O) v; c
    $ z' K7 G- }, C: u+ M; k: g  v
    缺点:/ v# ]3 @; {6 P0 i8 K- K: e
    若爬虫时下一页 url 地址改变,便结束爬虫。
    ; ]% o9 v* X  y1 a只能爬取所给 url 地址中的信息。
    3 t* q3 B! J8 z5 m* N1 ?无法进行某一界面的多个网页爬取返回。
    ! Y' e7 F" w+ _7 J) ?; d4 p造成访问页面单一流失。
    7 q" |7 Z! I- J4 e' F( J: u) }7 y
    % n5 T/ T/ o  F1 h:return None( I. s+ r4 |- h' H
    5 h9 y/ e9 F% J9 C1 E
    request.parse(
    # l, B8 ]/ H( R3 B        url='https://www.douban.com/group/explore',
    / V5 ?/ B, T. I- g/ g/ x    Parsing = 'xpath',5 ]6 T  _* C" I$ U
        label = {* {8 i; r, l& j7 r% v3 s
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- z" V" N) u9 b, ]
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ J! u2 o: |: t) {- ~
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]. `* U) l9 f& [( Z; {0 D  }6 R# B
            },7 j5 m- V. [) i9 h' v% [
        write='result.pkl',
    + p! ^0 Z2 P$ M2 @, p    # 字符串格式,根据Parsing方法继续请求下一页a中href
    " m; z+ ?! `$ j" a: w, q( j( D    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    * c. T* q" R9 u5 W! c) S9 O).run()4 _9 `/ g5 k) _2 u* s: }, |
    # return None
    # F& z) `1 T( y+ j4 |* f% R8 B- m! O. d' k# F% ~- r- G
    第六种玩法:爬虫网页保存$ Z' E- z/ T# k9 U4 I  k
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    1 r; T3 d% m" D# x% o# S) n: C8 [, P! m4 A1 z. M( t; K+ O
    特点:9 D( Y2 f, R7 g; G
    持续输出断续笔记。# ]2 P: I$ d# Z" x# ?
    将此次爬虫的 url 地址保存到一个文本文档内部。5 V! h- q/ s# |) |7 m) E
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。8 W7 N8 Y0 v- C4 q0 g( s/ i9 K
    " s4 X6 i5 m/ ^4 L: N8 c6 T
    缺点:% w/ N& m1 a, j" n! _
    读取内容不单一。9 y/ I4 e! L5 d) B4 _+ b5 W
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    2 i3 d( C& V" u( z1 Y/ q# r# G# G3 [0 F: `/ ?. i, M# G
    :return url_file3 j, V/ d- v. g0 S3 i. C
    * X# L  W% j/ Q' T
    request.parse(5 s8 r. V8 \4 i# b, }
        url='https://www.douban.com/group/explore',
    - N. }/ w& k& K" W0 o# \    type_url='text',
    8 _* y4 Z$ ]" s$ c  V    #login='taobao',+ O8 d, [& J8 ~$ Q" \! B; m
        Parsing = 'xpath',( u1 D3 L% U- e; o5 w0 Y+ Y5 y. t
        label = {
    % E3 L* J5 w- n$ H' d( N& D        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# s$ c' i: q$ e# O: c2 v
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    * M; b- D2 d6 T5 o        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 J8 K/ H" \0 Y, c6 ~* B. k        },
    % H# \  V. _+ t    write='result.pkl',. s" E" J6 Z) E
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ) b% E  }1 k4 a& s6 r+ z    # 第一个参数为是否需要断续笔记。. @( N3 T8 i1 D7 |3 a
        # 第二个参数为断续笔记保存位置。+ H' n! ~9 e" b+ Q# @
        page=[True,'url_page.txt']9 ^9 R* d7 X9 G% A) |
    ).run()9 g% V: I9 @- g! K- o9 E3 ^+ A
    # return url_file0 t& g5 L6 v% X' p% V
    ; c  U% l( e7 o9 z8 `/ U! i- E
    第七种玩法:简单数据清洗
    % e8 Q* x+ C, ]( c数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    3 `4 |/ l( F) V: N/ s* W- O1 U' Q. n- b( N# Z
    特点:" G" K, p8 ~1 M6 q
    本人曾写过一个底层数据清洗。
    : {+ J+ ^$ O- z9 d- w2 ?能将列表格式数据进行归分清洗。' C' o4 }7 F7 t/ F8 v& {+ z
    主要内容请参考另一篇文章
    # r! |/ B5 i) D3 X- e& J如下连接:数据清洗
    + ]! o# l* B' l4 c
    + x6 c: Q/ m, N2 t缺点:
    5 p0 ]( u1 z) e  L数据清洗格式简单。7 j* V% n6 N8 w2 p: M8 |  |
    数据清洗内容单一。' A4 @+ U- z# _% i4 S
    无法完全做到绝对清洗。
    $ Q! d& h' q* y) m; I6 ~- U3 K有待改善。* d: o* p- U8 i# Q4 k6 b, `; u& t

    $ W9 e/ i9 P$ i' A* ]( D4 M: q4 W- o:return keyword_list, value_list9 [* F( Q, }: e8 c( ?% X- e
    7 V0 ^, X) q1 Y+ a- z+ ^3 k
    request.parse(
    4 R9 }/ l1 `7 h) F2 B1 Z" V    url='https://www.douban.com/group/explore',
    ( |9 o4 ~, r& d7 D    Parsing = 'xpath',
    / ^1 Z: Z5 H2 K. a5 h! F! G    label = {
    2 ]0 u! C  y* E4 |) v) v' x+ K        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . n5 i5 f5 O4 t, p. j# W5 y- h        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ j3 _" \" B5 E7 S; E( n7 t
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 t/ ?! L- D5 O- h4 E, I- A' E        },6 w+ b) Y! W" x  s" g
        write='result.pkl',
    ; N4 t4 b( _& d1 F: p( c    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    3 t4 u# C  W1 [    page=[True,'url_page.txt'],
    5 b: ?" J  p1 {* E    # bool类型,默认不清洗& x% K+ Q: b8 M
        clean=True
    . L& F1 Z( _" \, l).run()# A9 o* w9 I9 e( c# d! Z8 v
    ( v! s# Y! V3 |/ G
    第八种玩法:爬虫存入数据库
    / y, B5 S! e' ]* K9 `  d% M) l存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    : @" S; o- Q/ [8 g& `) O
    - m# D6 V7 `$ _5 J特点:
    + u- I& C& h5 ]信息存入MySQL数据库。. T! [, }9 Z8 V  g+ k* m
    可连接docker远程数据库。1 E0 i. z+ ?: U7 `
    数据库的库名可以不存在。" [8 B. M9 D  @$ b* O
    数据库的表名可以不存在。
    9 S) S) y' \0 M" u根据之前传入字典键与值参数判断表类型。& f* t* I# b7 E. u+ g! ~
    自由建立数据表传入信息。
    & h% i; G$ n  ?6 }
    + G7 f- J  f  @; F$ _缺点:
    ! Q" f' u: [" `3 P0 L% O5 I2 w% O仅支持MySQL数据库。
    ; }4 B+ w0 X- `8 v
    : l4 l! S9 K1 }; J$ O; m+ _) U:return SQL! J$ e1 F4 n; `
    5 Z4 z0 Q# E, [, k
    request.parse(
    1 |# r& l3 y+ \! h! r: t    url='https://www.douban.com/group/explore',
    3 o$ \4 g, d' ~# P/ t    Parsing = 'xpath',/ o) d- \, [) F1 P
        label = {
    0 N, N0 s- q9 {$ ]! h' g( w9 c% E        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 W7 x- v( S: E% y" V# Z        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    , @& l" [8 Q+ o3 _$ a% S        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]' Q& w+ [9 i) ?8 S0 ^5 j1 x5 ]8 P
            },
    $ g# {- P9 P5 M# o$ l: n5 z7 ]* \    write='result.pkl',& n9 W( D( j' p0 r1 j+ G
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& r. F$ W  u- M, [& i
        page=[True,'url_page.txt'],
    ; C( S. {! K, B6 \* k/ K# o4 F- w5 k. g    clean=True,3 E5 B3 o& n' ]" @! o0 S% t
        # 字典格式,! v- @. z8 v0 z8 J
        # host可有可无,默认localhost* k$ F3 ]$ G  r: R6 D. a
        # post可有可无,默认3306
    + C7 l" Z8 o: B' `* G    # user可有可无,默认root2 R; m. E) ]" S: s9 V0 ^3 q
        # password必要参数,数据库连接密码/ t* D3 X# |+ N# i6 A; I2 B0 P& ]
        # db必要参数,数据库即将存入的库名2 k* p6 S: j- s9 N* @3 D
        # table必要参数,数据库即将存入的表名. N/ O3 n' K& ?2 B7 N, Q) l
        write_SQL={
    : R+ l- n# K0 w8 n/ _. h        'host':'localhost',
    ; w7 J$ m+ S4 n& N        'post':'3306',5 q5 J, A, U4 O2 a) {
            'user':'root',
    ; k2 G. r0 {: b2 n3 w. q$ e& K        'password':'123456',
    , ]9 m7 J' e# z+ Q6 e8 Q        'db':'example',
    8 G2 O6 D6 \  S8 @        'table':'example'! [) X/ A- h0 P8 D4 S" F7 ^- i( W
            }! T* y: |" F( t) \
        ).run()# J3 A& a% t  s- `
    0 o4 j& t  e3 B% S0 O4 h5 F( _
    第九种玩法:重新启动爬虫  k0 y7 {6 h3 r/ m, R
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    # r" e0 M  `+ R9 M7 Q7 ]7 P6 _# D9 `5 w; X
    特点:
    2 m7 o/ g$ I/ ]' f- ]& b' _检测报错重新启动爬虫! e- J" F# |( p8 x3 j% K
    无需手动处理错误信息0 X9 y, {. l$ E5 \( Z' F% h
    $ E# O5 {5 ?. f, K5 ^) d) X. d
    缺点:/ W) k) H2 {. H3 S) p. }! u
    无法收集子线程错误。
    3 o! H8 `8 m( [7 Z. q/ w5 ]: z- O6 k
    * L: W1 P$ \- x' w0 a:return None7 H) M- s  v, y% V2 `1 S' r  R# b
    / h3 g$ [8 m4 L9 y+ G
    request.parse(
      y- C' D0 i; S- b$ |/ W        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    - t: ]/ f, N/ ^. R5 r/ ~* p4 S        #login="taobao",3 Z3 M7 O/ g$ |$ A: M
            type_url = "text",  v4 Q* l4 B* y5 l
            Parsing = 'xpath',' ?& m0 R& Y) s" q" ?/ e: F, V
            label = {
    9 a: p# t: a% }0 i% W6 B' N. r( d            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    + P- H3 S8 _, j& H" ]' I5 G' q            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    7 b; P* m7 l' d- x. t% G% w) m$ ?& \" k            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]* }/ S6 P5 m/ H6 x! e: R
                },
    ( ?& h5 z, L, B9 \5 n  ^) s- }        write='result.txt',
    ! l) v/ L+ a& Z, C3 [+ y        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    8 v9 Z  k2 a9 g) z        page=[True,"now_url.txt"],
    # `2 J" ]: x% A; j8 n1 M! d        # texting 参数为是否启用连续爬虫; y7 c- q- z6 K. s
            # 爬虫程序异常报错后重新启动爬虫8 l& j5 ~' @! }: T; _; |' s
            texting=True,
    ) a5 e; h, w2 R; E0 ~) X        ###
    : d1 ~+ ~; f3 W6 i        write_SQL={; Y( q  |9 j0 e7 n7 Z
                'host':'localhost',
    ) T: {4 W! n2 H/ y9 P            'post':'3306',
    3 N1 `! k5 w! k7 c! O9 |            'user':'root',
    ' R" \  ^( `$ G& `! `. t" l$ |            'password':'123456',: Q" R) f, ?3 j
                'db':'example',0 d. y/ I' s+ h. j
                'table':'example'+ I6 r' G- J) F
                }9 ~+ h7 p* O% l
    ).run()4 f4 p3 @% x5 V) F$ q" I

    ; L; f& d: z$ S  z第十种玩法:多线程爬虫
    % Q! U6 G& Z4 k7 P, y. t# U4 q* I特点:
    % N5 T# c2 e( a; X3 y& y爬虫速度加快,
    , C( R8 ]0 @8 T9 H/ @更好的利用了线程。
    3 a8 |) Z3 r/ W( v; ]; `% O( u+ d  J, u8 s8 q/ a9 j
    缺点:暂无+ h$ P$ \4 S: Y, Q- Y' `5 A
    * F  @3 H! h/ t# u; J
    :return None
    0 z0 y3 D+ d6 ], G& ~* x' L) Q" S& D5 ~; O/ w
    request.parse(8 a4 g! |/ ]6 U1 h& \
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ; H$ g& M4 I- i" }# a        #login="taobao",
    / D7 g. n, \& A) H1 z) w# B5 t' ^# |3 ?        type_url = "text",
    . O) I1 F2 Z, X        Parsing = 'xpath',
    ; m) c; o' k) Y- D* t        label = {
    ( y) a/ |# E' A9 p            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , w  P" u/ i# q; v            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; Y* g5 d6 x9 K" N, [) u
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    - D: ^2 g5 |$ h1 D5 m: c& d            },
    ! [6 h7 M4 k; k& G4 O        write='result.txt',  r+ @8 \5 O, z9 n
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    9 Z# a- T0 l( s4 v! f. ~  o( u& Y9 f        page=[True,"now_url.txt"],
    " j! [" @$ m1 z4 _5 ?, O        #clean=True,3 K8 T: [" }/ ?
            texting=True,  @4 X' R3 C/ Q0 G
            # status="threads" 启用多线程爬虫2 X  H+ g& y0 H* m% O8 U: _
            # Thread_num 为线程数目,默认为1 单线程- Y0 h+ L& Z, h. W1 |( U  a
            status="threads",
    $ D( {* U2 X' Q. k5 o        Thread_num=3,; k! C- Q5 J7 E' Z5 W/ |
            ###% i+ ?3 K/ @2 s1 X
            write_SQL={
    2 ]/ F, t- k1 c5 ~7 T$ l. \' O            'host':'localhost',
    . M  Z; ^, G" `/ g" f2 B& Y8 d            'post':'3306',3 h+ q9 J8 K9 A# A: _
                'user':'root',
    0 F" D) I  {0 o            'password':'123456',
    5 N$ P: [1 Z2 Y  @% z( j6 v            'db':'example',
    ' ^. e. C+ J- S: u/ z4 J            'table':'example'6 Y0 @4 s8 x0 z0 [# Q
                }" _& `# v+ o( u& a
    ).run()  e$ F: J+ }6 {3 K' _( M
    . v+ l" E: e) [. {
    第十一种玩法:多进程爬虫7 Y! z* \+ ?4 i
    特点:
    0 Y( r: k# c! I& ~( }; O爬虫速度加快,
    " C5 d2 M  h! t更好的利用了进程。
    4 U2 s# ^4 w8 e2 n6 p
    - ^( G' q  e! p缺点:暂无0 V2 I; `& p  h

    , H" L" u7 @/ I, I4 S  W:return None. M, X* W9 g) ?( _, v

    . T5 o& X# ^- i/ wfrom simple_crawl import request# h  ]7 V6 l5 ]: p
    request.parse(2 ^6 q9 b: L$ n+ B. j. A. p6 ^  U
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],' f( t  @( o+ K! N+ K2 v
            #login="taobao",; v. E# l2 j6 c# f& z- m1 }
            type_url = "text",
    ; {- y8 j/ }6 b3 c/ m. S6 Y5 I. }        Parsing = 'xpath',* r7 O3 g5 [8 ]& y: G
            label = {+ ?( D! l! h9 ~9 B8 x9 _
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],: p3 q; O* y# _0 z4 U8 h
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 @0 `* {5 N+ e- D$ }
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ) ~# z/ h8 d: K( a6 `            },8 _; ~- _2 @/ z' h( T
            write='result.txt',
    , C/ a9 @- o; s9 G* J        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + K, z' j/ N; }/ T. G/ P7 q+ m  `  s        page=[True,"now_url.txt"],
    4 L/ Q( n9 m; N        #clean=True,
    & M; I4 k4 B4 J# u4 U        texting=True,
    * T6 Z( _. k' \& c+ f. T        # status="multiprocessing" 启用多进程爬虫  T0 Z& M$ K- U9 ?: _
            # cpu_count 为启动代码核心数,默认为系统核数一半
    . C) j4 U; b3 A; L1 {' `, L        status="multiprocessing",
    ( ~7 p$ ^( U. |! ~0 p        cpu_count=2,
    ; u5 C9 E+ y# i        ###
    0 K) E9 S& `/ V) d# S( D        write_SQL={
    # R3 ?7 S! F1 F4 Y5 j- ~, x/ f! m            'host':'localhost',
    / X$ Q# W% W; R5 d6 D            'post':'3306',! F& g+ A5 F" L  b% q+ z
                'user':'root',
    , K; z6 G& X" P* c7 ^; j! d            'password':'123456',4 e" `/ |3 h# U9 a& }  _- n# `
                'db':'example',3 ?; C& l- I9 V3 D' X
                'table':'example'
    , d+ T$ E  Q! A+ q4 q0 B1 s$ W# G, t            }
    & ?$ b6 k! ~& E( M3 X).run(). u5 x/ X8 w+ @; Y9 j/ o2 j
    3 G) H; N. M9 t1 ?
    第十二种玩法:异步多线程爬虫
    ' W# z  u+ Y- c特点:
    8 E8 ~3 @; E$ M- Q; _4 k# y: p爬虫速度加快,
    / N' M+ z* x% D' T; J异步使得爬虫无等待时间,
    6 h: Y  ?, Q4 E5 `' D" Q* q. {同时使用多线程速度明显加快。2 P; s" ~3 b* A. `" v
    # X) e: @9 ?3 N
    缺点:暂无
    ! q- {8 [+ N6 E- [. Z- O! [+ C8 L
    8 ^" p: o1 g  A: t8 @:return None7 S+ u2 y) D1 z4 y) A

    ! q* V6 x% ~2 I4 B; l5 j6 Nfrom simple_crawl import request
    . e# p, M4 o% [9 e, Trequest.parse(3 {1 W  j/ n: F0 V
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    % J9 R: E# x; s3 A& g        #login="taobao",, t5 k, R: y7 m# B! Z6 V
            type_url = "text",
    3 I, a' Z* q( h' Z. l1 ?+ s        Parsing = 'xpath',
    4 B* g2 e) R; @2 p1 K2 t        label = {* G' @' d" u5 Q- P
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ; t; _0 ~0 ?  M) ?  s5 R- T            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ) {( |) C$ M0 M' M; q4 F0 |            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 J/ D: M! o% [9 m6 I; u: M7 ]
                },
    * f; ?- ~% y  ~7 n" k" [        write='result.txt',
    9 Z6 v3 N) S  ?# A- D4 B' c        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ! q/ W9 Y5 w- U+ C# q; J        page=[True,"now_url.txt"],
    6 J4 l8 m- m: |( T: {        #clean=True,
    ; [8 W/ Y9 @2 o* ?2 U- O        texting=True,3 [6 Y7 n' h: v" i5 \
            # sem 参数为异步引擎数目,默认为5
    , J7 `. H- _0 u5 j  a        # 其他参数同上
    " E0 y' c1 a$ c2 D% c/ l0 e" |        status="aiohttp",
    ( S- g5 w" S  ?6 \        Thread_num=3,  Z* k. p; P3 ]' J# y4 i6 B6 G  V3 d
            sem=5," }+ y: E/ ^! D- Z
            ###+ u' ^3 g: q* `* ]- P' _7 h
            write_SQL={
    8 c( \1 d# O0 W* x8 s8 \! z( Q' N3 o            'host':'localhost',: R# D/ T7 N; L! ~" @6 r
                'post':'3306',* e- a  ?( O2 C
                'user':'root',4 W8 |# r6 {) s7 p! B! }" Z8 C9 R
                'password':'123456',
    & O' ^+ q! A& @! e' S            'db':'example',; d  H+ g  }+ x9 y
                'table':'example'$ u4 K! T/ x( t# o
                }
    3 p6 l- T' `/ `' F  }).run()' {- ?  G* S6 i

    ! Z# X# _7 O# P, G8 E, Z第十三种玩法:异步多进程爬虫
    ! @2 j$ ^: T1 r8 f0 p0 y特点:
    7 G# @# L  W/ ^8 J( V爬虫速度加快,- }) B2 X# y9 k: f  e2 e% P
    异步使得爬虫无等待时间,/ ~- C: ?& t5 v- B
    同时使用多进程速度明显加快。
    + u0 y4 \" ^0 G0 w' [- [# Q) E
    , d. A# X- N3 S8 S: u缺点:暂无
    5 S( B* g8 r: C" ^. }( E  r6 w3 G" A
    :return None
    - }+ t9 x& X: E- D9 O
    4 C- f: h% ^3 J$ wfrom simple_crawl import request3 R% y8 r+ a, k. _% b, u% I" M
    request.parse() h0 u) w# U, M9 I# z( W
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],- A2 I+ r5 y( U1 I0 v
            #login="taobao",
    3 H- G$ O, H1 ]. m! G        type_url = "text",4 |% Q7 `+ p; f1 y
            Parsing = 'xpath',
    3 M8 |2 F& ^6 k        label = {
    & w* B( s/ G1 R8 s, Q2 L            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  |& s9 B/ R; o9 i% r
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 B; P: b! t( d& H' r6 S5 X+ l) w
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % u& {$ Y0 \" @7 m+ [) {8 g% I            },# o1 z$ ^: n( e* n( F4 H# u
            write='result.txt',- j- u* ]2 c5 t8 W8 Z
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    0 F6 }( D. i/ @        page=[True,"now_url.txt"],2 l$ Z+ ^$ N7 x" E+ @
            #clean=True,0 M/ R+ E$ O& Z5 {
            texting=True,
    " T3 x3 B- R; M. F* f8 A+ Q$ O        # 参数如上
    ! U/ ~$ X6 v$ Z! T        status="between",/ c, @, L5 T, d8 v* d
            cpu_count=1,
    5 W7 Z9 l$ ^2 [$ M# E        sem=5,
    8 Y9 }; \9 F* }& u5 T        ###
    + k) {( h! g+ X7 g+ G4 _        write_SQL={+ `9 h2 v  V  B, E' L2 ^! L
                'host':'localhost',- y) u( A7 w6 n# `8 m9 a5 g; z$ `3 \
                'post':'3306',
    * _- L' q# x3 o            'user':'root',
    % `0 {, F, y8 z( A            'password':'123456',
    . @4 P4 s6 p) [) y. W3 n            'db':'example',$ k, `/ @/ K$ j4 \/ C% v6 V
                'table':'example'5 K- u; f+ O; R" ?$ r6 b( I* o7 Z
                }  `2 d: f7 [6 A: P# {9 S
    ).run()
      a5 {0 w7 {9 Q
    ( m1 b7 _# @" J4 j# u
    * w7 q2 G+ e1 K: J3 ]9 m  s$ a; [- \3 {功能介绍完毕🤞
    + K2 H: z% T$ ^7 |最后还是希望你们能给我点一波小小的关注。
    & O0 \# }- H+ N奉上自己诚挚的爱心💖
    . u# V5 x8 D; V; z————————————————: P2 [" v" @, G. K
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    / C3 u+ I4 F+ `; T. m% h+ u  X% D原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    & W$ k1 Y0 c0 U0 J$ ~) m! q) e: T' l& O" w& [( z! ?

    ) Y! I3 d9 ?/ X. _; t2 C
    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-11 07:04 , Processed in 0.441766 second(s), 55 queries .

    回顶部