找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1207|回复: 0

Python + pyspider某小说站的爬虫,入数据库,火车头发布,资...

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
0 x2 C4 |" M' i
  1. #!/usr/bin/env python+ A, i! H; U0 f% ]  v
  2. # -*- encoding: utf-8 -*-
    % p% w( n" u+ {6 {- C9 S% b
  3. # Created on 2019-05-05 21:43:11/ O& |: A- b0 h
  4. # Project: XiaoShuo* E. }  r: o" ~/ H% f1 J2 g$ F9 m2 |
  5. % U2 p5 }- M$ g+ y% S& Y% X3 Z* s
  6. from pyspider.libs.base_handler import ** _( e& _3 O9 U. h/ V
  7. import pymysql
    ) B+ p7 ], x- i, X8 j- K: a" M
  8. import random# ?% M% a9 t; t% Y+ t0 g$ T6 W* N
  9. import datetime: Z# m& m* Z$ ^# }4 B. V
  10. import urllib2,HTMLParser,re1 z  g/ S  f2 x" `1 ^( O
  11. import os
    % G* N$ U# J$ l2 b
  12. import sys
    , P# Q5 m1 ?- q' n2 X5 F
  13. import re$ c5 m  t6 y% z( j- ]
  14. import codecs
    ( ^. r6 a' ?1 z* ~- Z3 g" p# X
  15. import requests
    % H5 E& m/ D' O# F( @. G8 ~* B
  16. import json
    # _( Y1 B* R3 Z: q5 [0 c

  17. 6 ?- Z; N! A: N: Z
  18. class Handler(BaseHandler):
    / S2 S4 C, `7 k/ W2 t
  19.     global Datos5 F9 {# D' l6 o% ^: p8 z
  20.     global P_dir   
    # F- l5 \* d4 D' u7 e& q: P, Z
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    8 N: D$ e3 a3 z: ?" t% E% q
  22.     global Datos
    1 C4 p$ X! \9 C3 G4 o6 E6 ?
  23.     Datos = {}
    7 T& i9 U% {$ Q  _3 u. o
  24.     headers= {/ j* P3 L, z+ `, [, P) c% o
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',' {% K% o/ e* d
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    # }4 w4 w. l/ A  W( O+ {
  27.     'Accept-Language':'zh-CN,zh;q=0.8',. O/ x- D9 U7 Q" d3 Y/ H. }# e7 \% {
  28.     'Cache-Control':'max-age=0',
    - O2 f6 V* ]2 o/ W
  29.     'Connection':'keep-alive',
    3 i& M/ ?  R# N, y4 M3 I
  30.     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'
    $ [! ~# e- R- g* i( E  c. h* L
  31.     }: \: J  P4 y3 u
  32.     crawl_config = {2 S4 R" Z# Y  g  |, F
  33.         'headers' : headers,
    % d# p6 @2 K- p# f, k5 P0 ^/ T
  34.         'timeout' : 300
    ) h6 ^, }: y: Y# i8 P
  35.     }" C* B3 i; d5 A' N# ?
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    & I, n  g6 p: P( m4 x
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    . i$ _/ @% k3 l/ {9 c6 ^! r6 G
  38.         try:1 \. Z# {6 T9 g9 c
  39.             cursor = db.cursor(), X% Z0 a$ O0 H( \# @
  40.             #注意此处字符串的占位符要加双引号"%s"4 G# g  o, H/ J& f5 @
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);$ Y  X9 ?! I+ `
  42. #            print(sql)
    * h4 I+ l# _) D9 J
  43.             cursor.execute(sql)& H6 L  t  t' j4 ]5 l" k( c; O
  44.             1 u; |7 [& i' F" E8 g/ J3 R8 h6 d
  45.             #qid = cursor.lastrowid
      ]% a, r1 r; Z9 j2 E
  46.             #print(qid)
    ! {0 _7 c- j# g. S
  47.             $ x  U3 [: U3 R4 M7 y( a
  48.             db.commit()
    . H8 u: R- o6 A; o* ~
  49.         except Exception as err:
    . L. D; W8 Y/ f( n  @3 F
  50.             print("Error %s for execute sql: %s" % (err, sql))
    " _5 t4 q& T; f/ r2 G
  51.             db.rollback()4 f" D2 q* S1 e/ y! v/ f( V* D* a
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    9 s  O+ n& ]  ~5 r/ D
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")& Z6 v0 {, y* {! b! X* M
  54.         try:4 n. h2 X  @6 U
  55.             cursor = db.cursor()
    : O9 v( R2 j5 ?  r1 B* x
  56.             #注意此处字符串的占位符要加双引号"%s"* a* t1 P! A' `: U0 H( O
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);9 x, P( g9 j/ `
  58. #            print(sql)9 H& F3 W8 s  u" C2 t  p( y
  59.             cursor.execute(sql)
    5 Y! g5 j" b6 K) e& e
  60.             
    : X; B1 \6 M" S+ i
  61.             #qid = cursor.lastrowid
    + p% N& B& l8 E
  62.             #print(qid)0 V) \- i  P% I* j
  63.             2 i8 [1 b& t2 r3 j8 c' p
  64.             db.commit()' `- P4 j. Q3 K6 O
  65.         except Exception as err:
    4 k. B, C/ K  _3 u$ n) C: m& w- |0 O8 ~
  66.             print("Error %s for execute sql: %s" % (err, sql))
    # ~0 d$ Y1 E4 W' C5 r
  67.             db.rollback()
    5 S) q, Y0 C4 D; ~; y4 i
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):& v9 G, P* \  {  f
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ( [" X* V& G4 X0 D) Y1 E5 A
  70.         try:
    : u; P- }5 a0 k- V
  71.             cursor = db.cursor()0 f) r: y! J$ U7 ~
  72.             #注意此处字符串的占位符要加双引号"%s"# u* j# J6 [" G; ^
  73.             sql = ' INSERT INTO BookConte (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) VALUES("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")' % (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date);: E5 D- m$ W' U9 A0 }( F! f& |- j
  74.             print(sql)
    0 ?) ~) h! a6 q  @
  75.             cursor.execute(sql)
    / \* Q$ H) i; v, ^7 ^) I  p
  76.             print(cursor.lastrowid)& f# L/ ^+ z6 \8 j7 d; [$ m% W
  77.             db.commit()
    3 m# C+ T3 M& A( s) z2 z* P: e& q
  78.         except Exception as err:
    4 |, Y2 D+ z; O3 m$ T2 @
  79. #        except:- h% Q& H8 q3 }: m" \& ?& ?
  80. #            print('Failed')
    - y9 d3 H) \( |2 A" Z8 w
  81.             print("Error %s for execute sql: %s" % (err, sql))
    . z! A/ I& k  w4 g; Y$ q' k2 u
  82.             db.rollback()% }) _" T5 x/ O( J% e7 [
  83.         9 p" l; y: e; w- P
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    7 c. n4 W* a! ~0 K( \& R) u
  85.             reload(sys)
    2 b4 d. m6 a6 Z  ^5 \% u0 I
  86.             sys.setdefaultencoding("gbk")+ d+ e: ~8 S7 w1 `
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址; ]6 S1 P9 D4 [( `; V! r
  88.             locoy_data = {  ?$ B5 x3 @$ V1 p
  89.             'my_u':'用户名',   #后台用户名$ N; i& l2 {  R! c1 i& p
  90.             'my_p':'密码',   #后台密码
    0 t$ z! a1 X: b/ U
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),0 c7 j; n. o. ^4 n# {
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),5 S8 B+ c# W* f7 e. {. ?
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    6 L+ q; h( @. k6 Q* y
  94.             'article':BookConte.encode('gbk', 'ignore'),7 V: x) D( b, \( s5 _6 _
  95.             'author':Book_author.encode('gbk', 'ignore'),6 U& X  S* j  S  ?& d5 H4 ~1 f4 B
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    ! g2 X, ^+ I" c" F  S4 J4 [" a
  97.             'thumb':Book_img,
    0 }; n, k! ]! Z, F; F
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    5 B4 T2 K: p0 x  D, C0 |
  99.             'abover':abover.encode('gbk', 'ignore')           . j, G$ `( v( N' Z7 ~
  100.                 }
    9 n) K# e5 Y& I5 f- P4 v
  101.             res = requests.post(locoy_url, data=locoy_data)7 \+ o: n6 _6 q7 E/ i
  102.             print res.text( R! G3 i* n: J2 ~( @
  103.             print res.content
    7 R. t/ I- G1 I( R3 x+ }* |
  104. #            print Dsd
    0 q; t3 B4 Q6 ~+ q  O& q, d
  105.             return res$ [, K( ^" H3 a9 ?; |
  106.    
    % @4 ~: k  ~) ^# E3 h4 b. n* |
  107.     def __init__(self):1 c. l# R6 G9 \: y
  108.         self.base_url1 = 'https://www.****.cc/'+ g8 t! g1 _/ ?; C6 K/ q
  109.         self.base_url2 = '/'" i' M& a: j0 j9 k
  110.         self.CaterId = []
    $ R3 H4 B; D/ R; j" e
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    9 o5 D7 l6 U8 n+ c% c
  112.         self.page_num = 1
    2 S/ k/ w3 u  `" S& [, I( u8 ]
  113.         self.total_num = 200   / x& Y8 }* H  U" i

  114. $ ^" }$ h- t7 Q  t- F6 j
  115.     @every(minutes=8 * 60)
    9 m$ Z8 y+ G: ^: }0 D
  116.     def on_start(self):
    . L- \- p4 K7 l; O' g6 m
  117.         global Cater_Name
    7 L, X- A* l& v# ?; j. |) s
  118.         Cater_Name = []0 b' K; N! ~, f: R# t# X
  119.         while self.page_num <= self.total_num:
    ! |/ ?2 l2 d9 d( K$ F& U# X! U: f
  120.             for self.CaterId in self.CaterIds:
    * f' A- d  ^8 l( L( E6 @8 O& o1 I
  121.                 if self.CaterId  == 'xuanhuan':5 H+ o0 n0 C- A% O
  122.                      Cater_Name = '玄幻'  @5 y  P5 r9 O6 Q  R2 `
  123.                 if self.CaterId  == 'wuxia':
    * J: a" e" T! S& u4 s
  124.                     Cater_Name = '武侠'1 o! I0 o  y9 Q/ k' K5 }9 q
  125.                 if self.CaterId  == 'lishi':. [0 P: _4 |2 v" O/ ~: V
  126.                     Cater_Name = '历史'            $ M3 M6 w* g% R( ~( O  ?- a0 V
  127.                 if self.CaterId  == 'yanqing':
    1 p! ?/ p7 ^: x) O# b
  128.                     Cater_Name = '都市' ! K1 }9 \4 U- B6 S9 B
  129.                 if self.CaterId  == 'nvsheng':! n8 D& i# J( s3 K0 _% @0 Q
  130.                     Cater_Name = '都市' 7 M! U$ e) b* [% w
  131.                 if self.CaterId  == 'kehuan':+ v5 k/ W4 ]. \+ V- v
  132.                     Cater_Name = '科幻' / R6 d# c: K5 n3 O6 q
  133.                 if self.CaterId  == 'kongbu':
    , M" j  W* z  Q) E: n
  134.                     Cater_Name = '游戏'
    + g' o# _$ {; i* c
  135.                 print self.CaterId
    ( Q4 V2 b' ]; h/ _) f) R
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    ; P: \% n% N) Q
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    ; c' U7 [- j0 B4 I" \5 J/ [6 T; D2 B
  138.             self.page_num += 1
    ! Q/ S$ y( Z7 m8 E  w) V0 ^
  139.             
    4 ]- p4 [" {" {! c: _3 ^$ n
  140.     def list_Caterg(self, response):
    ! \5 X: o& b. g8 Q
  141.         Cater_Name = response.save: M7 {& B4 g# |3 a6 ?! O( q
  142.         for each in response.doc('.pic-list a[href^="http"]').items():* _8 u7 u% X" D5 s7 }4 O( h
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name); y7 L) F6 {. n0 d! e1 U4 r( u! n
  144.             
    + q7 B; t) W: U
  145.     def list_Caterg_detail(self, response):  o- ?- E+ |  O: Q) J' T% @9 A
  146.         Cater_Name = response.save" G- N) S$ C6 x% p/ E
  147. #        print Cater_Name
    & \. m6 q& l+ j( t" P5 K
  148.         Bookname = response.doc('h1').text()
    $ m6 u7 y; a. b* O* ]" S' v! c
  149.         print Bookname9 F$ |- k' v; N& L. d
  150.         Book_author = response.doc('.authorname > a').text()7 Q# P. F- u/ V8 Z/ o3 \8 K% ~$ S/ b
  151. #        print Book_author$ y8 d- B+ ~: [
  152.         Book_Introduction = response.doc('.book-intro > div').text()( x3 Z  ^& h5 p( F, |! \" I. N
  153. #        print Book_Introduction
    0 f7 n* X2 z' f- I7 ?
  154.         Book_Synopsis = response.doc('b').eq(1).text()# H! L5 b: k( k$ X
  155. #        print Book_Synopsis
    : C& F9 m4 [3 v1 V- \# B
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]$ l5 d* `( u: R& X
  157. #        print Book_Palabras
    * A; }/ ^# b% H0 T4 b- I5 L1 {) E
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    - n3 E+ u: J+ X3 o
  159. #        print BookIDs- i/ L8 [' F8 J2 H
  160.         Book_Dates = str(datetime.datetime.now())           Y2 ^- e# j8 ~7 \( N0 D
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    4 {! U' V! B; o# o
  162.             img = imgs.attr.src
    1 U$ \9 Z7 O; |- X' D
  163.             print img
    " x6 e, P( Y; x0 g
  164.                 #小说封面下载& E) }, B: c1 P3 X$ C
  165.             extension = self.getExtension(img)# B8 U0 x. C! F6 b$ _" g8 O, m: I
  166.             name = self.getname(img)% g6 H, |! V8 n$ L) d
  167.             file_name = name + "." + extension2 c2 k+ t/ L$ b$ {; @* y- \
  168.             imgDir = P_dir + name& a4 q  v3 ?( P$ d  g3 h
  169.             Locaimg = imgDir + "/" + file_name/ V: R: I( L0 Y. y, I) u# J& L% I
  170.             print Locaimg
    " c$ Q0 }0 q% N* `" o
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    : N0 F$ m9 y* L# q/ p/ L8 J
  172.                 print('attachment url is ' + img)               #0 i% C5 Z6 E( N" f
  173.             Datos = {, D6 I# A. l- |6 e$ v$ y$ s8 E
  174.                     "Cater_Name":Cater_Name," c+ X8 X, g5 }; Y: c% p- ?# ?
  175.                     "Book_author":Book_author,
    + p9 x2 Y; C6 d& C% v
  176.                     "Book_Introduction":Book_Introduction,
    ; _$ I5 U7 c! n' v- M
  177.                     "Book_Synopsis":Book_Synopsis,+ J7 D$ z0 Q) K- _5 P: C
  178.                     "Book_Palabras":Book_Palabras,; l! b2 S! C: T8 s
  179.                     "img":img,; L7 |/ A! _: Q2 ]$ L& g7 v; ^
  180.                 }
    9 z, p; r/ r2 B9 V% ]
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布% v4 c+ y# r! i: o# S
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    ) Z/ |' c( V# c5 ^& B
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    % ~; @6 J6 v+ N; Y; }
  184.             
    " N4 X4 x# {0 L5 W- q- ^
  185.     @config(age=8 * 60 * 60)    1 b& J* R. ]" z, c* c# `! ?0 `5 ]
  186.     def index_page(self, response): 2 |+ b/ z0 y" l- O2 Z
  187.         Datos = {. U# h; R2 m3 m2 p+ |0 `* y( h) t
  188.                   "Cater_Name":response.save['Cater_Name'],
    $ K6 u4 j8 E7 ~% m* [5 I
  189.                    "Book_author":response.save['Book_author'],+ d/ v0 N& D) A4 b  j/ g" c5 E
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    ) f. b$ [/ e2 Q' y/ d1 _! H: f
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],; g, @8 a7 [1 p& J; ~# a
  192.                    "Book_Palabras":response.save['Book_Palabras'],: d& ?, y+ r# J" E2 Y
  193.                    "img":response.save['img'],7 J( O0 Y+ H4 _/ F) z
  194.                      }6 i! D% Z7 w6 T3 K2 s: q% B. J, s
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    / {3 f$ a$ g3 l& q: W+ f
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    3 k, O/ C( V' W
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    7 W# _' L3 a5 g% x: W- G& x
  198.     @config(priority=2)6 k6 ?3 `+ o  l9 \& |2 u4 p3 a$ v) T
  199.     @catch_status_code_error
    1 c- q/ i; w: @* i/ ~3 ?& _/ h
  200.     def detail_page(self, response):        1 i$ \6 F4 H9 Z/ t
  201.         NewRe1 = u'哈书'
    9 C. ]$ _: k. q" m0 o" \/ s5 Q
  202.         NewRe2 = u'huhjsd.CC'
    7 f6 n0 V( o3 n9 ~6 e5 s
  203.         NewRe3 = r'^\\n\\n'
    - R0 a4 g: W- }+ y1 j" B
  204.         NewRe5 = u'小说网': U8 m' D& m- X- Y/ ]$ U
  205.         NewRe6 = u'fgdfgf'7 k& M( H6 R$ Z$ r
  206.         NewRe7 = u'fgfgf': a- A( h( L2 A( x8 x* x
  207.         NewRe8 = u'ffhgf'5 ]' h$ \* d. d( n8 c8 }  L, i* ^, O0 Z
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    / F, t& Q; M7 z8 f
  209.         ReC1 = u'静思'
    1 p0 M6 R: V0 L& U0 Y# d
  210.         ReC2 = u'aghgf.com'" M) m- L( i+ {' i) v' m- {& F  H
  211.         ReC3 = u'aghgfh.com'
    " m1 G! o- Q% {/ [; }& l9 S! h
  212.         ReC4 = u''8 F! _) M4 ]; z4 P' @
  213.         ReC5 = u'文学网'
    ) X' \" n0 I2 D$ l* I
  214.         ReC6 = r'<BR>'
    9 c0 N0 k0 d  }/ D. W# ]
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    ; K7 w; o4 A5 V3 g8 _
  216.         print Bookname( ]$ ]( G* X; p" D8 i1 k8 {+ E
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    ( ^: A0 q0 i8 H6 I$ @7 P) ?3 f
  218.         Book_author = response.save['Book_author']   #小说作者+ V& F' t( U' ]) }$ t) @, v" N
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介6 B7 D3 k: ?8 d' J" F( I
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
      z6 _4 `9 U* e) K0 A0 ~2 i4 V
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数- O6 W0 k& y3 p: {8 I: W! m
  222.         Bookurl = response.url   #小说网址/ W6 q" j' I$ Y2 ]9 U$ u
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    # z! m1 D. ]9 Z. f7 ]5 s
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    7 ]% S; `% J) p+ w! g9 r; ]% p2 Q: @
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    + L$ c9 U' Y7 \* w8 o9 d2 L  [
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    ! \6 P, G) S, c1 W5 F
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    ! E* y1 `6 Q+ L& x: C* O1 O7 X+ ~
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)- x- B4 Y! b' m  {! ~4 G, k8 ?8 n% E
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)2 P6 V0 X) ~2 X& u' L# O3 @
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    . \+ ^% `2 u0 O% e+ r
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    # v" a4 u; @9 u- w
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    + `7 X7 Z% b0 C- H7 Q2 g
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    2 t& E! @0 B. q1 O% l: }. E
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    * T  ]4 V1 w4 ^* D: N
  235.         BookConte = BookConte4.replace("\n\n","<br>")3 x+ s5 X  \  C) Y% z! d, D' F5 F
  236.         print BookConte( ^: ^0 [8 p6 i  K) V0 F, x. m1 I" ~
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)& |) I# z. d" S+ b; @3 q+ u
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)9 g1 h( J% |! ^3 B
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    4 P  X7 }1 Y& f+ o, y
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4); F  X6 F, E5 X# J$ e4 i8 C
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    & E; `" K7 z/ o/ _( ]/ C( I- P
  242.         Book_img = response.save['img'],  #小说图片
    / {0 X  Z" L6 v6 k" h0 F( x6 E5 M8 f
  243.              " Y) E. `: H* C& p; v- h6 x
  244.         #insert into MySQL 小说入库
    # c/ Y. B3 {6 \, K. u
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布6 A3 V5 \2 Z+ V6 L5 o
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布' }) S0 G* _! F5 Z
  247.         #post提交发布3 @; l" Z7 x  S6 ]5 F& V
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消* n* c1 y6 z5 Y/ {& @
  249.         Datos = {9 X& j4 C- o3 R" `! [0 P
  250.                   "Cater_Name":response.save['Cater_Name'],6 `) ?( r+ F" H2 q2 Q7 Z& K
  251.                    "Book_author":response.save['Book_author'],
    8 s) {: m; A4 `
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    + l% C6 y, [5 q+ `, N
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ! i7 J% r/ f8 C& ~
  254.                    "Book_Palabras":response.save['Book_Palabras'],
      I+ Y2 a5 \# ?* q: |% H3 C5 V) v7 o; B8 w
  255.                    "img":response.save['img'],9 ]9 c2 s8 q. U* t" }* q1 x1 ^
  256.                      }
    ( ^7 ]) A0 b: ?$ M) |2 W. d. j
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    9 @( o5 X$ c6 T* \
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) 2 Q: f0 ]2 R8 c2 k- S6 T6 ^$ Z# D
  259.         return {5 x5 c2 F2 \0 g: i& C
  260.             "Cater_Name":Cater_Name,
    + ~' W- ~( M' S! I
  261.             "Bookname":Bookname,
    7 A& I- K  j3 @
  262.             "Book_author":Book_author,
    & X, a% \$ a3 L; w8 H6 v. s
  263.             "Book_Introduction":Book_Introduction," s- H* R' C! `) M5 K$ d7 G
  264.             "Book_Synopsis":Book_Synopsis,2 F/ a' i" W- c: d8 D
  265.             "Book_Palabras":Book_Palabras,
    7 k6 ]. c* M- k- a7 ?
  266.             "Book_img":Book_img,0 k1 I* _9 E+ _# X: t
  267.             "Bookurl": response.url,3 W# A, m. L  s) _
  268.             "Booktitle": Booktitle,
    % _# L# H4 {% P6 ^6 g
  269.             "BookID": BookID,
      H+ ^9 s4 {0 j; j  g3 {1 X
  270.             "BookConte": BookConte,
    - ?" t5 }; Y0 H% T* {1 ~% S
  271.             "Titleid": Titleid,
    5 e  W) p8 |# c: n7 J+ B. q
  272.             "abover":abover,
    4 A5 K0 S2 l6 H" S
  273. #            "Book_Date" = str(datetime.datetime.now()),
    ( D/ N6 D. [) s$ \+ j. [
  274.         }$ c# M/ T4 J& P, P1 H3 J
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    9 k  p4 G- z4 v) J
  276.         if not os.path.exists(imgDir): 6 q. J6 I, F/ ~% B
  277.             os.makedirs(imgDir)0 T1 {% F+ o  i9 }" B3 P
  278.         file = imgDir + "/" + file_name
    ' q. `) S7 X/ F# A$ b; I
  279. #        print file5 l. o" K" L" [. u+ `, g
  280.         f = open(file, 'wb+')
    * b8 v7 Y/ I, d7 \
  281.         imag = requests.get(Book_img)
    5 {$ H9 q3 A4 O3 u0 D* l* W
  282.         f.write(imag.content)8 g, Y! {* @9 L4 T+ i6 b
  283.         f.close()+ y  b& g( [4 C' X
  284.         #保存图片前1 l! [9 ]6 O6 Q$ i( [: i
  285.     def save_imgs(self,response):
    5 t' q/ ?- L) s* ^8 k' s8 {( Z
  286.         content = response.content: H' ^$ z2 m0 l# M* m( Y1 o" S4 q
  287.         file_name = response.save["file_name"]
    5 j/ Q( B0 P+ n5 n1 t& T  Q; ?' _  p' [
  288.         imgDir = response.save["imgDir"]
    , v: e0 n1 u# u! @* ^
  289.         file_path = imgDir + file_name
    0 V) I9 @/ i, Q* g
  290.         self.save_img(content,imgDir,file_path)
    ! F3 ^6 u+ h* b) K& a+ }1 n
  291.     #保存图片2 h' A& b2 p" a
  292.     def save_img(self,content,imgDir,path):! x5 T; b+ r$ C; i
  293.         if not os.path.exists(imgDir):                         6 I1 g- v3 _& j# k& a
  294.             os.makedirs(imgDir); `' R7 i0 X* k2 f& F0 q
  295.         f = open(path,"wb" )9 R: D6 p$ [$ ^5 m& c6 t7 H9 ^+ [7 I
  296.         f.write(content): f; G( t3 J+ d
  297.         f.close()
    * z: {, G- l* `; [) x" r  B$ X
  298.     #获取url后缀名
    & |% ^$ f- c! r( j, w- c
  299.     def getExtension(self,url):                           
    1 X% I# z, q& ?
  300.         extension = url.split(".")[-1]
    6 c2 Q! K% R/ m5 ~+ N, I
  301.         return extension
    " k4 @# I+ t$ l
  302.    
    " v0 \+ J  X) f2 Z( T
  303.     #获取图片名# @: P0 W( j2 H9 {( G) B$ h: P9 \% _
  304.     def getname(self,url):2 }$ f' {) `9 @2 J- T, D  w% y
  305.         name=url.split("/")[-1].split(".")[0]
    + f5 h( o+ X/ |
  306.         return name
复制代码
" ]9 M3 |0 ^7 C4 x7 ?! N% C* a' G, z

, R# t  M% \$ O
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|中国飞逸网

GMT+8, 2025-7-11 07:14

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表