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