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