QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4719|回复: 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_crawl1 b5 A& _4 c+ _. x' C
    simple_crawl
    - s1 R* ^* R1 F+ y+ B仅需一行代码即可达到爬虫效果1 b/ o0 {; P3 c
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    7 N0 }4 y1 [, ^  p- `: c* S4 ]使用方法
      `$ B6 C& u' ?! W: a% P, d* e- qpip install simple_crawl
    ; P4 ~, y; }' R  x* Z' ~1 W( E7 W4 S! ^1 L+ }0 K# c( B+ H) y
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下/ _  R5 E5 \2 v) O# z
    from simple_crawl import request. }0 F, i: x, Z! E$ U
    request.parse(3 W2 c- H6 ~! C7 H
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合% F1 b% t& p/ y% z5 C4 a8 R3 ~! i
            status="aiohttp",
    % n. ~' B2 y' E$ h        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    ' G% y: ]. f; h        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    6 a) O! e& g3 _0 l0 @        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息9 a9 A( [$ C7 y: P  ~8 q
        #login="taobao",
    # z. g4 g/ T9 n# p. B+ S    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    1 Q- b2 [( A" m. v& s8 ^  t    type_url = "text",
    : H. w8 c7 Y3 h    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    0 a0 Y8 O' p/ K; @* c6 p& a    Parsing = 'xpath',) u# X# T8 Z7 W$ ]' y8 O
        # label 参数为爬虫解析过程,字典格式,详情见下方
    # H2 v; V" D' u- M/ O3 {& m8 Y- U" F    label = {
    / n" @& n; Q# W. s7 n            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
      }( `! A' A) ]' w8 P+ s+ P8 b            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," w. y; F1 F( Q" O
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    # \/ a$ b  v' q4 _9 |" U     },
    6 S+ ^0 H) m* j1 P     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱  V& m! z" W' m; \) y, }
         write='result.txt',
    1 k. d# [0 e; n$ D* p     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫& [8 j/ o) b5 ]% u: d0 ^
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    % B; O* m: ]. N, Y0 A     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    / E' a' p2 ~/ ?- ?4 g' v; s5 G; v     page=[True,"now_url.txt"],
    . b3 |% M# c2 P( T0 ?/ B7 f/ m3 K     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息+ w9 J( w# F3 `
         #clean=True,+ _* S9 [, Q+ Z- {5 G
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序; K! p7 W* k7 ?1 _! E* p
         texting=True,
    2 R3 G4 E. L2 D+ s  \     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    , h3 I0 z1 ]8 ~3 g& H) }2 C     Thread_num=3,
    * i8 A) y8 k' K     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态, n2 Z& F/ s9 K
         cpu_count=1,
    - j, {4 G9 ~) r! i' w8 z" d     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    , f1 K. L) C+ O# E; P# K% c- W8 R     sem=5,
    $ s6 i: f' g9 c2 [; s     # write_SQL 为是否写入数据库,默认否
    ) ]( U1 X( D/ n3 r! s  C" }! f     # host 参数默认localhost4 N& ~4 D' a) Z) n% `1 V% Z
         # post 参数默认3306
    6 A+ }* {2 b9 i% n$ u4 \) t     # user 参数默认root
    . L  r; ^) J' N3 K; m& p- N     # password 参数必填,必须正确
    6 G! H; N5 v, K     # db 参数为即将存入的数据库名,若不存在自动创建8 J) b* s9 D- m5 Y) o$ Y
         # table 参数为即将存入的数据表名,若不存在自动创建
      O2 `8 n5 z" D& p! d     write_SQL={/ v8 E( ~7 g/ {
             'host':'localhost',
    $ ^$ {1 m* A& y         'post':'3306',( _- P) r5 T( m$ e* n
             'user':'root',
    ! Q! u+ |/ ~5 C7 {: V; c         'password':'123456',
    % D5 W8 ~8 V+ c         'db':'example',
    9 P! _" e/ Y: q- b8 z; {2 n* I         'table':'example'
    1 h' f* d# B3 n8 N0 n      }% Y  i4 O$ K5 b5 Z% Q/ X) W
    ).run()& ?) s1 o% W1 S) j
    7 V4 M3 d% G- Y5 S
    介绍一下crawl参数设置:
    + c* U1 ]4 u1 n3 P' Q1 c. a' D/ Y0 Z% w3 ^8 }  F, Z# ~
    '''# a- Y7 n6 ^2 K! l
    单行代码爬虫程序执行
    3 R  s3 c1 V# y:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档$ R- z( w$ M2 c
    :param url:即将请求的url地址,仅支持get请求
    0 H& e& V/ v+ w1 Z:param type_url:请求url后返回格式,支持text和json格式返回$ C. ?) w  \! u: z
    :param Thread_num:即将启动多线程个数,默认为1单线程1 P; w- I6 v  @+ W
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为54 ~$ \% H9 y: Y6 @( ?8 I
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    & {* h+ H$ l$ h/ b6 S$ o# Y:param login:模拟网站登陆,保存登陆信息
    : ^3 i  h' u$ I) [:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    ' ]5 Q6 f  I# Z6 G1 {4 l:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    $ a# O/ v- }/ w& T0 _                       多次报错结束程序,默认否% l' }7 j! X1 y) j
    :param label:选择器内容,字典格式保存,
    9 Z; I6 s) Z# }" Q3 w                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    1 r4 m$ i, L3 a                     第一个参数必填,第二个参数默认str类型
    1 s; F0 l! s8 j' }:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否% k) @9 @* w! n. j1 m. r
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    # A* }. V6 |- U; D:param page:是否选择断续笔记接手下次爬虫处理,默认否
    $ @' ^. G. w; X$ o% V:param clean:是否进行简单类型数据清洗,默认否+ G5 [3 G( j/ B5 X$ L" D6 a0 [$ e* N
    :param write_sql:是否写入数据库,默认否& X, T- @" E7 B7 }- \3 b
                             'host'默认为'localhost','post'默认'3306','user'默认'root',% {. [% t& f0 b/ i1 q9 n- [
                             'password':'密码','db':'数据库','table':'数据表'," ?$ _# v( w2 P( |
                             检测库是否存在,若不存在则创建,若存在则直接插入,
    7 x. q" b/ p" m4 X2 a8 t                         检测表是否存在,若不存在则创建,若存在则直接插入: d1 w) j$ f2 U, r9 L: N' g
    :return True
    . A8 l' Y( e6 g. Z'''
    . n" Q  A6 b' W, j8 R4 W介绍玩法- ?# B" j/ |7 ~- K
    接下来介绍的均为调用第三方库的情况下运行:9 i1 W7 G. t; E3 t0 A/ h

    : T, g+ z7 r/ ?. N  v+ G. Yfrom simple_crawl import request( S% i8 y% `8 R4 T
    第一种玩法:输出源代码" l- ?( \+ w: d+ B5 V) z( T  Y
    调用requests库进行源代码请求。# e2 T: w7 ^1 h# ^# b9 M+ f
    1 @) U0 M5 W5 O- M
    特点:
    % q5 y  b7 u" ?6 O) e请求失败则调用ip池处理重新请求访问,5 w5 n8 n; A4 F, {; H
    出现五次失败默认网址输入错误。
    # d5 ?2 y7 }3 s& ]2 V* u! H3 ?) Q支持text以及json字符串返回。默认text。
      ?8 o$ b, I# J3 R5 r" K+ y) p
    . K" g' p- B9 Q3 K# k7 B缺点:
    ! r4 r' U6 L( x3 L暂时只能进行get请求,不支持post访问% H0 a5 M7 }( l: [
    4 F: ?* }9 r( ?4 @
    :return text or json
    # @: R! J" \1 o/ f9 Q$ {  d% ^/ v6 @+ [! o% ?0 J! Q: c
    request.parse(4 e( ~6 C' \  {2 |, D; S& D% @( C- e
            url = "https://www.douban.com/group/explore",
    ( P$ `: ^( t/ X! c; K        type_url = "text"5 C* y6 \# H. S- u; H
    ).run()* r; l- b7 N+ t5 c, N+ d; ^
    # return text4 C7 o. @& \  S) u+ o. H

    8 R( ^" p: [/ v% [6 J( N! y第二种玩法:模拟网站登陆并保存信息) p1 E9 {9 h; `+ j7 v
    调用DecryptLogin库请求登陆访问。2 O- U; A# R% C9 ]0 H3 @
    * u! H2 {0 K- z# x
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    ! t# n% r: ?5 H6 y+ c- n在此放出文档地址
    ) k3 q4 E/ n' C  G% o7 @1 C( xDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/' z& X2 f% w+ Y0 y! \0 K, e

    $ V0 Q  }4 V: W) H特点:
    ( X7 `# ]2 A: e4 h8 U0 i. |将DecryptLogin库中二维码继承到此库(非二次开发)
    * ~, R' y5 _2 J1 Y7 g0 m支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)- v; V, H2 L8 E$ {% C
    保存session.pkl信息到本地方便下次登陆运行
    $ c5 T" B& }& p( L6 ~# a8 Z+ u9 s* R0 C8 o3 {8 E4 X/ @
    缺点:
    * M0 b- ~0 X$ ]$ }  H, u! M/ r, Ssession.pkl登陆信息过时无法自动删除。3 X7 v4 r% d4 b, w; V2 m  g
    导致下次登陆疑似cookie无法正常登陆。# E6 r  ?0 }8 P
    . I0 c9 V  b" j' U( T8 i; P2 v3 I
    :return session
    . @+ K% O1 H2 h* k% @( m7 L$ l; @4 Y( t5 j0 M7 E  k
    request.parse(5 a) e5 m. a" A% v; X6 V
            # 臭不要脸的推广一下我的店铺: j3 v) u6 u8 p2 K! s% d2 x
            url="https://shop574805287.taobao.com/",
    9 S' W# q$ u& I) F  e: k        login="taobao"
    8 @3 s4 b8 P  ~, ?5 [4 J; L3 m+ W).run()
    2 z7 t6 W0 W  m& i3 z' [& B- X# return text$ A0 U2 d2 B0 d4 L% T8 U4 W

    7 A  ?4 W+ E; p, R第三种玩法:爬取网站信息
    # }* l) X% Z4 S爬虫库自然少不了爬虫的过程# R* }9 M$ n7 v

    8 {$ z5 s9 `% s8 h# x, n特点:# a: u2 I# E% {
    支持re库,xpath解析以及bs4选择器。
    " o, E& {' E( m1 l; w7 Y爬取方法为字典格式。单方面输出。
    $ N! S: ~# K! U9 Q, |- W1 l字典键为保存的字段名称。
    % P6 c% P, S) C& f( u( C7 f' [字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。5 g# K( u0 t6 P9 ]7 j5 @

      p- }5 C" D0 b! z# W缺点:暂无(等待小伙伴们发现)
    ( v; L% j6 R: i+ b, Y- K3 i7 b/ C' N2 B& J- w
    :return reptile_results
    ) \, v3 b" q8 w& s( }! O* P9 A) Q" E! K9 m/ E% c$ L# ?
    request.parse(1 c7 S" T; M4 D7 J3 i* p: r
            url='https://www.douban.com/group/explore',' }! e2 V+ M' h; z# L
            # 字符串格式,选择器方法。
    6 `) s( m3 b4 A, |" I    Parsing = 'xpath',
    ! o- Q$ C& s4 f8 X- E0 t    # 字典格式,参数如上。
    + b9 ~6 E- X7 m  a3 _- Z    label = {
    / _! ?) x( Y, ?3 B  o        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 H: K9 E8 }6 M7 w4 z
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; \7 ^) `1 \* ~        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]' @; U& c5 z" `9 E% d( }
            }
    " J! [) x! f  E% ?8 V  _).run()
    0 ~1 H# w5 a, c' e# V( _% p# return reptile_results(list)% n9 r. Q7 Y9 S' P. }8 @4 S  i& n* J

    7 _( ^% \' G9 p5 [7 W) A( H. z; \. K第四种玩法:自由保存信息+ r9 _7 S0 x; \
    目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。, x7 a! o! [5 }! f) X9 \
    ' j) e  y& |$ R4 g
    特点:
    5 i7 d3 x) `5 d/ p! N$ _4 u2 [写入文件均为数据格式传入文件。
    6 }" W, j( B* \; f8 \且输入格式规范方便阅读and省事。
    % b" |4 r+ Q, ~7 l% K9 r7 x3 }% c
    " M: m* t2 k, M缺点:/ Y; Y% r9 ]7 @* y, s9 k# g
    保存格式仅四种,
    # ?; p* L' m5 L! [不方便用户之后读写操作。
    4 W7 k' A$ U$ o% Z1 p9 J1 E1 ?# n  \  O1 T4 l
    :return file
    ( |* U7 n! B1 w( M
    5 ?7 `- r, I; xrequest.parse(
    3 c  N1 b' P7 J        url='https://www.douban.com/group/explore',
    ' R$ |! G# w* r, B9 n) O    Parsing = 'xpath',) \( J0 N  X$ ^* x
        label = {
    . W( o' |; O3 o! p( I        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    $ t7 Y, s* t2 f, v# r( |) D: j        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 v& m+ f" m+ c- y% D) K) L5 r        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * n( K; n5 B$ m7 w5 \) D, w        },
    # P# m$ Z! \% v9 p, @! y) j3 ], m    # 字符串格式,具体保存位置填写
    + Q+ m, I, m9 [2 A    write='result.pkl'
    $ N+ ?" o! S6 r- m  r. b; g).run()
    6 S4 u& y. F- @0 Q# return file
    2 ]7 P6 U4 I3 |$ n# k
    4 y5 G; c; B, L& M7 _第五种玩法:读取下一页 url 地址继续爬虫. U! J6 g- F/ T4 t6 f
    这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~- @" I) k1 S0 {) n
    ' h1 {7 ~3 e7 e* G8 ^% v9 I9 g0 E
    特点:
    ( Z8 X* z7 E5 j4 y; k! e继承之前的Parsing参数选择器选择方法。, b# {  ~' ^: g$ D" L
    在这里可读取到解析后的下一页 url 网址。' e. L& R9 ~" r- S% X( q- y, {
    方可继续进行爬虫处理。方便用户使用。2 ]. m8 Y- b; q3 }7 \+ F
    8 m& k/ M2 k1 R
    缺点:! |6 u; J( K! y0 @  Q. C2 D# y
    若爬虫时下一页 url 地址改变,便结束爬虫。3 L% m) t; ?; \6 H2 y
    只能爬取所给 url 地址中的信息。
    / e: Z3 U3 @8 i无法进行某一界面的多个网页爬取返回。) k5 Z' y. n3 ]# k# b4 O& a
    造成访问页面单一流失。
    3 t6 `) N- p1 |! f% {. }) E7 O! A1 {8 m- f0 x: N; i& B4 J
    :return None
    6 {  p' G- A- T; P/ b% J& ?! S1 b1 g
    request.parse(+ Q+ V, w' }! R# i
            url='https://www.douban.com/group/explore',) E" C7 S: z" ]7 C
        Parsing = 'xpath',7 s! s% |  h6 [
        label = {
    7 |1 F; X4 p+ w* J4 U" b) y6 Y        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' S& e8 B* A9 I% ?# m; G        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 m4 w- q$ J# H% n+ g        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ D6 o1 h9 X& |7 o1 q% b
            },
    : Y' L& ]+ K. z    write='result.pkl',
    1 @  L# I7 t- q$ }, X" N    # 字符串格式,根据Parsing方法继续请求下一页a中href
    1 l8 H$ O( b' P. Y" F) a    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ b5 ~8 A+ `! U1 m+ p
    ).run()- U" T0 w4 v& A& a6 e9 B: @& F
    # return None 3 n4 |* e0 a2 X. V$ [, u

    ' H" E, j* U0 X! |第六种玩法:爬虫网页保存" l9 {' @7 q3 o
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!8 G. b+ g  B: G6 {+ @5 `) n" K
    5 Z  u6 s, l6 c
    特点:
    : \7 W3 h4 r; h% `持续输出断续笔记。
    + h& Q  g" t, q' H% I将此次爬虫的 url 地址保存到一个文本文档内部。
    3 k) g: @6 |5 [8 U: t下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    7 M: Y! k- A' Z/ O" o; |$ ~2 Q# @' o( z# q
    缺点:
    7 z  ~6 M$ Z6 M& O$ v" g6 u$ `# n读取内容不单一。
    6 _5 P  W4 l% f/ _( ?2 r+ i9 Y, y5 k2 [导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    2 p# V% j: A, g6 A4 r& A
    % L- z0 j3 t" V8 y. N2 i:return url_file+ s9 H5 V% w/ P4 [$ g- \
    7 S" @. F. I+ s5 Q# S8 ?( |
    request.parse(
    # ]. ~" U- C$ V" E8 ?    url='https://www.douban.com/group/explore',
    # L/ Y4 p. T' i) _6 K8 O2 l6 _    type_url='text',, |" ^9 _  ?: R( X
        #login='taobao',
    , i, Z/ {* k1 _" E    Parsing = 'xpath',1 m2 M. p$ G% N+ r2 I( p
        label = {( k: O$ C# o  ?3 c% O
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- v/ m; Z" }. J% J/ Z
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 H/ b6 h" Q. t# t( Q# ]( r
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 F$ {- A  g$ o! l        },, s$ L& @: I( q' _0 Z# n
        write='result.pkl',/ d# u3 a* t- R% D. }% ?" V9 L% e
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    " y/ L" J" J: A    # 第一个参数为是否需要断续笔记。
    ' r$ Y+ T$ k  [2 t7 d. Z& [5 E    # 第二个参数为断续笔记保存位置。
    ! k' A  S: d& @' h1 @4 u1 r/ |    page=[True,'url_page.txt']
    / H/ x) m4 h+ F).run()7 ~' p% A, \; E
    # return url_file
    ) x* O8 I* m8 ?) K5 v- I: z5 ?; O6 ?% z- H* V
    第七种玩法:简单数据清洗# v% |4 S$ F8 R& w! p7 }- {. m* w
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
    9 f! T* i% r0 H3 B, `' n. U4 }- w6 |9 z. Z& i9 M6 y! }
    特点:# l2 E& r0 u5 {9 R* {
    本人曾写过一个底层数据清洗。4 K2 @1 D$ E. L. x) H" g
    能将列表格式数据进行归分清洗。) V) [1 O3 @9 H0 t/ Y9 h4 `
    主要内容请参考另一篇文章& w* P* t+ t, G
    如下连接:数据清洗
    ; e; I9 E1 r/ u  t0 O/ T8 m" T* B4 Y1 H
    缺点:
    - W$ \8 m8 u0 g. D0 F数据清洗格式简单。( \( p' G# r" |- t1 x2 k2 x9 ?
    数据清洗内容单一。9 Z' a% ^% h! R) _  S) n
    无法完全做到绝对清洗。. Z' ~2 P* l9 L2 J
    有待改善。
    / ~/ J& U& E3 N+ S1 q6 I$ O2 z4 E/ A5 h  U0 C: A
    :return keyword_list, value_list$ M; i% ?) K3 n6 B) h" h0 U" ?
    " Y* j) }: G+ {$ P5 T- \
    request.parse(1 k& x7 P/ I" w. Z- k
        url='https://www.douban.com/group/explore',) Q9 R. k) ^% p: V. B- l$ c
        Parsing = 'xpath',
    ! _9 E% |# q4 E1 S8 H    label = {
    9 H! j' F8 I. ^$ m0 ?        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- V  L# L, n# @! }7 g0 i  H, N
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    0 G* x- M4 a8 Q) f' s& H3 w        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( I; m/ M$ D3 S        },7 y. }( J4 M. B" W: |) p
        write='result.pkl',
    % E) O( d+ W1 U% z6 `/ `! E: M9 o" r    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    & U" }1 @  U. C+ |* Y, k    page=[True,'url_page.txt'],
    # D- b+ z" a0 `8 S, T( y    # bool类型,默认不清洗- v8 q. k9 l; e% ], V
        clean=True
    , y9 R" r0 `) b* U- s2 V) f3 B! {).run()4 q; J$ Y7 e4 h' L

    1 N4 K& s/ O, l! a# B( X/ b! w第八种玩法:爬虫存入数据库" ~5 _) u* `4 Q5 A- t: l) ~; w% p
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    - l' R5 [! [# i! N$ O7 s5 @  ]0 N2 r" V' e1 i; _
    特点:
    9 L6 w6 X# d* L% W3 I6 w信息存入MySQL数据库。
    & B8 l3 _3 E$ A' _" o7 O8 M可连接docker远程数据库。
    + C5 y. R4 o% V/ G9 A  F数据库的库名可以不存在。3 J1 S8 U8 V6 |; C
    数据库的表名可以不存在。6 Q; m. a7 ?  O: Q
    根据之前传入字典键与值参数判断表类型。0 D# e: U/ V4 T1 J: }: |% b+ J
    自由建立数据表传入信息。
      ^+ p7 W* k( T! Y9 g$ B" G
    7 J' y  C9 S3 M6 Q3 b3 e3 V$ K) Z缺点:' ~# k# P  X& ?' O2 Z
    仅支持MySQL数据库。
    - `9 q, F7 M3 `9 Z$ p- G  }: I4 N. T/ B9 B# k
    :return SQL
    & i7 u% }- C% b! ]0 ?
    " G+ @5 w- i3 l  h; prequest.parse(- {; E2 N7 E+ F# b# E
        url='https://www.douban.com/group/explore',! `- p% f. q. c) h4 p& O& X
        Parsing = 'xpath',6 U9 p, y/ l3 L! Y& j2 N
        label = {
    ! @3 F8 \6 `. j% d) T5 G        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],- X6 X. q9 Y$ |' c# R
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ k$ g' A& p2 W3 R# y1 X
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 _9 ~$ Y# W/ {/ b6 m
            },
    6 R0 n% M% y' {( Q    write='result.pkl',
    6 M* F) n1 N* q8 F    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  Y; B" m$ ]. Y3 x% @* ]: ?
        page=[True,'url_page.txt'],9 E$ E+ ]4 |* @& H8 T4 g
        clean=True,6 `0 m, f: D& o8 q% W! I  d
        # 字典格式,
    2 z  ?  |6 V2 T$ w/ ^7 ~7 X    # host可有可无,默认localhost& p% d1 w# h0 f  s
        # post可有可无,默认3306
    3 ^- G  @( ~) C8 g) o; C0 ~& i1 L4 a- C    # user可有可无,默认root
    & m- d8 Q' g+ P& P0 n8 _' i7 S1 u    # password必要参数,数据库连接密码
    & D1 f) H+ A# G    # db必要参数,数据库即将存入的库名# l7 F& f! o& ~) R( S; G
        # table必要参数,数据库即将存入的表名
    ! K* s9 `. G/ I& x- X. z    write_SQL={+ c$ R" {" n0 h6 W
            'host':'localhost',
    / H6 V' h8 t$ c; i1 C        'post':'3306',
    9 C  ^* C5 y7 t0 T" _- }* S        'user':'root',+ z2 I; G7 Q+ l2 c* I3 G
            'password':'123456',
    * J/ s# X$ T- h) Y; \; d        'db':'example',  F! s) ]8 v- P+ _* G
            'table':'example'
    , A& M7 M9 U% ^& k7 \) r* {        }9 I. i# }& x) T: R7 f5 t5 n' Q+ j
        ).run()
    # n& H" S) h5 u8 e
    + L5 `/ N! X' K4 e5 C  ^第九种玩法:重新启动爬虫
    1 F8 V, D0 c) X6 j6 \* y& A爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    9 h7 W% Q# a3 U+ m6 r
    % C; b% n+ Y* G# u特点:
      n: k/ @3 U. z0 v+ r9 `检测报错重新启动爬虫
    ( G& _; `5 U* A8 V8 |无需手动处理错误信息6 T, @7 r- `; ^3 U; ?; X

    . [. H0 c2 l  `) v缺点:. ]/ Q& n* O. l
    无法收集子线程错误。
    4 J# X; O. b3 Z
    , C$ h$ _' J9 m- R:return None' R2 ?# A; k. T+ _
    + a" s* O( v; D3 W- A2 b# s, d2 }( v
    request.parse(- ^! j! x+ L- J# D) G5 w$ u5 v
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    , }( V2 Q8 c+ d. o2 z        #login="taobao",
    ) d& Y9 a, [0 {' L, x; Q        type_url = "text",
    + e, {) ^  i' u2 L4 P, I        Parsing = 'xpath',
    % f5 ]8 ?" `& l. N# B: h! N        label = {
    - ~  [% s9 ], w& d/ X. R; b            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! I% ?9 f1 ~3 j; U, ~# }
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],' E: w$ u3 p: e; u" J4 |
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" P- H! |5 _. r; n8 \5 E+ J
                },' [1 V- w5 h- q
            write='result.txt',
    3 @. b/ x" [  l% a        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    4 `1 A" G6 D: H+ D$ `        page=[True,"now_url.txt"],: q$ |) K' {/ l2 B' J" H- U% N
            # texting 参数为是否启用连续爬虫+ b+ }) A" E, D8 U- C2 X2 I
            # 爬虫程序异常报错后重新启动爬虫
    : j) x% q; |+ I8 w- H1 r        texting=True,3 ?& K' g0 O% q7 C$ p+ w
            ###% |$ G; }$ y" l8 F2 v0 t
            write_SQL={
    ( u7 y0 {! V0 y5 v( g            'host':'localhost',8 M, |6 ]- q6 Y& \
                'post':'3306'," e( Z1 M( b3 A# C, t4 e8 ^
                'user':'root',
    - T6 S- j- ^  ?8 ?            'password':'123456',% a% V: G5 n8 m3 I, I7 g8 T
                'db':'example',6 F+ y& {1 d% |' X/ r  }
                'table':'example'
    ) G% x7 x! z$ f6 v            }3 C' L. `; I1 o0 t
    ).run()
    & k5 P# `9 y! R) l) u9 C6 ?5 v* U0 `( Q0 {) S
    第十种玩法:多线程爬虫4 W* V' m3 S6 B  V+ A' ]9 z1 g
    特点:- E8 f. e4 f% ?* y4 ^; x1 G2 e3 ^
    爬虫速度加快,
    ) ^* K. C) ]4 i2 ~" X更好的利用了线程。
    2 h1 Q0 ?: U3 Z% F( @. q3 d( g* h/ H4 l- e2 h) K. ~, ^2 p% j4 |
    缺点:暂无
    5 m7 {7 N8 e( k- N* j; G8 r0 o7 \, ~" g2 |+ z0 Q
    :return None/ ~" q9 M9 M* G4 K
    3 O" A' E8 e" S2 B' `) k
    request.parse(& W9 _1 ]* ^6 k) _; V
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    : m9 K' @% S' C$ v, x2 J/ B) _        #login="taobao",
    9 w. [  Z% d" r/ l/ v* j3 m$ ]* E        type_url = "text",
    . `4 _/ [3 T) U1 K7 j. J0 I$ A        Parsing = 'xpath',
    3 ~- j2 L5 w( l8 _2 a$ d        label = {' d. L1 `! y: m, v5 ]. v2 U
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ' h+ w& V/ i1 T7 \7 l            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' {0 z1 p' ]9 ?7 C            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: E8 e. J: j3 U8 O" m7 ~
                },1 Q; v- w3 B$ h6 U1 T, Q; l/ I
            write='result.txt',
    * M2 C: }2 A  F9 y5 A2 H        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',8 `0 H7 `% ~6 P8 `  b% W
            page=[True,"now_url.txt"],
    0 ?; G6 L5 T, O) h        #clean=True,
    + l. u5 q6 W' [# a        texting=True,- z3 N9 h( c* W9 a* D: E
            # status="threads" 启用多线程爬虫. s4 q: P: u& a, N" o8 h
            # Thread_num 为线程数目,默认为1 单线程
    3 ^# K- s" |( z$ x2 v. I1 J& @        status="threads",
    $ Q2 t; b( C" h1 L        Thread_num=3,
    3 Q0 o" ?; h2 ~, e        ###
    1 d2 z1 O/ o0 e        write_SQL={' k) w$ L0 Q$ e- G7 Z' B! A
                'host':'localhost',
    ' K8 [; t/ b$ k+ q( y" l( r+ M            'post':'3306',
    ) z; L3 \: f$ r. `0 h; G            'user':'root',7 r) m7 ~  ?- F* a" A' [
                'password':'123456',# }( l9 ~  n# o9 r
                'db':'example',
    ) Y( q6 B* N- @2 g/ b0 \$ r            'table':'example': l; N6 n# }* E" ^( A1 I5 i
                }- V) ^$ ^; L" E- W. X; l
    ).run()3 s% W( X6 {2 \, s! u
    ! L# W( H! B6 z
    第十一种玩法:多进程爬虫
    1 I8 ~" a7 `- @; |* x7 D4 H特点:: h  s1 V* H/ q  r) N0 u
    爬虫速度加快,
    4 e% D6 M) n4 g% B. M! l" E更好的利用了进程。( r& L3 a! ~, Y6 Y3 W

    0 J! g2 P% m1 z+ ~/ @( v- I, `缺点:暂无
    / ]+ C" _, p) u( Q
    * b1 h# C1 A( S4 v: e8 V:return None7 V5 f! N" S; r7 \' b5 i6 {/ ]0 Q3 w
    8 g! g* l4 b  E
    from simple_crawl import request
      h* n2 o: c$ G$ r! r9 Hrequest.parse(6 k- p2 q/ J* P" A: D* ?; O4 b5 E
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ( M$ O' R7 Y; u0 @& q9 L        #login="taobao",8 s- K0 t$ X2 y! [
            type_url = "text",
    5 B! Q4 u  ^- C) j        Parsing = 'xpath',* p0 Z; N) Z9 C" O8 G$ W
            label = {
    ' M! e. |0 d4 R2 [% b1 A3 c            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ; J' X- K0 ~" Z            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],9 ~0 ^* p" r  l& m
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    - g* j+ R: ~6 b. R- I            },* E, _+ _6 M2 x& @, j
            write='result.txt',0 z) P0 G  c3 a- b
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : d' {& {: u0 t5 C        page=[True,"now_url.txt"],: v7 Y! x. h- r3 }% a: d4 m
            #clean=True,
    # \3 S: L1 v9 T        texting=True,, s% P3 u4 D1 ~% c) F( B8 p
            # status="multiprocessing" 启用多进程爬虫( H. |+ T# ~4 Z7 z7 [( I. [6 L
            # cpu_count 为启动代码核心数,默认为系统核数一半
    1 o! p6 G5 l! P+ s        status="multiprocessing",* M4 C9 k: {$ q, n
            cpu_count=2,
    0 D) R6 I, f7 W# z1 F( W: f) }6 n        ###, C7 v  v! L7 T0 I- ?7 m% \, V) u
            write_SQL={; j5 l/ w2 f6 W8 f5 t% R1 \
                'host':'localhost',
    ! q9 R5 m8 g$ A+ y1 D            'post':'3306',
    4 g7 P3 \8 ?4 v% b1 G            'user':'root',
    1 Z$ F8 g" L- q) B6 J) T            'password':'123456',. X+ [. L1 ^0 m( o6 ~
                'db':'example'," Z" w0 c: A+ l$ _) P
                'table':'example'  _; b/ N4 c' n/ _$ L
                }
    $ G8 R5 D& J+ }# l$ }: C).run()
    " G$ A$ i* D0 @7 V' R6 o* q. S$ h9 A% k1 A& h
    第十二种玩法:异步多线程爬虫4 t) D6 _1 k. a/ E3 u" t& }
    特点:
    6 J9 Y% `. d4 \# b: M爬虫速度加快,; s8 J2 q' K$ T0 h. p
    异步使得爬虫无等待时间,; V* R! R; P6 O5 _& u  c/ e; }. K9 _
    同时使用多线程速度明显加快。/ A5 x$ O9 T2 b) m
      g9 I0 l1 C/ ]5 j2 ]) ^) ~
    缺点:暂无4 X* F9 `& O/ i( W( R
    0 \4 f2 P# g' D- K( D
    :return None. F9 \+ B2 h2 o7 c4 R/ j- [

    5 J& F8 T' b- R7 O" kfrom simple_crawl import request9 ?+ O0 W* v" v2 p0 n) I9 e
    request.parse(3 S! r/ o1 c; @1 E
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    3 z& G9 h% y: ]5 N+ K        #login="taobao",0 s# n( ~. B" \1 A1 V* f& M2 g) ]! P2 a
            type_url = "text",
    / i8 p. Y- J. }3 ~! n2 I( s        Parsing = 'xpath',
    % J6 B, q; b! \( ~5 x5 e        label = {3 f) z$ d. X, u& |0 m
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ! K* l, K" n1 o0 _/ q. _( a( X6 x            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 W. N# i' F- t/ ]            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & n1 Y9 t( F* H/ V            },: m1 I; X4 V# R% E3 m
            write='result.txt',
      `. l0 G$ k+ J) t$ B! L        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',. V5 l" E) D0 E6 n# k  {
            page=[True,"now_url.txt"],
    , w2 _7 {9 W9 S" o, ?  x5 K/ w4 }        #clean=True,
    , I2 b, m) i2 w# s5 |" g        texting=True,
    , V- Y9 }, i) K; u* }8 ^        # sem 参数为异步引擎数目,默认为5
    6 @3 M, t, I7 n# ~; E8 x) n        # 其他参数同上
    ( k* \" s) I% z  O0 ?' ?6 U8 V        status="aiohttp",/ }' \6 R" ?- X
            Thread_num=3,  ?8 g5 D$ q2 n
            sem=5,( w* f% t" v* f* f. p* u
            ###0 O" a" q* A9 M3 h( D, K; r4 x* \/ O
            write_SQL={: I9 s, {, x& U" r# Q0 f0 o7 U9 r
                'host':'localhost',8 M# i! y# ?# ^' `
                'post':'3306',
    ; A( b& y1 T! G8 N7 J            'user':'root',
    4 [1 q& k: R* X3 x8 \/ w& `            'password':'123456',
    # {/ o/ z3 L9 @; S3 i8 l# Y+ m" M            'db':'example',
    7 [: P* z/ y& D) {5 U9 k            'table':'example'
    " P; `2 C/ h2 `! I$ Z            }
    / O) u% J0 f0 |8 C5 h).run()
    & }+ y8 r5 b! V% Z5 y
    # [/ ?+ p. d  j* i; ^) Z4 |) ~第十三种玩法:异步多进程爬虫
    # q% T. [; j1 v& z特点:
    % t' H/ D/ l/ m( r爬虫速度加快,  w' A, P  X& e" h. E
    异步使得爬虫无等待时间,7 h7 K& j& d4 O* M
    同时使用多进程速度明显加快。
    ( G: X" x* F8 |- `. q9 }4 X* c% O8 A5 i. W6 c" k4 a2 ^1 z
    缺点:暂无+ j, `0 v: u: z3 U+ S* m4 O
    $ \" @8 V  _6 g* r# O
    :return None
    6 j* N. h0 a8 k( b
    % E/ j7 u& E, Z( Z! Q# @, o: xfrom simple_crawl import request
    ! Q* H* E$ s& n4 J( Q: trequest.parse(
    0 \& L! t& R. w" _$ ^        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* l  K% f( x, Y. k! L* p& q
            #login="taobao",/ Q8 `# D5 v! w/ X- Z
            type_url = "text",% t8 {5 u9 h7 ?# [* y4 F
            Parsing = 'xpath',
    $ V3 B3 ]2 q/ E; X3 B2 y        label = {: H0 ?( \( i5 T  Q7 v; |+ w' I7 b
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# I: E# [5 A7 m6 O
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    & @8 v, n: ]# R0 l1 r            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    3 Z7 w  v/ L+ m: s( b2 W: r            },
    , x* n9 n, J8 `/ Z: z, e        write='result.txt',8 R) k* [  I) M9 ^6 W8 i  d
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',7 d. d4 n* D0 q
            page=[True,"now_url.txt"],
    , H* n, v$ @) p' C3 ?4 A; i0 M- ?" W        #clean=True,
    # c+ U! G2 L2 k- \; p0 H        texting=True,
    ( d( l, e4 Y3 k5 Y! q+ ~        # 参数如上
    & d# ~! s' ^: u6 ^* z        status="between",
    + R5 A% q- E8 A        cpu_count=1,
    / Y: J% ^& a3 u) A& W/ d        sem=5,4 I2 J' R& ^) y/ Q2 y: F
            ###
    3 z2 Y; G4 l+ T& m0 S        write_SQL={
    ' w$ J0 Y0 e2 I0 S0 q6 @            'host':'localhost',
    2 i8 A3 `0 a" B) W            'post':'3306',
    ( H9 t0 i% A+ n. M, |/ J8 ]% N            'user':'root',
    ' h% s5 O) Z- ?            'password':'123456',
    ( f$ h4 c. ~3 i6 K0 O+ p            'db':'example',
    6 Q9 k0 G( U7 q# C            'table':'example'' E5 B' d1 P, D
                }' V8 H! ]! X/ ]% [4 {
    ).run()2 X9 a7 `$ F9 _. R* K# I

    * N. J4 o7 X6 a; k
    " g; p; c; ^0 S* m. c功能介绍完毕🤞
    2 h0 Q+ i7 W3 e: l" u6 n3 G最后还是希望你们能给我点一波小小的关注。
    ! e8 D( r+ B6 e7 _# ?奉上自己诚挚的爱心💖/ v3 H8 \- i3 i1 V, H% m  M
    ————————————————
      N0 [7 i" j3 Q7 B7 Z版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 K3 B+ x. d2 }+ J' ?原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    4 L) U& M- T% f7 `$ I- o, H2 k  E+ V$ S/ C% j7 ]+ J; W
    % }/ ]9 B/ X/ C% L2 _
    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, 2025-8-18 23:13 , Processed in 0.483457 second(s), 56 queries .

    回顶部