- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55526 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17609
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 447
- 主题
- 326
- 精华
- 1
- 分享
- 0
- 好友
- 79
TA的每日心情 | 慵懒 2020-7-12 09:52 |
|---|
签到天数: 116 天 [LV.6]常住居民II 管理员
 群组: 2018教师培训(呼和浩 群组: 2017-05-04 量化投资实 群组: 2017“草原杯”夏令营 群组: 2018美赛冲刺培训 群组: 2017 田老师国赛冲刺课 |
仅需一行代码写爬虫–simple_crawl5 r/ T' \) d: B: i. J3 e6 X) M
simple_crawl6 x- u4 r$ m% S% z1 U- I
仅需一行代码即可达到爬虫效果8 {' [+ C2 `; I0 g A: j
项目地址(欢迎star):https://github.com/Amiee-well/crawl9 g, T/ c* [8 S! L: L
使用方法: x2 U5 e3 J7 C' T# G5 S" y
pip install simple_crawl
3 f, y3 w1 H4 |2 I( U q: Q+ t+ t5 k z2 M _3 ~5 U
### 以下源代码为简单介绍,详细功能介绍再源代码之下
( _6 M# e9 h H: A! `- cfrom simple_crawl import request
! p" }# {3 E/ r5 Urequest.parse(+ Q8 Y- ~# r5 F& y; q' ?4 V9 D& S
# status 参数为运行状态,支持单线程多线程多进程协程以及联合+ D, r" @/ B: o9 F- Y# K0 h
status="aiohttp",
" `; e1 q/ y2 V' E3 t7 a1 \/ O) \ # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
1 u2 F! d+ \$ v# R% j0 y+ T url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 \0 a" V3 G' n' ?3 c
# login 参数为获取登陆信息,如淘宝等网址需要登陆信息* J+ ]) j' l4 Z {" Z
#login="taobao",8 t% K- n g" |7 Q# x# x8 N- [
# type_url 参数为返回源代码格式,支持text和json,默认返回text
2 j# _) [; T/ b; G& k type_url = "text",
+ U, I$ V/ s' b% z # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
}( D, }5 M" S0 \ Parsing = 'xpath',9 G) B; g! N: O8 [7 Y
# label 参数为爬虫解析过程,字典格式,详情见下方9 J5 `. b3 q* _% c" Y2 i7 x
label = {
e3 g ^- ~3 v% I9 N- R 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 G1 y: Z6 R3 T9 d# V
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
# v, w! d/ |" _* T; ~ 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]) r1 I; h0 S2 H1 R* p. e% v: b
},
/ _: G) P' W, O: _, L # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱1 I8 d2 y! b6 c9 a2 N0 v
write='result.txt',
) s+ r9 q6 E ]* b; [ # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
2 O% C& M4 h6 r next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',; L# J# G& n/ q) A1 O
# page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
/ \, y( ~1 |3 D page=[True,"now_url.txt"],
* ?- W, Y! I: ?' T: { # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息& \+ @9 ^& N8 ] W% Q+ o3 h9 W8 b
#clean=True, x3 B' h2 s, B9 m& I
# texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序+ O: Y6 q- g& a0 S) T* h
texting=True,. L; I7 u- c6 S! c2 F# \. \
# Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态* `9 o6 t* n7 @0 [
Thread_num=3,
3 p8 |7 g* N2 Z, X c2 W. Q # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
- T& _- t( O$ v B" H: y% W3 r cpu_count=1,- U# Z" Z* q% ]* b' C
# sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
/ l! o! y3 B$ ?1 W9 M6 t; ^1 Q4 A sem=5,' Q2 i, \" `. |) l
# write_SQL 为是否写入数据库,默认否! C' V8 ?* s$ W8 d ?
# host 参数默认localhost+ C) Y- `- h" t. n0 P" ?. N. a- t
# post 参数默认3306) a) `5 R0 S, Y
# user 参数默认root& d+ Y! D+ r: a4 y/ w8 r
# password 参数必填,必须正确' X8 W# q9 |% f8 u
# db 参数为即将存入的数据库名,若不存在自动创建
) A. f9 v3 h+ C) b( Y% a- Q # table 参数为即将存入的数据表名,若不存在自动创建( a+ o! t5 D2 O4 k9 c
write_SQL={( C8 f9 ^3 K5 E8 [9 I
'host':'localhost',
5 ]$ D% T) B0 A9 R( ~ 'post':'3306',
/ y; j! B! j1 O7 q1 [ 'user':'root',
5 c8 w* r0 |2 \) m. u0 P 'password':'123456',
6 z2 A2 c9 b) N% j/ n* k% [ 'db':'example',
8 P# h- f1 g4 H/ |" U1 P6 k 'table':'example'
( v) @. T. h; l1 V) A' M0 H+ ] }' X# R# O! X0 {5 s$ H
).run()
2 C9 N% g3 [/ C2 O; o1 G$ b* S/ f" x9 @. C
介绍一下crawl参数设置:0 |4 ?6 ^$ `: o+ ]0 T; S7 a
; A; G1 `3 {; ~/ E'''
* ~* {+ Z% I5 X0 }2 X单行代码爬虫程序执行
' {2 z3 [" o7 |! g) ~9 U3 @( a:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档; R t& g8 M* @ f- t
:param url:即将请求的url地址,仅支持get请求: V0 }" a4 @, L( M
:param type_url:请求url后返回格式,支持text和json格式返回
9 U# C, ?* o0 S* b. x6 S2 h& _:param Thread_num:即将启动多线程个数,默认为1单线程
4 E" i/ W; l3 {. x2 v5 r:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
1 ]- ?0 f: q a$ Y. i }- A:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
4 y9 p$ y* P7 A. ~3 b) E% G8 Q:param login:模拟网站登陆,保存登陆信息0 P* U2 @2 R% N/ Z% l! w+ V: Z
:param Parsing:爬虫方式,支持re、xpath以及bs4方法( W- F" J; s) k
:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,7 h) I1 l$ G% u: C
多次报错结束程序,默认否: ] G! ~3 k, E" K2 L# c; J
:param label:选择器内容,字典格式保存,
9 I) J! o5 M1 i' U* r 字典值为列表格式,第一个参数为选择器,第二个参数为转换类型. M1 U* V! s6 V7 `% I
第一个参数必填,第二个参数默认str类型
, d( X; u+ {" ?/ K; K+ M:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否3 }8 ]7 g, v7 k$ `: ~
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
+ L+ ]: d# M2 R! u:param page:是否选择断续笔记接手下次爬虫处理,默认否4 {: C t- y# y
:param clean:是否进行简单类型数据清洗,默认否5 _, G8 g& N2 Q+ v& h
:param write_sql:是否写入数据库,默认否' A& b* T# S* o7 @* W6 B& F- h6 t2 i3 ?
'host'默认为'localhost','post'默认'3306','user'默认'root',
- n5 _3 O0 Q& @' }) l+ j3 V2 j 'password':'密码','db':'数据库','table':'数据表',
/ O% \; J& [9 ]/ V0 L( b( o8 l 检测库是否存在,若不存在则创建,若存在则直接插入,8 y9 u) o. j2 v+ A
检测表是否存在,若不存在则创建,若存在则直接插入) q; n4 L% k5 N) n! b6 m
:return True5 m. [7 D6 x# _6 w8 r' h& L9 v
'''7 N. F+ g5 ]4 q
介绍玩法! @6 z" w& |* B
接下来介绍的均为调用第三方库的情况下运行:
9 W4 j5 @0 }# d% x9 h
: G5 a0 H% p; H: `/ Sfrom simple_crawl import request
1 W$ R( C3 t* D& W! V3 @" N0 O第一种玩法:输出源代码1 a/ x! o* n/ h/ q
调用requests库进行源代码请求。
: J" m8 S \: y4 Z7 A5 {+ x/ o# z4 M, |9 t- o1 G- R- t! N9 C
特点:0 ^$ }2 h& F2 I$ U0 c
请求失败则调用ip池处理重新请求访问,
% \. w& D, r+ M0 D; }出现五次失败默认网址输入错误。+ f) L& U6 G- J5 s: Y' n
支持text以及json字符串返回。默认text。- X( Q+ V: `6 ^5 N
3 m r# G# ~: l& q% a5 p% \缺点:
9 L$ L. L4 L9 W, ~) u8 I: `( e( O暂时只能进行get请求,不支持post访问
( |0 ~9 [- a, }. w- P4 z5 N+ N6 k) H F1 c0 ]" i* [" l/ A
:return text or json
. u$ B, v k* R& Z- g" z8 [7 u* c9 F- k! f7 d, X7 e0 e
request.parse(, z* `5 h9 o+ u" j8 v5 ?2 T( U5 B
url = "https://www.douban.com/group/explore",! i. z# }( z5 C: @( q' }: b7 h
type_url = "text"
8 w, n: X' R6 u/ ` I4 n1 G: {).run()% d5 m6 ~% O5 A5 G: X4 g
# return text6 u& C$ B" [0 O k; \
5 Q% u' i5 h$ m/ F: h6 A U
第二种玩法:模拟网站登陆并保存信息4 p) j E# t7 s, ]$ G; i, h! \' o
调用DecryptLogin库请求登陆访问。/ F5 C2 A7 q) [8 K# I
# K. T# W2 I3 @2 i! D* S$ S5 e% ]ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
$ R* D7 n& ?. q4 J在此放出文档地址
# x: e3 J% Z& ~: h1 NDecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
- y8 d$ z& _% V; l# I7 H2 T
# H, v" _$ R* V2 C) e, D7 m特点:
/ R$ y% }# i* g F1 V' X0 C: b/ @将DecryptLogin库中二维码继承到此库(非二次开发)
/ V0 g$ q, @6 B6 C5 D0 A L0 V支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)* E1 m: ?* }& n9 E
保存session.pkl信息到本地方便下次登陆运行0 C2 V% n$ y# |& a- X* c9 L* y4 ?( U9 z
& Z: [' e5 G y缺点:- V9 [- f0 J6 { A6 c$ g- M! v( V* F
session.pkl登陆信息过时无法自动删除。
/ z+ a: J$ D* `1 P, |& l. Y" x导致下次登陆疑似cookie无法正常登陆。$ [7 O+ ]$ r% h7 F3 o O, f! n: N+ n1 H
( z2 N( y" r9 q1 \* t:return session. J; n& K$ q6 o
& \3 d0 C+ S0 t! I: R
request.parse(' R1 p1 @# B/ w% w# ?, Z
# 臭不要脸的推广一下我的店铺/ L5 G, @; J a: _" v( b A0 t& O
url="https://shop574805287.taobao.com/",
2 S g0 L0 u: H3 G login="taobao"
m6 K7 A% O& n8 k8 ~).run()* o' z+ V; i0 B9 o: S& e6 _) b
# return text
. |5 {% `, U' {3 m9 X% c' G- X- b9 j$ h# t: R; C' l3 G m
第三种玩法:爬取网站信息
9 s" f; i; \5 w* A( _9 E爬虫库自然少不了爬虫的过程7 n; l7 T( f0 v9 L
( |& q8 C) O- @5 h9 D6 {
特点:
3 I' p& q- h! P& ^支持re库,xpath解析以及bs4选择器。* T! g& M0 W: o
爬取方法为字典格式。单方面输出。: {) y2 z+ N0 t! u3 n. b- h
字典键为保存的字段名称。
8 R) a9 v6 L6 R9 ]9 p$ H5 E) |5 C字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
L" \6 c6 [% Z+ i6 ]2 C! W$ M
! r3 H% B9 E2 O3 j8 Z缺点:暂无(等待小伙伴们发现)6 |2 A; E7 T' P7 n6 J" q
1 E9 ~" ^ `% W! P; Y* G, k
:return reptile_results
1 [1 y8 f" w K) L; E9 E
1 J, R6 D8 x: {5 P' i5 Nrequest.parse(3 I. m9 g9 y6 p8 J/ T$ ~7 M7 m
url='https://www.douban.com/group/explore',
S2 s! r: O, F8 g+ e # 字符串格式,选择器方法。
4 \- O( F& b* z( m. R+ \ Parsing = 'xpath',
7 j# @& T2 c$ `! y: R5 s # 字典格式,参数如上。8 q7 Y. c, O# ~) t1 p$ j
label = {5 O2 \* F" ], \
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
& e$ S6 f- Y2 h 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% T& @9 j! X/ S% B& r
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ T! G6 U5 j7 X- g$ n
}
8 e- b- c0 b: x* G).run()" C( @6 w# h/ H' M
# return reptile_results(list): H6 h+ S- {5 f
" T. L) b% h" ]- }1 G& z
第四种玩法:自由保存信息" m) d2 u3 @) t
目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。5 h, G. D1 k+ L/ b' F
l# w4 _4 E! m7 _% T- r# g特点:
# v+ Z3 Y1 W D/ x8 o; B+ h" w1 ]写入文件均为数据格式传入文件。( O5 |; j' d: U
且输入格式规范方便阅读and省事。2 s, G, F3 h4 J8 d8 u+ W; M, I7 E3 m
. i, f( {2 a# _9 ?& l8 y缺点:
. f2 M2 S4 y, t7 D8 e; B- N# U2 }保存格式仅四种,3 P5 q! o, @! ?) B
不方便用户之后读写操作。
! R i4 g ]9 ^: { y- B
: s+ @- F1 Q7 v4 T# M:return file8 M4 j) o s( ^
9 I' p( a3 I8 z
request.parse(
* T0 o) W5 ]1 D5 x/ C url='https://www.douban.com/group/explore',. I3 v: e6 p& }1 p" F' M
Parsing = 'xpath',
5 W @9 { S) X) u label = { c5 k9 a" C5 d
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
: X: L9 R) e" A1 j r0 U* {9 m 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
7 h' u& n; @, x8 ~% [0 w 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 R9 U6 n8 y+ v! `, d* f
},
2 J. Z5 {* @4 Z4 `" W # 字符串格式,具体保存位置填写
7 x; x0 e4 @9 P; `6 Z write='result.pkl'
3 a. i1 h, N$ @& o. l# u).run()& I* a% k; b+ q r+ `0 ]% ]' X8 W
# return file, [ l+ f8 M# K& E' K3 o
- ]( b3 J1 ~6 ~/ Y6 H! o
第五种玩法:读取下一页 url 地址继续爬虫' v6 s0 ^- X; U; [' S
这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~; X4 h. F$ d5 @- h* c
; l# ~9 E- B8 a, A% b$ y n特点:* _' d$ Y* _# e! o
继承之前的Parsing参数选择器选择方法。
% A: E! ]! A; l; F1 Y! w在这里可读取到解析后的下一页 url 网址。
& c5 t H6 l9 p; C# Z t3 e方可继续进行爬虫处理。方便用户使用。. z6 k4 m9 X7 A- `& s' z& `
4 A- |: L- g4 L
缺点:2 w5 u }2 V; r$ {; p+ k N1 a
若爬虫时下一页 url 地址改变,便结束爬虫。: o5 }/ k- L% M0 X# \$ ^
只能爬取所给 url 地址中的信息。2 z$ z5 O0 j: c3 s3 l# v9 A* ?
无法进行某一界面的多个网页爬取返回。+ I9 ~( R I8 Y h
造成访问页面单一流失。
8 |, ~8 E. v7 ]$ v" E+ h6 W5 X" f- E+ V, U8 H
:return None' O+ [ r- m' c( i# N
4 [9 ?+ S3 F: k+ u4 Z& Drequest.parse(3 l9 ^% a) p6 _
url='https://www.douban.com/group/explore',' Z: R! \1 M+ h) n3 W
Parsing = 'xpath',
: ?! Q$ W. |- f3 c8 R label = {
7 d0 i$ C; y* ]: @& A( x9 W) q 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, N n" {4 Y9 E5 P
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],' I) k& L7 d# j& s5 Y& n
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
7 O9 x. E; Y8 X" r0 P },, `$ N @$ Q& z6 V5 Z+ u+ \
write='result.pkl',
! o- q. D* k6 W6 z% u) }8 |# f # 字符串格式,根据Parsing方法继续请求下一页a中href
: E2 ^2 C3 v0 z, ?9 |1 J4 E, F6 M4 r next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
. g8 i/ @2 ~3 s7 t& R) Y).run()
' v3 J9 E. F' O2 Z. S# return None + E& F- z+ f) r$ W: }( D
# W' w) x8 g& V: y, `( c1 |9 t. {6 c
第六种玩法:爬虫网页保存
% V- A; O1 u: u; D听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!# y9 ` c5 C4 L; ?( `4 j
/ C8 `. @" G: ~" A, L3 q
特点:1 C1 c7 J! O/ [, s1 I
持续输出断续笔记。7 j. h5 w* C) p: S8 ~9 p
将此次爬虫的 url 地址保存到一个文本文档内部。# t, k$ P' P3 h
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。9 i4 u: K; h( k/ f* `
/ ?, z1 L. H' b O1 \% S4 ?% Z缺点:8 @0 P7 N c) M" b" j2 T4 X$ p
读取内容不单一。: b% m- V3 a7 ^2 i4 e7 A# z
导致下次爬虫无法正确读取上次爬虫留下的痕迹。8 s4 L0 a: s7 C2 ^2 w1 n4 |
4 d7 m$ y4 }' b3 g. J2 u
:return url_file
4 |* C1 v2 O; m, x4 _, V' O0 Y
2 i7 I. n& h. P; D$ O6 hrequest.parse(- N) d" T8 A0 U3 \5 k8 C" u" { |
url='https://www.douban.com/group/explore',
7 `8 [ J4 n6 |* a8 D: u type_url='text',
, D/ T* l2 S) a( {( f& P #login='taobao',3 S/ J( \7 J* O
Parsing = 'xpath',
6 u& _" P1 L0 w6 a( N6 k; G; \9 I9 L; ^ label = {
! t: x5 C+ F1 r; D' ` 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
) r' [$ F6 t0 y 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
* w; ~1 a; O$ Q 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 [3 d: D/ j0 M, a7 ]! W W$ Q
},' E' p" T3 V. I- i
write='result.pkl',
' I) S! ?' g9 B& _+ I1 `5 N next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
5 G" K/ l( y0 J7 n # 第一个参数为是否需要断续笔记。) `/ S3 k9 G! D- g' b
# 第二个参数为断续笔记保存位置。
0 h( d- C6 |; A page=[True,'url_page.txt']
+ t, w7 u3 `( s, ^3 n) r).run()
4 [* T7 {4 J, \. o% n% k9 Q& v# return url_file
! J. \9 M8 \7 Y8 Z( c2 G
- E! \( m% {6 R$ B6 h第七种玩法:简单数据清洗
- l) i( M' D l( H, d$ h数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。' K" P0 |4 X' s j
& t" h/ o# R: |$ L4 R; x3 O特点:) l0 E- c* B, u+ y2 O ?! t, U0 O7 V
本人曾写过一个底层数据清洗。 v, Z; w' h4 _
能将列表格式数据进行归分清洗。" ~# t- e! F) i- u/ m
主要内容请参考另一篇文章. I+ l" ], v3 z- ~: Z7 o8 T
如下连接:数据清洗0 x( ~" N, v* S1 _
8 W* H- I) V* @) d1 Q2 X缺点:' B; h; L! H g1 E7 A
数据清洗格式简单。
1 @6 ~- S' F# _4 _数据清洗内容单一。
# ^, o- J! \' \: i4 b无法完全做到绝对清洗。1 K# J; @; |' ^+ S0 R/ c
有待改善。8 b3 @0 `* W- q5 m" n/ o
! T t! v( w$ [
:return keyword_list, value_list' b8 D: G2 `' {
# l" h+ W- T7 e3 ?7 \7 Jrequest.parse(
9 [6 z6 }/ b$ Q" a8 \ url='https://www.douban.com/group/explore',
6 P3 L# j7 d2 ?# ^ T. i. I Parsing = 'xpath',7 j* t$ `1 |3 c4 P) j
label = {. {: u) i( b! U$ }
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 M* J9 j2 I4 D1 ]# U% Q
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
9 r2 s5 y0 j; m& f8 o$ \ 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]) Q6 A2 H. p7 W( f# `
},
1 f7 r; T) Q* T write='result.pkl',9 O" S& C5 g# b: D# X7 H0 n
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',4 g8 ^& s% F' M; Z5 s
page=[True,'url_page.txt'],
, \0 p+ R; U7 C& W0 d0 ?7 H # bool类型,默认不清洗
# H3 G s: J @8 `' K clean=True& O0 I1 ]# P/ ~. a* J I
).run()
( [/ o( ]% k; I8 p4 y `% z* T- r! e7 E; U7 H4 K) q! }- A
第八种玩法:爬虫存入数据库) N/ s, j J: J! w& S" }& g0 }
存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
1 j& `8 P- z+ m% b( X2 a9 y& [0 b5 \7 f0 n5 Y8 y3 m* a$ q, }5 v
特点:# c' u( f. j) M3 u& ]4 i
信息存入MySQL数据库。
) x# I: g/ w7 E' U可连接docker远程数据库。( u8 {9 H. u$ A! e
数据库的库名可以不存在。$ U+ k0 z! K, S4 y
数据库的表名可以不存在。
- g% d5 c3 c2 H, P9 d( x" C9 c根据之前传入字典键与值参数判断表类型。3 C5 `4 p( g! D8 ?
自由建立数据表传入信息。4 |) G1 }& L+ e6 H' E
) Z; {5 j1 [ p* [3 d缺点:) |0 |9 }# i+ ]" W/ @, c
仅支持MySQL数据库。/ K/ a$ [2 t. u6 s0 @
9 {+ e; W1 P: X, N1 U/ z:return SQL: N' R! o9 J' Y2 `4 R8 T
( z* Y. ?, W3 Vrequest.parse(2 l& L9 d* }3 n* v
url='https://www.douban.com/group/explore',5 h& k4 y* U4 b- K
Parsing = 'xpath',# |% h, a' S* d/ A- a, T& _3 a
label = {
, ?& P% \% P1 G: e' M8 ? X 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],* ]- ?- _# E {" I" U3 Z" H; [
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 K3 r0 j. P' t8 y" X7 U
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
3 @0 t/ q: n2 Y8 I5 ?+ R0 C },
$ m: j7 R; ?6 _6 ^* `# v write='result.pkl',
. H+ U5 I+ A7 K next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
' i2 t9 |( ?# b! ? page=[True,'url_page.txt'],
+ i- L! P4 |' g clean=True,1 f* u9 B: H4 F/ S
# 字典格式,* S5 u- G4 R# s. i. i
# host可有可无,默认localhost
# h, z. g. u7 P9 m # post可有可无,默认3306
7 C4 [8 j" k& f; j2 Z p # user可有可无,默认root
% z& R8 E9 i0 k* T+ H. @* ]$ w5 | # password必要参数,数据库连接密码
) k! V# @" C. X \6 V # db必要参数,数据库即将存入的库名# A" N1 P3 |+ y, x) z7 f
# table必要参数,数据库即将存入的表名* K+ q' l: V1 m
write_SQL={/ W. Q6 E( Q! Q; p: L+ w& n
'host':'localhost',3 Z5 ^. b# H2 P% _, s
'post':'3306',
) o. z |* P. g2 p 'user':'root',
/ J( G# Q7 e8 {/ ` 'password':'123456',
8 W3 k8 i# Z9 H3 P' I" Z- y/ d9 i 'db':'example',
7 a& S$ c, O( f 'table':'example'
7 B, ]7 N& c+ `5 F }1 m, J3 W3 A$ m
).run(); U2 A4 r2 D. c6 h; [( O
1 L- |, }* z- B! }, [第九种玩法:重新启动爬虫
G2 b5 Y0 y0 J' E6 Y( f爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。" |- B6 V0 k- Y) P. A
, S; W7 {2 V L/ x% b( B, k1 B, O. I! P
特点:! g5 \6 N2 }* X5 G( p1 c0 B
检测报错重新启动爬虫6 |. U6 X$ L# x1 P* p" B! |
无需手动处理错误信息
8 u% G5 ]' f5 |, k3 F( ]3 P$ h0 D0 p# [2 ?
缺点:
8 O: U7 _, A8 o4 m* E4 @" x无法收集子线程错误。
$ b# X* \3 Z0 G( E" d
# Z, @* x' }2 \) `6 m:return None6 E J5 w, u( G/ b
' e8 [' _/ x2 ?5 Z; u4 m
request.parse(0 W1 ^9 M8 G: X. b1 T& p6 H
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
/ K) f1 x+ q2 @) L2 j9 c9 |9 [1 m2 W #login="taobao",
9 T. ?* L z: q3 B1 m# `; z type_url = "text", b: E! a! M0 q1 E1 n# J% k
Parsing = 'xpath',
8 s3 a% h, p' n/ q' U label = {
3 j& o1 a0 {& {) j 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
f( O8 w' d1 S1 d 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],' P& e$ i7 W# E3 O5 v; O; a' [# h
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
3 G! P7 F; n4 H5 [; W1 K: A },# z1 W S& y; I7 @) f! z2 Z
write='result.txt',
: O6 d) K4 n/ {- k% C next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
3 ]: R. F6 d4 Q4 \ page=[True,"now_url.txt"],
/ ~- T+ j$ d* E& o* \' j' y # texting 参数为是否启用连续爬虫5 p5 B! I( ^; i3 V
# 爬虫程序异常报错后重新启动爬虫
1 i9 V2 z. ~6 ~/ z% r& @0 w texting=True,9 E+ \( I+ C4 Q! @ S" J
###3 u1 {3 s: k% X
write_SQL={ K: O, E# c& }* ^+ A) }0 \7 n& w
'host':'localhost',; t0 O; N" _- @9 t1 Q8 }, ]
'post':'3306',
$ e8 [- x4 D- K5 ^: S1 ~ 'user':'root',, h; I: y- u$ ]# Q! ^& T1 G5 a+ s/ b$ x
'password':'123456',
, K8 U8 x8 [& M 'db':'example',
& e$ U: e: v/ w) F2 J8 {; O 'table':'example'
$ {1 N6 o$ U' F5 D9 m& c }: `) k% ?" C2 I
).run()
2 G) h9 o8 e& X* ^ |: i
: a7 l: H. k9 H: w B- R第十种玩法:多线程爬虫7 {+ T' f; L. r0 r( n9 W7 `
特点:9 p+ I0 C- u3 U* r7 d
爬虫速度加快,: w( t r3 ^# V8 l5 ^
更好的利用了线程。
! N6 C% M2 `- e3 T& K1 w' M2 H% {7 t# g2 h) n% ]
缺点:暂无
. b+ j- Q: c0 `/ m1 e2 F& G2 |; k& r4 j, g' O1 ~5 z- [
:return None
" U7 O8 k4 C X
% a+ u+ {2 j2 o- D1 crequest.parse(
3 Y% B$ S" I" R; X" F: ~2 Y url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
* U* E+ q/ g0 R5 X: g$ } #login="taobao",! R4 g2 X" M$ `% s
type_url = "text",) ^$ {6 b; H0 d
Parsing = 'xpath',% X- z' m! L/ V
label = {0 j2 i% e7 ^% A% }% ~- D
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
2 A9 D* c3 a! a7 H% l! r" Q) s 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
5 u' ?2 }/ t+ c3 z. L% l H 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
) i7 A g; h& f0 p },% C; v* a; U9 w" M
write='result.txt',
; x+ g7 O0 V; y1 m) m" W next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
8 ?; @' T7 {, i4 l6 R page=[True,"now_url.txt"],1 f" @8 u' Y2 z* m! g6 p
#clean=True,
2 z! T( H1 v0 ~$ p0 ]9 G4 V texting=True,0 ^, r/ y, `. c
# status="threads" 启用多线程爬虫 A$ D" \& l6 {6 W' g0 ?# ^
# Thread_num 为线程数目,默认为1 单线程. E& u; ]) W# u- M' Y+ U1 J
status="threads",
( g% v9 d- W, y" Z6 X Thread_num=3,& B8 l+ [* d Z ?: K
###1 r. R' _& \% g( n* J
write_SQL={
8 p9 W4 y# s9 Q. ]" ` 'host':'localhost',
% m) `* l4 |7 O8 |* j 'post':'3306',
" k4 c h0 A$ v& q2 L. V 'user':'root',* [4 Y' b( P+ V: `$ o' v# F) ?
'password':'123456',' j$ i$ o A. e/ E$ v% z0 S
'db':'example',8 I$ M( y% V" g2 |
'table':'example'
3 i' i9 \# `( `7 {; r0 x/ R' ~* E- k }. N* Y h$ s3 c+ z! o$ p& P/ ?+ N
).run()0 H' R. N9 S" e! t( y# T4 X0 Q" J
! f) a8 G* v* v0 O h F
第十一种玩法:多进程爬虫8 n5 }+ s! ^/ U* p, J! z( k
特点:
, I( r+ \6 q& o4 N& j0 i- l爬虫速度加快,+ ]5 h$ {3 p! J; j9 Q! M
更好的利用了进程。
+ l5 V8 O6 p) X: E' Z- R
+ g/ D9 [2 v: Y# `" P$ [3 G缺点:暂无 U7 l2 K. `- y5 l N
2 R5 z) F s# _! `0 f; d& b
:return None
/ P- K! ]0 P% K# E/ M
/ b' |8 |6 f I( R3 D, rfrom simple_crawl import request
' k8 E' I3 c- e: X8 Arequest.parse(
: N0 C" v2 k! U9 X% v url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
9 D/ T5 _1 T. e9 l #login="taobao",; O; g7 a ]3 P5 M' H& ^0 n0 f! N
type_url = "text",, a5 j; d$ v) P" q) w
Parsing = 'xpath',& B- {) P1 d d, I' [/ U: `
label = {0 x/ j* Z" D+ k
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
8 Q/ d, n6 W" M" h! O/ b& t- t; i 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* ~. C4 Q1 ]4 ^
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]9 q6 M( F$ l: B o
},
# d2 }; I; B6 P! @8 {/ E write='result.txt',- p7 ~2 F8 D9 H q
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
( A. x1 A. E7 I page=[True,"now_url.txt"],
0 K" p- H8 Q9 D. r% I2 B$ V6 t: b$ D0 W #clean=True,- j' J3 C6 O; J8 E6 l C$ {
texting=True,) d! Q& m1 w; u" b; L- H% ]0 N# u( P
# status="multiprocessing" 启用多进程爬虫
& C( ~# |, X4 F U( U( | # cpu_count 为启动代码核心数,默认为系统核数一半 C3 h6 a2 D4 x) d8 a' e- W1 r
status="multiprocessing",
$ g* ?/ ]) `' {1 a* S9 l0 J cpu_count=2,
4 m; H( n. D: G3 e ###
5 [& W a0 J7 |; ?/ C' r0 _ write_SQL={
6 \( r% t5 H% c+ R* o 'host':'localhost',: h) N4 u3 ~& l' n" i |
'post':'3306',
$ E% y! J. _, \/ K' S, ~ 'user':'root',1 T8 B* O, J1 R9 u
'password':'123456',
8 G# e& C6 j) w% G, g$ a 'db':'example',
4 A0 k8 `( }% F; I* v 'table':'example': a( \, |' |8 `9 ?2 K
}' m% A( P; K" H7 r: A9 Z- \
).run()
" |/ @8 `, n m
0 z8 N# x+ Y$ S. j7 p8 h$ e0 s: A7 c% d第十二种玩法:异步多线程爬虫
/ V1 u7 E+ `' S4 a" Y3 c特点:
5 [; `& G0 F! U& r! k) Y4 ~. K' N爬虫速度加快,3 {; I6 h8 k1 k; R
异步使得爬虫无等待时间,' _, |' J7 R* m. J8 M
同时使用多线程速度明显加快。
9 v3 @. J0 w8 e7 J& ]4 c2 g
2 I" G, _# m7 z' t/ b# I* @缺点:暂无
* r3 |; ]6 B5 T: z$ X& A1 j
- N% W( I& d2 L2 l. ]:return None% i* z% c1 ~; D/ z9 Q! z
; O, p) ^# M) W" }0 E8 o$ j# ?from simple_crawl import request* \4 `, D, n: h! s9 h7 W
request.parse(
7 n$ b' q' P8 U o url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
1 p E1 Q ?* h. d #login="taobao",: Q0 I0 A9 m' s7 R2 T
type_url = "text",
: t* D- V& t) ?8 r& v8 q" R Parsing = 'xpath',
* F5 i- x2 s, U: k; a; R label = {" Q8 @, [. e' @- o+ l+ G6 I
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
6 [# t& L( S+ [8 s 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( t7 O7 n: U8 N2 |7 A
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]) a0 p' [' p5 R/ \" q5 v" {# z8 w
},
4 }' ^8 ^9 A! @+ F9 f( t$ O write='result.txt',
* i+ c0 y, A/ ^* D( T0 Q$ \5 j next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
+ A! r) E6 b3 F$ K! u$ ^ page=[True,"now_url.txt"],
" j, \1 u ?! l& Z #clean=True,
& O8 t. }& I7 `& A0 H$ i texting=True,
% G& d5 m( O0 a! _) w$ u+ a # sem 参数为异步引擎数目,默认为5$ P; W+ W* ^; v& A5 O
# 其他参数同上, W6 z+ T# [( l) H( y6 j
status="aiohttp"," W" w* x0 M2 k
Thread_num=3,2 ~7 l& E( X5 u5 Q5 N' _& w
sem=5,2 d# v' i; K9 a, O
###
2 Y" |: j$ W0 ]; S( \& b* a) m! I write_SQL={
, q4 E) Q' x8 T$ R/ M 'host':'localhost',
$ ?+ M+ D$ a0 Q$ D- ~8 a 'post':'3306',
9 J, |" m9 c: w) b 'user':'root',
% N: s4 @7 G/ { 'password':'123456',
5 @: J' E3 R7 p1 ? ~ 'db':'example',
/ `" F. V8 ]9 C% C) V# r 'table':'example'
* J/ D5 [: E& r }! `: J }" n- m! z3 p" z8 X0 O
).run()' ]7 }8 I1 L) X B' T9 P/ h1 [# g
$ f! `8 T) t3 k/ v4 ?" F" I5 c第十三种玩法:异步多进程爬虫
7 I8 q( X/ ~3 q# M; `特点:9 H7 K8 x; Z" f
爬虫速度加快,4 t' b" K4 }2 l: h9 Q) u
异步使得爬虫无等待时间,
3 ?8 q6 j r5 p1 i& T+ b% n同时使用多进程速度明显加快。
' T5 G- E( R( F0 n: S8 \% s) P% q0 X) a& y0 q4 X3 V* P
缺点:暂无1 O8 K% ?5 N# e2 W6 `3 j0 f3 ~$ ]
0 [6 l$ o% m6 ^3 \, ?- m, _- q3 |
:return None' f7 D' A0 X( w
! s5 Y7 f6 O1 A; A z7 x. @/ Bfrom simple_crawl import request4 o% ~9 |: q: o! j. f
request.parse(
* i/ c4 D1 R3 ^ url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],8 y1 F! X1 y% y) C+ Z+ Y- c' `$ O
#login="taobao",- c8 m' d q% }5 h b
type_url = "text",
& {6 S2 O8 J) |5 R Parsing = 'xpath',
/ E9 p( L! w" S& O x) p1 D3 n9 x: F label = {
" B- z" ^3 n2 U$ A) V9 H9 ? 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. \$ H, k# K1 c6 R
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% c. J. S u& ^, I/ R# @' C
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
" D/ M3 E. y- |6 x: L- W2 g6 \# O },7 m+ s; ^* t0 _+ z1 ^8 }5 m. `. e
write='result.txt',4 @0 m. B# V+ ?% s q7 A
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',5 w0 K, g+ d5 m% ?( W* P, P8 c
page=[True,"now_url.txt"],
. J1 D+ g" a" |2 P+ d2 v #clean=True,
]0 W% W8 i3 |( }+ k! _- H# G$ _* d texting=True,% C1 Q! {/ i* z) k5 z# `+ |
# 参数如上3 f- c8 G$ w3 ]8 q
status="between",$ k' Y( r6 B" x: @" \, [+ T3 X
cpu_count=1,
( x8 U1 B* @/ s, p sem=5,
9 z* ~) H, c* s4 P ###5 F+ h0 @3 J% ?/ t3 f8 f
write_SQL={* ]$ J$ R! p3 I
'host':'localhost',1 L# }- A. {% O+ u
'post':'3306',
$ e% G" X. n) A5 P8 t" x8 M) G% o 'user':'root',4 O0 W- c# T' p% l E
'password':'123456',: h" M9 R5 @' e$ O, g
'db':'example',
5 ~) Z# }) j$ N) V9 l& R, k- `+ r 'table':'example'0 x1 R- l# h# a/ \3 s1 z
}
7 B. s& T& T9 Y2 o+ o5 [).run()
, t. f2 F$ R& _
?! o( e3 }7 _* E1 x6 R
: S/ R0 W5 n( A5 j3 v$ b4 `功能介绍完毕🤞4 `( V ?+ q0 w0 f0 m% h
最后还是希望你们能给我点一波小小的关注。
. |( D, M2 j) O. a+ h6 O3 ~奉上自己诚挚的爱心💖% y5 y! G8 J, m, ?7 l5 N) e8 A! y
————————————————' a' N& |# a1 K* C% p
版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
4 P+ }/ j1 D; G" n' R原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
7 y7 Q6 b6 F' `, r% Z# M+ | l
* p! N8 o- y/ Q& o0 Y* y
5 y' m- d' V8 A( P% l5 g |
zan
|