数学建模社区-数学中国

标题: Python爬虫仅需一行代码----crawl第三方库 [打印本页]

作者: zhangtt123    时间: 2020-6-2 16:00
标题: Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
' O- X9 m7 _* c- P! isimple_crawl
# A: k' u" |7 }/ T9 s仅需一行代码即可达到爬虫效果* A# b5 e1 g  ?( \; Y2 r
项目地址(欢迎star):https://github.com/Amiee-well/crawl3 m7 ~2 m) W& ~: b! u# q2 }$ O( K
使用方法  L) c; a' ?& q1 ^
pip install simple_crawl
6 H' T" _- H9 q" f! C( h" Y' ~" |
, P+ q1 z- D* [) q: n9 C### 以下源代码为简单介绍,详细功能介绍再源代码之下  B+ C' b: D  [$ y  [' t8 k
from simple_crawl import request
/ @1 j) b, C3 M) x5 G9 F6 }1 O, }request.parse(2 L- S7 Y3 u& V9 ~9 N
        # status 参数为运行状态,支持单线程多线程多进程协程以及联合" X0 N' A% x) i# }
        status="aiohttp",/ a& j  Z( J; a
        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式$ V( ]9 [( |# a3 S
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
8 K/ W5 h+ V  t$ B+ X0 B) R        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
; [9 a+ J7 e7 e3 [/ z* n$ S    #login="taobao",
! w/ h3 q% f3 \) z. i" f5 H" a    # type_url 参数为返回源代码格式,支持text和json,默认返回text' c# ?) }, n" B; G9 p) p; u/ G
    type_url = "text",
0 _1 ~8 w& V) e7 [( x    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
8 B6 E2 g8 a$ I/ t$ m# z5 j8 ]. P& W9 ?    Parsing = 'xpath',+ ~! u! }* W& L
    # label 参数为爬虫解析过程,字典格式,详情见下方# T5 t% D3 E* Y! y
    label = {& C3 `2 _3 V: I! y
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
" m0 I9 T9 F+ c6 R9 n            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 r. j, u, n4 A5 b8 \7 D; L
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
0 V5 I! e% |9 c. C3 ^* h5 ]     },8 M% ~$ d! @$ M! r- Z! z
     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱9 _7 x5 v6 ]% Z& u
     write='result.txt',. C/ j5 s# Z6 c+ R% }8 r
     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫/ W* h1 a# p: w6 E2 U& O
     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',' y1 K, e" i  g) K: N* ?
     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫$ N  p( V" f0 {
     page=[True,"now_url.txt"],
7 J' {  R9 O: ?# ]. T0 w0 T0 \     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息% ^& R" ~* h6 F$ K, K- J
     #clean=True,; m8 }7 e  B7 R) g  Z" `8 K8 f
     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序# W" ?3 F, C! P% J6 W$ Q, ]
     texting=True,
5 a& S( v- `2 T     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态* G* g& t8 Y3 j
     Thread_num=3," Y' m( V6 [) S! L/ Z
     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态* i, `; I) ]4 g4 O. ~: \! w
     cpu_count=1,
* |7 o% o5 y8 J2 W( [: k' f     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态; o0 w( H7 x& A; c% L) n( l
     sem=5,
6 G$ X* e  ]# G$ O/ W     # write_SQL 为是否写入数据库,默认否
) s; J4 {" r1 _     # host 参数默认localhost
, p9 R' p2 O6 a& }3 K* I     # post 参数默认3306
/ Q4 \8 a3 e/ o) o% \4 {     # user 参数默认root1 i6 ~! V) c* M% l- P& I- u& x0 d! Z
     # password 参数必填,必须正确
  ^" ]: o& h& T! P$ a     # db 参数为即将存入的数据库名,若不存在自动创建* w. E/ [% ]; b
     # table 参数为即将存入的数据表名,若不存在自动创建. m: K, X  e" z* T8 \
     write_SQL={$ b9 u$ t* v6 X  s) D, S/ {) E7 C2 O
         'host':'localhost',
+ M7 q' K- J! V# h3 |         'post':'3306',
$ Y! ~# T- [" b  H4 |         'user':'root',6 U7 K- |" m4 W4 h$ y) z3 p: ]3 p
         'password':'123456',0 y; J  b3 K- B5 U
         'db':'example',
3 R6 Q. h& g2 g1 U# M         'table':'example'
. F) M9 R7 @( f" x" L- m      }( K4 [$ M( d2 R7 z' y7 m3 @
).run()7 @$ v4 n+ [7 N( ]$ e8 p" H/ y

8 v1 Z! V' z: ^介绍一下crawl参数设置:" N- H5 I5 t9 I" h
  P; ^' u- n7 E% A
''', w; ^" c6 ~7 b1 f. k/ s8 q6 k
单行代码爬虫程序执行- h8 w6 F: r/ p5 n
:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档3 J# }! p, X7 U2 |5 P
:param url:即将请求的url地址,仅支持get请求0 }7 q  K/ k, E5 H5 ]
:param type_url:请求url后返回格式,支持text和json格式返回
' b) u# E0 Y. _, h# |; ^:param Thread_num:即将启动多线程个数,默认为1单线程
4 [% M" q2 K. Z- O0 a4 F:param sem:协程信号量,控制协程数,防止爬的过快,默认为5# D' T( o. K: y/ Y
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
5 l. P9 R( \& I0 Y$ v. L2 |; f:param login:模拟网站登陆,保存登陆信息
- L8 V- y: G* Y* l:param Parsing:爬虫方式,支持re、xpath以及bs4方法. y8 l. w- @, w4 [3 G
:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
0 T( l" L" v( E# J' p  b  P                       多次报错结束程序,默认否
" j2 E" v# ~, f  g7 l:param label:选择器内容,字典格式保存,
. h, [; i$ H; u7 J                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
* C) N( ~) q" s+ Y                     第一个参数必填,第二个参数默认str类型# x! l3 X2 f6 G/ W4 H
:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否+ U: N. e# [, w2 U: \+ d5 G( `& ~
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
6 \% @8 y! x/ ?/ a0 @& Y0 c4 e:param page:是否选择断续笔记接手下次爬虫处理,默认否( M" z% V  {9 R( R) z
:param clean:是否进行简单类型数据清洗,默认否
2 A5 c) `9 y% ?5 {:param write_sql:是否写入数据库,默认否
9 _( P' A; V: s                         'host'默认为'localhost','post'默认'3306','user'默认'root',
: _* N6 Q) p- _                         'password':'密码','db':'数据库','table':'数据表',
" }+ ^7 J, j* ^- m- G9 C5 ~8 n, Z                         检测库是否存在,若不存在则创建,若存在则直接插入,
1 j8 J: K( J2 d7 Z6 B5 X3 e                         检测表是否存在,若不存在则创建,若存在则直接插入: d8 i3 \: y" A$ k1 Z9 J3 U
:return True% L" Q& r9 [" U  M) W
'''* m/ Y/ g$ L: l% ~$ P
介绍玩法
. \! [1 Q- g4 K0 V接下来介绍的均为调用第三方库的情况下运行:
* [7 O# B  f2 p1 P# l( z
! x: y" d9 F- xfrom simple_crawl import request+ b1 k& W$ V$ s  g* ]
第一种玩法:输出源代码
7 |! ?9 _5 A3 N( h& d调用requests库进行源代码请求。
! l+ e! n" F! d2 W5 H) u) x* T' g7 t4 f# q3 B1 n4 V& p7 u
特点:
* [) I. n4 l% r) C4 A' t请求失败则调用ip池处理重新请求访问,
* z9 M; p8 k+ P8 [/ i) _& L出现五次失败默认网址输入错误。
4 @% q; N- k) ^' g) T支持text以及json字符串返回。默认text。, D* z4 N! P6 f' l
4 l* w! x% y% O2 g* l; n1 r3 W
缺点:
( {( {5 y- ]' |' e7 A7 m1 M暂时只能进行get请求,不支持post访问' s, P* s) d- o7 ~$ ?9 n+ O
; t- |% G: ]. W" W. P( W; ]
:return text or json' w- K' ?! h$ v- M2 T$ z/ S
! H$ _: ]6 `5 u2 |9 m
request.parse(
& t, s6 j6 P) F7 l$ Y  L1 {( Z        url = "https://www.douban.com/group/explore",+ ^' D" E9 G! t5 @
        type_url = "text"
) u% W2 r- z$ Q+ d( B' d) k).run(). z( i0 F/ {0 Z% Z" @7 v
# return text2 U6 m  U$ X$ r  P- e" f  I, Y
0 }8 T# j  ^! v% n
第二种玩法:模拟网站登陆并保存信息6 v( |- ?3 L7 D1 I
调用DecryptLogin库请求登陆访问。* m% e! I& T5 g. c0 z

, x  p+ a0 Y5 h6 Xps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
/ g4 _! z1 `# [在此放出文档地址
8 e, _/ `1 D; ?8 \DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/0 ^1 V$ V( p1 ?+ L4 B) [6 R0 i6 ~

! {0 i4 K  h; B特点:
% ]) d, ~& z  D+ i将DecryptLogin库中二维码继承到此库(非二次开发)
/ c) }+ [' Z' |7 e支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)0 y/ E* ~  o: P) u" T
保存session.pkl信息到本地方便下次登陆运行
: F; }4 ^. T+ ~6 x/ ?. W9 ^0 r8 Y( ]; W; r% i
缺点:! @9 \) M/ E0 C, [/ w
session.pkl登陆信息过时无法自动删除。
( g% Q1 q6 w- @8 x' K6 N" E导致下次登陆疑似cookie无法正常登陆。3 ]: l; t) S6 Q' r8 D' R" q
6 J  ~3 f. s/ r: _
:return session
; f0 k" q- g2 M2 _
- X& ]+ Z5 D6 t8 t6 |! o" C4 \request.parse(
9 S- a& H: H3 t4 M5 p5 L" y3 ~% U        # 臭不要脸的推广一下我的店铺
5 p* B' q1 C) `+ e* Y+ ?6 l        url="https://shop574805287.taobao.com/",
4 d4 ~3 V1 _/ D# \        login="taobao". T0 i6 _* h) z6 m4 q# x; u" V
).run()! W7 c3 G, l$ _) x2 t
# return text
& d/ b. l$ v8 @# h% i9 [
* h+ P) H! B$ q5 o. M: H/ o* \$ h7 S第三种玩法:爬取网站信息5 |6 m  c3 e% V) \0 c7 b. S4 b
爬虫库自然少不了爬虫的过程/ m+ K- k' T. q( k. v
' n2 X3 b& g& x
特点:1 k8 R9 T$ ~7 k( _+ a: i: J2 f- f, f
支持re库,xpath解析以及bs4选择器。
) j( Z3 R) ]6 A# [  d: D; P, k6 Y爬取方法为字典格式。单方面输出。, ~4 G6 h: `7 @$ V; c% t  m8 o
字典键为保存的字段名称。
% o$ B2 ~. K; T+ }4 j字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
. F+ @- Z* z, V- l# x: {( _5 E0 \, ?9 }4 J- t
缺点:暂无(等待小伙伴们发现)
$ H, H% P- W; _2 a( k% M. X
# r9 P" U% h4 ^( @' B0 `" M; I3 K. @:return reptile_results
8 m5 b" F- t: f( o) x5 N8 h% I5 q6 D1 |3 ]5 O' j
request.parse(
: U" N! i" Z: t        url='https://www.douban.com/group/explore',* Q2 O! S, S2 k+ ~
        # 字符串格式,选择器方法。
3 O1 L5 Z$ P+ X; ?    Parsing = 'xpath',, }( `  D% N/ _3 t
    # 字典格式,参数如上。6 [1 `) X3 C, j
    label = {
5 b, c4 V0 _( d7 e+ s6 q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
! T' p& d# L0 r/ D( ?) d2 O- n        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
# U9 K3 |1 P2 o) w# z% t8 A( m        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ {0 R3 A1 H( W% \5 |  e7 Q& O$ ~
        }
" C6 S" z, U+ D0 |9 X).run()
, f  w- u. F  k& n# return reptile_results(list)
, j& o: `" H. k" ]! g; {0 H$ W# q+ {
第四种玩法:自由保存信息* c5 A% n& B! c- p" [
目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
! c3 [& n$ @( N
  X8 i$ Q. c: `! b, \特点:
3 c. C" D8 Z& `# _& z, H1 g# w% P写入文件均为数据格式传入文件。
' Q% `8 o& a4 m! w' H+ }且输入格式规范方便阅读and省事。
( G. H  a+ \; v/ E& C* |: c
. k+ A/ ^& u- ]9 b. |! D缺点:
+ R: P7 r- a1 ^9 X6 Q保存格式仅四种,: y1 g) S! J( K/ V4 R
不方便用户之后读写操作。: l9 W( \+ p6 D

" O! \9 j0 m4 K8 I9 a$ R( M:return file+ p+ v) g8 a  I. y5 f0 L- V

2 a0 e3 o/ f6 I7 t* S8 drequest.parse(
! [% t3 H) J' {        url='https://www.douban.com/group/explore',
. h7 x  k6 ]( m  R$ r    Parsing = 'xpath',' k8 W1 T* g7 x0 Y( M
    label = {! ^" Q5 K% q9 h' \# p) |: A! m0 Y; `
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],1 [! H' u3 H% z' X" i- M4 N
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- N8 i8 u, R+ q% S1 K
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
5 r, O8 ]4 K' V! U. s( |6 U4 z        },, P7 _4 q+ Z( D- P  O" _* e
    # 字符串格式,具体保存位置填写. q9 `" y9 Z. C! J1 F0 E+ }
    write='result.pkl'
1 P: D0 Y9 R7 E).run()
' \  r, R) v4 l; O# return file
0 H, H4 w  _3 X: ~  a+ S" j  U3 T. z8 f4 `/ X5 Z" M
第五种玩法:读取下一页 url 地址继续爬虫
  |1 R6 m" \4 }2 k4 G3 T. Q这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~$ D6 ?- D, b5 e0 u$ ?) }

/ s/ c! R, N# G特点:" b- a" g/ e5 q3 [8 x4 p: X
继承之前的Parsing参数选择器选择方法。" t+ c5 g8 d; m
在这里可读取到解析后的下一页 url 网址。  G9 z" G$ E* R$ P5 N8 K) X
方可继续进行爬虫处理。方便用户使用。
: m4 g- v7 y8 a8 {6 `0 s
& `5 \' p  M1 ?$ S' g8 V$ K缺点:
& T6 L% I$ y+ l0 O8 W若爬虫时下一页 url 地址改变,便结束爬虫。
1 |3 a* N) p. x* L5 n1 B. f只能爬取所给 url 地址中的信息。$ V7 y! W6 X* V. l' ^% {# [
无法进行某一界面的多个网页爬取返回。
" L" ]- o" N+ M! {/ ~造成访问页面单一流失。" _& ~" D2 J3 s; k) q) V" P! }
3 m8 x. O, ~) R  ]- v+ h3 j' k# M
:return None1 N5 V/ Y& Y5 O' y- X
( R( w( n" G8 l9 z
request.parse(3 ?( h6 h) O! a, G
        url='https://www.douban.com/group/explore',7 D4 _/ \# [; h6 o
    Parsing = 'xpath',, M% E$ K, p. }' ~  q: H
    label = {
8 \3 J% r& F" S% l! c) w        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 |; |7 u2 e, p" L* h8 S
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
) ]% C7 n1 m6 G* |) \- [        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
% Y* J, b6 I6 R- n' {) ~0 T' ?7 j" ]        },
  ^2 v- i+ W* U; f. p' L4 T    write='result.pkl',
0 h3 m) h; g7 ^# E0 ^5 \- T    # 字符串格式,根据Parsing方法继续请求下一页a中href9 Y# I: I8 Z+ P  g$ i+ q$ v2 H! C
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," p! f9 r5 S8 C% T! E  z! {$ Y
).run()/ Z) z  ^. Q* N/ W
# return None . i* h  m9 B* t7 q7 ^
% ~; ^8 L3 d! h6 U& ?
第六种玩法:爬虫网页保存# Y3 r3 {" I4 ~- W" e
听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
: T( i* J" L' |# F$ E  I6 N
3 M$ S3 l: Z) v6 W特点:
: p- ~2 L& Z' ^, G* F! ]持续输出断续笔记。# K4 d8 c# w3 n0 k6 Y4 A% n& L; m
将此次爬虫的 url 地址保存到一个文本文档内部。7 b1 q5 B( Q/ S7 q+ h  c: v# c
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。4 z! e3 Z) z2 S

  P! f0 Y* a4 ]% m! L8 t$ {. F7 e6 y缺点:5 c' z! X. D& p" Q, z
读取内容不单一。( H. I* A0 l  e& X* R
导致下次爬虫无法正确读取上次爬虫留下的痕迹。
/ X  X5 C* @7 c6 w8 |- n
# n  }7 f: g- H- v7 B' j:return url_file
8 B! c) P7 |# a
( N; i0 P- `; u& e4 Yrequest.parse(
0 i/ H7 ]& m8 b    url='https://www.douban.com/group/explore',$ n. q. D5 l" K% t. e% R9 _
    type_url='text',, S9 E* \" S& g* z# Z: p2 l
    #login='taobao',, \7 R7 P6 C: a; e
    Parsing = 'xpath',
7 A/ U" g' M! [6 s2 K    label = {! |+ }& f; o! u# `
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
- y# W+ s! z' n- b& r8 A( P        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
' c$ |9 |& z. x; L( a0 J3 k: x        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ g0 _+ T+ w; e2 f
        },0 W: B8 D& e  E% m  |$ Q/ f
    write='result.pkl',
9 e8 j4 m' x$ g# Z  O    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
4 ^, x# A2 A: Y* h9 b4 G9 y2 p    # 第一个参数为是否需要断续笔记。
' j4 E  X( \; @$ m6 _3 q; t    # 第二个参数为断续笔记保存位置。
3 {# ^5 }0 w  C    page=[True,'url_page.txt']; j$ u; d& Q# g2 D; q1 h
).run()  Y6 b0 g. n' f
# return url_file
/ |, ~+ q, ^1 n. z4 Q3 }0 ^2 j: _1 M7 z8 `; G2 a
第七种玩法:简单数据清洗( E2 y1 y' X/ y' y9 n
数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
* |3 P; c- p* j" C* P- k: `- Z4 t1 O' H- o8 k# q6 A
特点:
( |( M$ a7 H0 ~% c* H; _本人曾写过一个底层数据清洗。
9 i0 D2 Z* B( ~+ H0 B1 o能将列表格式数据进行归分清洗。
( W- o: t- Y# P6 f! \主要内容请参考另一篇文章
* ?7 d: `  @. `: `! J如下连接:数据清洗
& p" t: F$ G+ y; z. E, A) F3 B! m+ l
, U5 L+ I$ @1 _# r, N缺点:
4 L3 F7 V4 W1 [1 n6 `  _, K数据清洗格式简单。
! u8 E4 C6 p! L4 o数据清洗内容单一。  m9 u' F/ [0 x" j% b" l' F: f
无法完全做到绝对清洗。
4 F8 F4 N1 w' [2 ?1 F" D# T! I2 i/ g有待改善。- [2 h( g- Z/ K0 J9 y

) l  _! H; k# c( S0 Z0 K. G, O7 ?:return keyword_list, value_list
! g3 u- L+ |9 [* V. ~* M3 Q1 N' J1 C+ q, E  q8 C6 L
request.parse(9 ?, o, a7 q" e8 V% ]& b( A$ D
    url='https://www.douban.com/group/explore'," o- {! N- |1 Y8 |4 c" }9 K
    Parsing = 'xpath',
* j8 [5 B9 B* d  X9 F% H    label = {
, x1 M5 v* W- t' ~8 V4 H- B) K        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],1 [8 W! N, p2 s9 }6 x  I" i$ l* o# P
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  ?9 T+ w" U# ]  b2 \
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]' O/ \* P. ~. V9 W
        },# f1 q8 I* n6 g9 y4 a
    write='result.pkl',- @" G4 q$ Z0 k6 T
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
' B& u6 A! d/ Y' Y/ i& X: t# e    page=[True,'url_page.txt'],, \" ]8 i) @4 v, E3 j* h
    # bool类型,默认不清洗
# |& A# M& `8 K3 k- d* |' P  O    clean=True( X, j9 @( [: N5 H0 m( u
).run()
/ d' I- e1 _! [" D" D; I, N5 @! u1 k2 s: L% F4 d4 M
第八种玩法:爬虫存入数据库
9 V* i, j5 f/ @, |* v$ m0 J, E存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
2 {# J) k+ J8 ]' n( G1 e" F9 @* K$ ^2 N, H" y! Y& A( I
特点:  ?8 f3 j1 a3 D9 |+ C+ R2 C
信息存入MySQL数据库。
& M  C  }2 U' G0 [& U: D* F  A可连接docker远程数据库。' W7 {$ B' z, V& r0 I& h
数据库的库名可以不存在。
* J3 |8 A6 \1 r( w1 {数据库的表名可以不存在。8 U3 Y7 ?0 E( N' m. j
根据之前传入字典键与值参数判断表类型。
. J+ G+ d) O5 j' q' q; ]5 |自由建立数据表传入信息。2 p; F' s8 g: M, E# Q" V

8 U: H. Y: R, t$ B  w7 N缺点:3 I4 m  H9 Z3 P' Z. s; z6 Q
仅支持MySQL数据库。
. ^1 ?7 n& I2 H" z+ l0 y( W" M! M& \; d, E
:return SQL' u1 Y. B! h6 D( m% ]  a/ q
; M* I+ @5 c. O9 U" u
request.parse(
8 a5 t0 H) G! B, k# H+ R, u6 ?    url='https://www.douban.com/group/explore',- G8 J$ _* E6 B1 @) {# \2 B2 k
    Parsing = 'xpath',9 l2 I4 k1 m4 F/ ?5 G
    label = {
: K; ?: ^" S9 G+ Q$ ^4 t        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. a7 b4 M4 f( w5 J# R; b* h
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 y) N: ?3 b9 h$ N
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 T7 r" v9 v" v. X0 i7 ?/ S
        },7 b9 a. k9 D, [( B) S9 i
    write='result.pkl',
& I! i) W, x# `2 ?3 X/ o    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
( v& X: D% ^# Z: {( P' ^( h# N: N% V    page=[True,'url_page.txt'],
+ E* H  g, a( i2 C# |0 ~    clean=True,
( v5 p5 V; i- [/ @. p    # 字典格式,3 K% W& v4 p* q3 i
    # host可有可无,默认localhost
$ j# k3 l0 S# t: h4 U  z    # post可有可无,默认3306
- K2 j9 l3 `% ?  I    # user可有可无,默认root" x0 M! n$ _) ?' z3 Q
    # password必要参数,数据库连接密码
! l: F0 z. T; d4 w8 L* n$ J    # db必要参数,数据库即将存入的库名
8 x& c0 d" ~% E( H    # table必要参数,数据库即将存入的表名/ B' h( K1 u' h6 L3 Z( n3 H* ^
    write_SQL={
% ~( g8 Y  d$ ^: m        'host':'localhost',; i6 c) C! q. W7 y; _" o% c
        'post':'3306'," u, I& U+ ~; R7 ^/ w
        'user':'root',/ `/ i0 V( a4 p! A! y
        'password':'123456',
! ~% ?% h! z& v" ?        'db':'example',
+ s, ]" v4 i) E5 E: H        'table':'example'
# K; k- K5 r- j- t        }
+ a7 Y! {& a7 O) h4 d: {9 Z    ).run()$ k  `7 h" k9 v: X# p# U; W

5 A' _* M2 Y3 @+ @3 D第九种玩法:重新启动爬虫+ r) B$ J6 H" Y- q
爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。; i  X6 e. ^. p% L

2 w4 `9 \1 V0 s特点:
3 @* e/ P, u, M检测报错重新启动爬虫
0 H; t( H, c% S, i6 {3 v# m/ b无需手动处理错误信息
! ]# z/ A3 {5 K! k4 A5 M: ^
2 q8 y3 c' m" P4 o缺点:
# ^  H1 I1 x( b8 l5 z无法收集子线程错误。" O5 w! W' o/ {5 A; G

: Z* E5 x9 F7 x8 o:return None
3 z+ K; o# K0 Y9 h/ D, D! f
3 {* y& C- H6 k% mrequest.parse(+ r8 h2 ~, t- A; P
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
  @' V/ ~7 _/ z- U% ^, ~- j; k        #login="taobao",
8 r, T" A8 M" H6 h        type_url = "text",4 L' U; o0 n1 j
        Parsing = 'xpath',
& J1 v: O" O0 x( l! o1 t, e; F        label = {
$ U/ s3 V6 v) W4 k2 ^" t- W            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
6 s5 Z! }# }# n* u            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],& g8 `) {% N+ l5 P
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
+ ?+ F$ C6 m% K+ @; L! {            },; n; E  v! U6 j
        write='result.txt',) f) J. @+ a2 ?+ [. D* [
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
% k3 z; @4 I! ?        page=[True,"now_url.txt"],
% \# r2 Z, E+ E8 K- ?+ R- w        # texting 参数为是否启用连续爬虫# S1 B7 b8 a" P3 n5 b" H4 E
        # 爬虫程序异常报错后重新启动爬虫
( r, Y$ N9 n9 ]- z( z        texting=True,- d2 z0 }0 Q3 d2 ~$ I$ s
        ###0 [$ C! x+ l/ S" N; C2 s
        write_SQL={
8 j8 x$ X" Z% j' T# e, P2 W+ Q% q            'host':'localhost',
2 S5 H; Y& M0 I1 m            'post':'3306',9 K7 A5 e" g# N  J% p9 G
            'user':'root',
% i( `3 B/ N% @0 T* s            'password':'123456',! W3 }7 Z, o) z
            'db':'example',7 g1 x% P2 R% y. K; L/ d
            'table':'example'
) D% U# h: m7 w* P2 C, o            }2 h2 ]6 b. j8 j, y
).run()
$ d+ _( G+ Y8 h  N) F% p- y2 D! I# B' t
第十种玩法:多线程爬虫
7 k4 D. S: E3 g8 s. c. |+ d, `特点:! F  P# g# o) a0 F# z" q% R4 y
爬虫速度加快,
/ I0 Z5 D% M! ~" d. O更好的利用了线程。' X" p2 h+ H6 ?# p; Q: i2 r

0 h% @& r# H4 m$ S: A4 N5 q/ h" N. t缺点:暂无8 s2 m/ t( p. |4 e4 V3 T4 Q

4 n( y( v6 B- A# n" D/ ~/ ?:return None
! A: `# O0 |) B
; E- ~' |* u$ O$ I: lrequest.parse(  S& b, L! j8 g+ ^
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
# ^% Y; i- b# I1 ]' y        #login="taobao",* M* e. N8 y; S1 C* R) Q
        type_url = "text",& q& M5 x4 N" O: J+ W
        Parsing = 'xpath',
; U: M* y9 s9 Z" m8 R: ?) w1 E        label = {: {' w$ M) [/ [
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
7 e; X" X0 X8 {            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
$ B% Z+ ^$ d% j/ V( P            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]3 p+ s" J) b2 j
            },3 g8 h; f: x, N* t( F
        write='result.txt',' ~$ }/ }% ?5 p7 v
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& l/ N. I* M' F" {$ S
        page=[True,"now_url.txt"],7 e# h: x: l0 ~# b/ _
        #clean=True,
" L. N' G) L2 C  X        texting=True,
9 o' C5 ~0 _" I! p% S) \" {% v% h        # status="threads" 启用多线程爬虫
4 e3 F5 ]8 d6 E- ^: Y        # Thread_num 为线程数目,默认为1 单线程; {( m0 e& c0 f( K. ^# V
        status="threads",
5 j! D, j+ I6 g3 |6 m& m        Thread_num=3,
1 R7 N7 f) u/ a        ###
$ |8 `$ A' s% c        write_SQL={
& E' I5 Y/ e+ q$ @( L3 {" V            'host':'localhost',
( F  j: H" U. M# z7 w: d            'post':'3306',7 i  z8 u! N1 y) |" z; m- o# @
            'user':'root',. Y6 b" K' v( l9 l2 X1 G
            'password':'123456',1 C) H/ a0 J; [9 ~) Z+ C
            'db':'example',1 N2 |. F# b* f; h+ J
            'table':'example'  o) I! S# V$ z0 K' F% R0 a
            }6 ~5 h% X7 e& U$ q
).run()! [, T' L$ b; g/ B

  `; p+ V8 O) f6 G第十一种玩法:多进程爬虫" U1 F, n$ Z( P, E7 w
特点:* k0 v! W/ X+ k, {+ U1 ^
爬虫速度加快,
8 p2 d& E+ E' T9 z更好的利用了进程。
2 z) j5 B/ w: |. M# ^  U2 R: M7 K3 L6 c
缺点:暂无
6 a, L" F5 b# Z! J" q% n( D8 ^* T7 T8 }/ b) ^
:return None
8 i" Q* w( @# a* W( [% s4 x( ]: L- D8 A" t+ x( q" j/ q+ N; L
from simple_crawl import request& w3 f& r/ [0 D3 j$ W% j
request.parse(
" K$ k" ~4 p" V+ Q+ z5 |1 N        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
# q3 g/ C2 f. m4 Y# ^        #login="taobao",4 `! N  s: o- K" E
        type_url = "text",
' r; `; L$ j) U6 L: Q; s        Parsing = 'xpath',; k  N  p) e7 J) M) P
        label = {5 `# f! \1 M4 g6 Z- P5 M
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
5 r/ Z/ y  d3 g/ C7 U+ c            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],& n9 d6 L3 n6 j  E5 n
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
0 I! ]" a7 X' U$ ~! b; x            }," f7 y: j2 M/ T. O
        write='result.txt',
1 _: o$ N2 o- R% E% c8 Q        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
; x6 ?* B7 h7 A, F- n; P6 ]        page=[True,"now_url.txt"],7 X+ n$ V+ w1 [8 p& Z# D; ~2 L2 U
        #clean=True,+ G: C+ i8 K( w4 U
        texting=True,0 c6 r( p8 s8 I8 F3 Q- P
        # status="multiprocessing" 启用多进程爬虫
1 W( j/ P* Y; o1 `: N" T( D        # cpu_count 为启动代码核心数,默认为系统核数一半
. _& q- X! b5 w) H        status="multiprocessing",) ]4 c; g# k+ F! x& j5 v
        cpu_count=2,, b) H5 W- N! v& y7 v4 }
        ###0 J! P' \% l0 Z5 }0 p% J8 `0 C
        write_SQL={
' F! ~- M/ {- o! e            'host':'localhost',; O( P; [2 O) q  S( v
            'post':'3306',
/ H& s3 b- O# E$ k; G( ]            'user':'root',
2 G& N" ~: E. u8 Y            'password':'123456',
5 t/ U6 l$ ~% ]' o$ P% _3 `            'db':'example',
  l7 O+ B" M% o6 d            'table':'example'' `/ y* J* {% d
            }6 g/ k) B' t+ m: W
).run()
5 R- r; \& v* @4 [
# x# b2 S, {" V' @5 G5 E4 {第十二种玩法:异步多线程爬虫% V6 J3 g8 j" b" d$ t
特点:
* V6 D; j9 B6 i) @5 {! j爬虫速度加快,
0 G' n, u: W2 t4 t0 S异步使得爬虫无等待时间,+ D, |6 y) U/ ~3 N+ Y$ |% m
同时使用多线程速度明显加快。1 q! c# ]! c3 |' h7 e. u; R  d& ~

% a& a, p( L$ b9 k+ K8 s* C  H缺点:暂无& W- w& w9 f( c6 m% }
6 U; y: D7 F) l0 s, V
:return None
5 _( K  N3 `! @8 T5 [
$ J. F3 b" _1 n2 C  y+ I  \1 @from simple_crawl import request( e( x  l0 N* t# j* @. j
request.parse(5 \4 V4 V8 o( |$ {2 f* f* s: m
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* V4 I1 y9 F$ I
        #login="taobao",' w0 l! L: d* K7 v
        type_url = "text",. V) L/ _0 _6 G1 o8 W
        Parsing = 'xpath'," L4 [  o9 h5 |1 _# F
        label = {6 U! R" |; E6 l6 t
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 N$ \/ T/ J4 W! \
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],  L: ?6 p! s! c& n2 _; j
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ [+ D$ R2 s2 j
            },- i5 Y7 v# {% l
        write='result.txt',
1 q1 H! P- C9 h' d3 P8 J        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
$ b2 \& W1 ]. ]3 Q, @5 r        page=[True,"now_url.txt"],$ d# i6 y4 I$ `' m
        #clean=True,
/ g; \  Q  ^- L; e6 Z8 d8 o9 \) _        texting=True,5 b( |( O0 \8 j* B
        # sem 参数为异步引擎数目,默认为58 R# w* h+ {  c! K( n8 @
        # 其他参数同上3 B: U; i0 c# H0 M' Z; p
        status="aiohttp",
' P2 u7 H- Q' H, l* T        Thread_num=3,
5 v7 a$ H0 R7 i$ r( m1 p        sem=5,0 [! E' Q! U. }( O2 }! k3 M
        ###8 R8 W. J; u" r2 {: Y0 m1 H! C
        write_SQL={  L1 ^& P2 Y% v) ~  ]8 W- S% N& s! d
            'host':'localhost',
/ J# H9 ^1 v$ B; k            'post':'3306',
( L" v8 Q: x$ c            'user':'root',
9 k7 J0 M: ~5 R            'password':'123456',
( x: x* W1 t6 ~! o5 a* F$ Q% |            'db':'example',
' z6 V' b, h* X  k            'table':'example'! z4 E1 L" b$ d3 }
            }
% V9 Y4 |7 k  s  ^).run()' _) h8 I- M( M
* Y# ~' C* V2 M! p1 J# H7 x
第十三种玩法:异步多进程爬虫% E- _  j; c. k7 s6 W
特点:
6 C0 r# ~0 J8 S7 Y+ }爬虫速度加快,
8 `# C0 N$ G' t异步使得爬虫无等待时间,
9 x/ A' L, p8 v3 {同时使用多进程速度明显加快。6 L+ G3 F8 O7 V. }" j" I
3 ]' B/ q! k5 _/ a; p
缺点:暂无
- P3 t2 u( g7 L- T
5 i9 K: d5 l6 o# `+ l:return None+ b- q9 ^" W- H( J' x% m$ h

$ `: T% E* F+ t- k$ k  y- T* n, Zfrom simple_crawl import request
2 J; @/ F' i' p* Z* c0 Erequest.parse(
+ v+ `& a7 ~! v3 l* t        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],  S/ p" y4 _1 n6 f: t
        #login="taobao",' ^# ^" Y* i2 s7 y
        type_url = "text",) J+ _4 Y7 b7 p0 i4 V/ Q1 i
        Parsing = 'xpath'," m: z$ `# s/ c; a8 F+ S
        label = {) j7 @" u5 y. f
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( _4 |% c& q1 ^9 I& A& D+ z4 q
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
8 h/ f* Y; p* A- v3 |% F& \7 q8 F            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 ?0 e0 X. V% x6 |/ J+ K. c9 g2 l
            },! g: d$ z9 P  g, T- e6 O0 _
        write='result.txt',
1 ^, e& D! _1 g" Y) N        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',3 u8 p* ^2 L! c
        page=[True,"now_url.txt"],) c) V% e; k: b
        #clean=True,
1 t0 }6 v, I4 [& F        texting=True,, U, c/ u7 d- M
        # 参数如上
8 y4 U* K( Y# {8 s+ ~, {: A- \        status="between",  B5 C  L$ |9 @& h, }0 D$ |
        cpu_count=1,
$ k. W/ X" I: j$ y) P        sem=5,
3 D* X0 ?7 A% E4 g4 M" L, g        ###
; N: Z  F/ [1 }& k2 t        write_SQL={/ n; k" k: B1 s
            'host':'localhost',
4 ~$ Q- x$ ^6 q6 M. K            'post':'3306',0 K+ y' A, N4 z6 B% r& m" l
            'user':'root',
/ p$ {2 t& S5 q* ~6 O# S* j            'password':'123456',. x5 d: Q8 f( _' P9 `+ V
            'db':'example',( l8 S5 W+ N& D  b3 ~1 C9 a
            'table':'example'
3 {: q5 f6 r% ]            }/ ^) G' i* K3 ]/ j
).run()3 [/ f# \, W4 h% q: v2 K
8 O% N3 g9 d' P3 ]/ @! }9 Z( d; _

4 `- Y8 c+ s* g, r功能介绍完毕🤞* O4 V' t- k; u/ G& C4 d& ^- q
最后还是希望你们能给我点一波小小的关注。
! z+ |+ l& g4 ~7 x; T) b3 H/ k奉上自己诚挚的爱心💖5 |# p& l' l, ~. v% J* |
————————————————/ ?' P* K; v2 L0 N
版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' J! W% W" z; W1 u$ ]
原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
% Z2 @$ v) Z" J7 [+ h: u9 s+ r& P- L) {% z: e

* `% X8 h' \$ G7 Z
作者: 738391227    时间: 2022-2-19 15:34
66666666666666666666666666666
1 W2 Y( N4 \$ _9 N1 s; @! c




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5