找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!2 \3 m5 ]- K2 v7 z3 u" x' |- W  o
  1. #!/usr/bin/env python! M. ]2 X2 N/ ^
  2. # -*- encoding: utf-8 -*-
    ) B2 N! N7 j, z- T( Z: y3 D
  3. # Created on 2019-05-05 21:43:11
    - C& O& p6 h! H9 N
  4. # Project: XiaoShuo
    ) ^4 V, e4 {! c; L1 G9 _

  5. + ]4 q2 `% s# ]" \8 ]
  6. from pyspider.libs.base_handler import *
    ( Z" r+ \) i$ a) R" J! v; H2 v
  7. import pymysql5 v3 u  ~  [: r
  8. import random# @8 T" q# j; g$ Z# q/ b3 e% B# k
  9. import datetime' `, ]$ ^: T$ j  Y
  10. import urllib2,HTMLParser,re: Q  z2 Q5 A+ p
  11. import os- f8 o6 n/ g" n0 [! T/ }6 c7 i
  12. import sys% V/ P) I2 f+ [  O9 A. u* N
  13. import re3 E1 i/ g) S: \6 j+ W0 p: c1 F" U+ ]2 C
  14. import codecs8 d2 E& c! X7 f+ o; W2 @2 U
  15. import requests
    7 @; r0 y% k3 e8 Q2 i" @0 l' N1 t! f
  16. import json
    5 o2 N3 ~9 H& C6 N4 s/ z

  17. % x! I4 ]. A9 k1 u
  18. class Handler(BaseHandler):2 \3 l+ r8 k; @; L9 V* A
  19.     global Datos2 D7 _; q. w1 Z' Y( E5 L
  20.     global P_dir    0 p! v$ k! \: Y4 h
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径+ U: h2 i- L  |( J  P
  22.     global Datos) e' A- h6 S, p9 ^& e
  23.     Datos = {}9 i. ^! n5 T7 Q$ ^; w
  24.     headers= {5 _9 A$ \' s3 S6 m, J& \
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',! y5 v% A: ]+ _5 N, n: P+ l. j1 q/ P
  26.     'Accept-Encoding':'gzip, deflate, sdch',8 B& |6 }& `3 I  ~  Z
  27.     'Accept-Language':'zh-CN,zh;q=0.8',6 z# c- m  {. J" D) |' S
  28.     'Cache-Control':'max-age=0',
    , o& w# N) G( U0 w! D0 [
  29.     'Connection':'keep-alive',- ]& F) @4 w) h
  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'- k4 q+ K* k0 D1 O! S& b& J. H9 Q* e
  31.     }# L0 Q6 Z( K, Z- h9 l( m
  32.     crawl_config = {/ f& Z& V8 s2 G$ Z  }
  33.         'headers' : headers,
    " X8 `' W' @" c+ Y, N$ b+ C, I
  34.         'timeout' : 300
    6 k+ B( c: j' w; d, X
  35.     }
    9 h. ]2 f+ _$ f* E$ c
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):- ~7 W6 p. g) p8 s* l9 C
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    + N4 n$ {0 N# ~; Z
  38.         try:: X) o$ I9 ^' ?4 j
  39.             cursor = db.cursor()0 h$ ]! H9 Z/ a/ Z( o- d3 O
  40.             #注意此处字符串的占位符要加双引号"%s"* k# S+ ~! o% h* ~2 t! d% u
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    - v2 |2 G1 l3 }( S* `) z
  42. #            print(sql)
    $ q+ F* q- Z* Q
  43.             cursor.execute(sql)
    0 w: \  D* ^8 |0 D" o
  44.             , `' r5 Q% I- t5 A
  45.             #qid = cursor.lastrowid& a: F" ~$ \/ l# V9 c) h* l
  46.             #print(qid)
    5 X$ R) k7 F* D8 X$ [3 Z
  47.             
    3 D+ C3 y$ v1 f; m5 j7 j
  48.             db.commit()
    . w7 {& K% I  O* l
  49.         except Exception as err:6 _# e" w$ c& E  H, m
  50.             print("Error %s for execute sql: %s" % (err, sql))
    1 s5 N' w; a- [- ]! ~
  51.             db.rollback()
    & G* _+ S. z; B* M( o# m
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):+ H* Y) L! b% o% C- Z4 P, u
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    : k7 D9 ~( Q9 b! B$ P( \
  54.         try:- t$ ^' d- e2 j! O
  55.             cursor = db.cursor()
    0 m5 I$ I* \1 T9 e2 z7 p
  56.             #注意此处字符串的占位符要加双引号"%s"
    % A( E* ^2 b; @: Z6 H9 g" H; b
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    / Q6 N0 E' K; c8 m& a7 ?3 N1 K- ~
  58. #            print(sql)0 ^; _7 I" x# X3 t% ~' `8 H4 }
  59.             cursor.execute(sql)
    8 N: v# |( H$ \4 k
  60.             
    , M; A+ Q1 `& L2 c' F8 N
  61.             #qid = cursor.lastrowid
    4 g2 R$ J# B9 w9 J1 X  l2 `
  62.             #print(qid)
    ' R3 d" k7 r$ j" Y+ a
  63.             6 f0 K1 P, U: f; t& Z0 L
  64.             db.commit(), b$ ]/ o7 p0 b2 v/ B
  65.         except Exception as err:. h( M2 ^; h4 ]/ B4 ~0 D
  66.             print("Error %s for execute sql: %s" % (err, sql))1 E# J* x( h) y# B
  67.             db.rollback()7 t/ I9 f. z$ I5 t/ }* X
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):' J. X! E# N3 N; f) o% w* R3 p* f$ i
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")$ E( I/ S  ], R! Z5 M6 ?" {" U
  70.         try:8 X. ^4 q, a7 u* b& G3 q5 h, ?
  71.             cursor = db.cursor()* b/ t1 g) I- ?# E, }- t5 g
  72.             #注意此处字符串的占位符要加双引号"%s"
    - y; m/ X) O: R  o5 I& d
  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);. B' q: I  f" o1 n* Y1 E
  74.             print(sql)
    ( a4 o9 L* A+ l# q. q/ t
  75.             cursor.execute(sql)
    + @/ c* i9 g2 A% y* N3 q& P
  76.             print(cursor.lastrowid)- Z  N. \# E; G; e! H
  77.             db.commit()/ C' F! G2 u& w, z( _
  78.         except Exception as err:
    2 i1 P  G" N3 h: T% X
  79. #        except:4 D0 R" l" w0 P/ m" c4 ]9 A
  80. #            print('Failed'): W8 z% j5 _; q6 G( L$ B
  81.             print("Error %s for execute sql: %s" % (err, sql))
    ; H: w  o! z$ D9 f$ d
  82.             db.rollback()$ G8 Q8 K4 r7 B5 P+ u+ o2 Y9 t
  83.         ; ]! N1 _2 l3 E% U+ |5 C% G
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): # Z6 l, ]$ R; O' z
  85.             reload(sys)3 E$ k6 v1 d7 E* r! k0 I  S
  86.             sys.setdefaultencoding("gbk")* L, E) E' ?& f( R$ K8 ?& F
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址: X; t$ G7 h9 V6 [( I
  88.             locoy_data = {# R9 H' G, D# s: ]7 v' K
  89.             'my_u':'用户名',   #后台用户名
    ; P- u8 t0 B: z
  90.             'my_p':'密码',   #后台密码' e7 E7 ^* c, y. u& |3 m0 Y
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    8 K. d% {" A* }! w
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    2 N! j5 z+ Y) a
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    # Q: n4 k- l- O6 Y: v
  94.             'article':BookConte.encode('gbk', 'ignore'),( Z0 b5 s- h! N' s6 T
  95.             'author':Book_author.encode('gbk', 'ignore'),, B1 M- }$ O" ?+ X% Q
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    4 y# k4 o5 w* C, W" P; b& {
  97.             'thumb':Book_img,4 q! h* ^# Y, |
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    " b# _+ M" k, p8 H3 M5 K5 L8 L
  99.             'abover':abover.encode('gbk', 'ignore')           
    2 t* q; B; U* ~5 g1 v- ?
  100.                 }. X4 Q( @. v3 [7 _7 G" {7 U
  101.             res = requests.post(locoy_url, data=locoy_data)
    3 Z4 L3 S) e7 q! W$ m9 V
  102.             print res.text: ]& {2 K7 ?" f# U4 A4 A
  103.             print res.content1 n. }3 d. z" [
  104. #            print Dsd
    * M% X; T& {6 _1 l" @! p
  105.             return res
    0 E, |" l% ~4 I5 H
  106.     : k4 \9 \' ~1 T' q; V# m4 p" w
  107.     def __init__(self):1 V' j. `9 `- w5 v" X* u, A
  108.         self.base_url1 = 'https://www.****.cc/') X  M! ?2 x( D' L
  109.         self.base_url2 = '/'' c! m6 D$ U% L$ W4 C, k
  110.         self.CaterId = []
    , W7 o# F: T6 U% z
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']9 {; I- k! B0 T' S' {$ W  \
  112.         self.page_num = 15 U3 O3 C- k* f( R
  113.         self.total_num = 200   ( u$ e% A& Q- U( U7 y# o
  114. 0 x( Z8 W4 f# v" F9 S
  115.     @every(minutes=8 * 60)2 \! G% w  P$ u" E4 F8 ?' a
  116.     def on_start(self):
    3 m$ C1 L/ Q& F
  117.         global Cater_Name0 D% J! r7 G0 Y/ [
  118.         Cater_Name = []
    & J, Z2 [/ n; x
  119.         while self.page_num <= self.total_num:
    + g* S) \5 a% k; Y
  120.             for self.CaterId in self.CaterIds:
    4 l/ i7 M5 j6 {( |" I
  121.                 if self.CaterId  == 'xuanhuan':
    $ a' s' j1 J: k: m
  122.                      Cater_Name = '玄幻'5 E' d( `" m9 J7 D+ d# i+ L
  123.                 if self.CaterId  == 'wuxia':# x3 E3 H* }$ A1 [
  124.                     Cater_Name = '武侠'. Z- K) ^+ o% [
  125.                 if self.CaterId  == 'lishi':
    - q; w$ w5 a1 y$ V
  126.                     Cater_Name = '历史'            
    . `. A  g+ ?6 M9 _/ }
  127.                 if self.CaterId  == 'yanqing':
    / _1 Z6 s+ F% b' X1 J8 K
  128.                     Cater_Name = '都市'
    2 ^5 g2 p$ u0 Y5 o* y4 j* P
  129.                 if self.CaterId  == 'nvsheng':5 v( f: v( {4 e7 \( l) i
  130.                     Cater_Name = '都市'
    3 V! v2 `: a% ^# r9 E% B
  131.                 if self.CaterId  == 'kehuan':0 d2 J" H" m# p8 z/ Q) @
  132.                     Cater_Name = '科幻'
    ( D, t9 J6 k1 }. I
  133.                 if self.CaterId  == 'kongbu':
    + V2 T) F% _: n0 m- R+ e
  134.                     Cater_Name = '游戏'
    + C* t" E# G3 f5 F$ h
  135.                 print self.CaterId
    * {( c  m3 U; g
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          ! _- M0 l6 O" K; c, B0 H
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
      w' a( ?+ f4 W5 `6 q( G5 B* B
  138.             self.page_num += 1
    $ z/ F9 Q5 j4 V1 {) D0 W
  139.             
    " P/ i% K( Y5 d$ I' h7 \! g
  140.     def list_Caterg(self, response):
    # ~/ N% \6 C8 s$ d
  141.         Cater_Name = response.save  ^2 x% Z% e2 \- R, _
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    % a+ R! C* _' ?
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)+ N) Q5 x& Y, L
  144.             - x# d' g& F# I
  145.     def list_Caterg_detail(self, response):
    + H& e! d' q( e
  146.         Cater_Name = response.save& ^; m6 E' c) W
  147. #        print Cater_Name
    0 n& {: j; w! Y' X
  148.         Bookname = response.doc('h1').text()
    4 H8 N3 U- r/ Z
  149.         print Bookname0 K% U: R/ D3 j2 t0 k# R
  150.         Book_author = response.doc('.authorname > a').text()
    : C6 P" M. M. E6 r3 k
  151. #        print Book_author
      g$ f( @2 {0 G' Y& d, L
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    ! K# _% B" A0 y3 p
  153. #        print Book_Introduction, m( M- R$ _4 z9 h0 i: `
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    ( ?8 S8 i* I" ~4 d
  155. #        print Book_Synopsis
    $ I4 g/ p, t' M0 ?# M  K' I' E
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]' j3 V1 P0 c" E/ y, t; h
  157. #        print Book_Palabras- f$ Y, g1 h0 B  |; W3 j% A: K/ _
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    ; G8 M- Z" k" D6 J" I) G/ E
  159. #        print BookIDs8 v! G: u4 e1 K- G
  160.         Book_Dates = str(datetime.datetime.now())         
    3 m# O7 Y5 f7 P1 M4 W0 Z$ t
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    2 S8 g( E' e  B4 K) D
  162.             img = imgs.attr.src
    - r2 Y6 @/ C! \7 t6 O
  163.             print img: c" C. }! Z% }2 y" x: |. W
  164.                 #小说封面下载
    ! B. K  X8 e" z  |& |( O4 b' ], E
  165.             extension = self.getExtension(img)) \) M/ i+ r  x! k- q' J1 e7 m: R$ j
  166.             name = self.getname(img)
    # R7 t' E' C4 r9 }3 u
  167.             file_name = name + "." + extension
    - c0 f; n! E" t
  168.             imgDir = P_dir + name
    / B9 X) D$ g/ Q! K1 n( H1 p' e
  169.             Locaimg = imgDir + "/" + file_name% f$ `3 T4 m% |& \- V3 @
  170.             print Locaimg
    7 Y9 g# z' w" d0 {1 h2 g
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    9 i& _' |, N4 V; X% `* \1 O
  172.                 print('attachment url is ' + img)               ## L/ k' F, `; \+ C9 D8 S0 m. \4 b
  173.             Datos = {) z4 u0 w8 ~  l
  174.                     "Cater_Name":Cater_Name,3 a/ }7 H1 G& V! ^
  175.                     "Book_author":Book_author,
    6 g8 c6 ~1 u) d
  176.                     "Book_Introduction":Book_Introduction,
    8 J8 ~' W. q7 F' o6 U3 Z. ?: G
  177.                     "Book_Synopsis":Book_Synopsis,' V8 u1 ~* X/ E) z! y3 ?! I: P6 D
  178.                     "Book_Palabras":Book_Palabras,
    2 l7 S% w7 ^, ?; e" b
  179.                     "img":img,
    $ G# O3 W9 v) R5 k$ E5 {/ u
  180.                 }
    8 Q) H( A& e% D9 c. Y- P
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布1 p: T" f7 E" H9 A% N+ Z! X
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    % y3 F! X" [8 q- e
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    , Z. N$ |, o( W
  184.               I0 u! R" J7 ?; K# h' r" }
  185.     @config(age=8 * 60 * 60)   
    / ?7 z9 u' H: D) q1 n" b4 r. @- z
  186.     def index_page(self, response): ) E1 J& N' y1 [% |& R
  187.         Datos = {
    3 r6 H; U5 ^' P
  188.                   "Cater_Name":response.save['Cater_Name'],- S( {) T6 N: X' |6 F5 S, \
  189.                    "Book_author":response.save['Book_author'],
    $ U# L# Z- ^; i& f6 _# C& v
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    8 y; y- N7 t- p/ M5 T9 U
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],6 C+ m7 U' i2 C6 e
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    5 o  y0 m" ^" j1 c: |+ e! ~, |
  193.                    "img":response.save['img'],
    7 i) D% n+ \' r5 i; W/ s( @
  194.                      }- Z+ u5 s5 f! T
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():; f) ?* U/ \" ]8 y* w# f8 r
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    , x* @" o# J5 Y8 v) Q
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos); U9 C8 v' \& o( S
  198.     @config(priority=2)! S& ~8 `2 n3 D1 {( F& q$ I
  199.     @catch_status_code_error
      z% L: x3 a( c; Y, L9 X6 W& ^1 d
  200.     def detail_page(self, response):        
    : U+ R! U: o% U- e# x( S: p
  201.         NewRe1 = u'哈书': ^7 d" K- C# y' [  i0 Q3 G2 x
  202.         NewRe2 = u'huhjsd.CC'( H/ a8 x$ {! D8 i, ?" `
  203.         NewRe3 = r'^\\n\\n'
    , y6 w! X4 [; i+ b0 O7 `
  204.         NewRe5 = u'小说网'2 e! e& B9 E0 A6 U/ t1 F) H$ X
  205.         NewRe6 = u'fgdfgf'4 Y; A) ]) D3 Y( _9 T
  206.         NewRe7 = u'fgfgf'! C- \1 B: \8 f4 q
  207.         NewRe8 = u'ffhgf'
    ( ]: X' h$ D6 }) N' H6 C% f
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    * O6 m4 K, A+ Y9 R
  209.         ReC1 = u'静思': g9 t/ o' ~& ?5 J1 n) d
  210.         ReC2 = u'aghgf.com'# F/ o2 ~+ }5 r3 c$ ^! v7 g  ^$ N
  211.         ReC3 = u'aghgfh.com', d7 M' w2 z1 G) g3 X: U# s
  212.         ReC4 = u''. c* ]7 F3 U6 y. i% {6 ^0 J0 C
  213.         ReC5 = u'文学网'! l3 T% k! z8 [( S% i' O
  214.         ReC6 = r'<BR>'
    3 W3 J' F; }( O6 r% E* J8 K* f
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    7 K9 H# ]1 Y- u5 y0 u7 z
  216.         print Bookname1 s+ d- `$ p9 U
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    8 ?& M. S8 G* {4 x$ M
  218.         Book_author = response.save['Book_author']   #小说作者* L- w. \) p, D& g0 ?
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    , h7 `: D5 n( F$ ^4 A" e8 e
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    ( C+ N( [( \; m  Z+ V: G# ?, q
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    * _- Z; P% z" c
  222.         Bookurl = response.url   #小说网址# b% u+ K, r$ V. A( \7 N
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    0 i! a1 U" c6 m& A- r' }1 Z" @
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    3 e' g, N9 n+ w8 u) a
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容: z4 W' z: z; t/ y
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    * @) u0 p6 u  N3 v/ W3 b2 \
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间8 m% B2 b$ O7 W5 C* d9 y
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    ; k* t5 E  }  o- W1 x
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    & ~( k: l* {3 p7 T
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)& H( S& X0 x- B+ V. @
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2), D% Y+ z, G9 x* ?% Y" j
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    * ^; @  i+ b) W
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    . E. c6 g- k- D# e9 H
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8), O3 F2 z+ D, B
  235.         BookConte = BookConte4.replace("\n\n","<br>")8 W) n- F# d) A. a% f% c: J, h0 X* G4 ?
  236.         print BookConte
    ) G6 B8 H& R: a: t
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)7 x9 F( P0 P: `2 L2 _
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)" L4 z5 |" L) c. g
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    ) W9 k/ p4 B1 E& o: X
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)2 f8 }" |% X- U/ X( k8 Q
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    0 c- u* k/ t- I' `$ Z' N
  242.         Book_img = response.save['img'],  #小说图片
    $ M/ O$ U6 O3 A" Z2 x* i4 @( h* `
  243.             
    ( e" B8 d3 ~7 P3 w& j
  244.         #insert into MySQL 小说入库. C( E) C1 k$ R% U; k$ R  l
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布& Z# V, }- p% S; X. O
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    # R8 ~& G+ u& N; {
  247.         #post提交发布% y3 O* u2 A  z+ _. d1 Z% p
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    5 |4 R# f8 k+ U& l$ r! W
  249.         Datos = {( B5 T! M" |/ J1 I
  250.                   "Cater_Name":response.save['Cater_Name'],
    0 b& w% j1 Z% y% |2 V: {/ i. n" R
  251.                    "Book_author":response.save['Book_author'],+ ?( e1 ^) W# l6 z, O( Z' I
  252.                    "Book_Introduction":response.save['Book_Introduction'],. y& w  A; x% N$ R. I
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],# F# _. I' D+ g
  254.                    "Book_Palabras":response.save['Book_Palabras'],3 d& [7 R$ a* c
  255.                    "img":response.save['img'],- N) u5 W) I8 y0 t8 D+ j( E, f
  256.                      }
    & w8 }: e2 e# L# @, q7 I
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    2 l: R+ ~) ~2 `2 _. W
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) ; L& @( h0 W  b. r; X
  259.         return {
    2 \4 Q! l" ^0 B8 n# b( T. i0 z" y
  260.             "Cater_Name":Cater_Name,- A+ G! e7 E- s8 Q
  261.             "Bookname":Bookname,. @5 E6 p- _8 T. z5 I; @( e. a2 Y
  262.             "Book_author":Book_author,
    + e1 `5 h. s" u: C5 J; U' A
  263.             "Book_Introduction":Book_Introduction,; L& e4 s- I& g' r1 \& Y
  264.             "Book_Synopsis":Book_Synopsis,) n  R0 O( h5 O0 X* v
  265.             "Book_Palabras":Book_Palabras,
    , w1 B. l) c0 e3 F% [0 K
  266.             "Book_img":Book_img,
    " x7 ^" Q! q' o) B. ^
  267.             "Bookurl": response.url,/ J- F. p' K. K: D
  268.             "Booktitle": Booktitle,0 ?8 `1 x* X) ~  t2 @4 E$ U: _) F
  269.             "BookID": BookID,1 K3 t2 v1 h- Z5 i5 C/ q
  270.             "BookConte": BookConte,
    5 u" E, n$ P. r' P
  271.             "Titleid": Titleid,
    . I% @# D5 s) l. M( `+ g3 y
  272.             "abover":abover,
    4 R" w$ T! Q; Z
  273. #            "Book_Date" = str(datetime.datetime.now()),/ _  |& s3 l/ w" n
  274.         }6 I; Y* X7 A& p2 k5 \/ K$ @. D
  275.     def download(self, P_dir, imgDir, file_name, Book_img):! W$ B! Y) t0 S; k9 p  u6 B
  276.         if not os.path.exists(imgDir): 2 u8 G5 ~- h$ ~; H1 D4 V
  277.             os.makedirs(imgDir)
    2 H/ j) A- _/ W" F- Q
  278.         file = imgDir + "/" + file_name7 k, Q9 ?( ^9 w, v
  279. #        print file
    + M! ?- w  t3 H
  280.         f = open(file, 'wb+')
    + S6 M- g" f/ k8 Z/ v
  281.         imag = requests.get(Book_img) 4 M. J% n/ D3 y: v2 G; N; s8 }
  282.         f.write(imag.content)* H) H7 y9 G& H
  283.         f.close()
    ) n! S# k: R* h! W, ?
  284.         #保存图片前
    ! d6 _) ^7 [( m" I# Y
  285.     def save_imgs(self,response):
    0 a; A1 m- ~) I6 K! l) y; J
  286.         content = response.content
    7 w) M) X. T. ]8 l6 o/ u
  287.         file_name = response.save["file_name"]
    6 K5 ^! Z" b$ {3 r  t- S( v
  288.         imgDir = response.save["imgDir"]
    , C/ E( J, Y3 |# ~
  289.         file_path = imgDir + file_name2 T3 o& N! M& U
  290.         self.save_img(content,imgDir,file_path)
    + @% f2 o, F7 ^( O; J
  291.     #保存图片
    8 B9 k; O# e: ?& v9 D
  292.     def save_img(self,content,imgDir,path):9 ^6 m' ~$ ^+ v- r5 c
  293.         if not os.path.exists(imgDir):                        
    : e  |1 F1 C/ v
  294.             os.makedirs(imgDir)- n5 T1 z( L1 W! D% B9 a& j
  295.         f = open(path,"wb" )# Z0 ~/ q1 @3 V
  296.         f.write(content)
    . ^! @1 d0 d  l; j
  297.         f.close()
    " W* a$ M: b( m
  298.     #获取url后缀名: q- T$ K9 M4 H
  299.     def getExtension(self,url):                            ; ?1 d; H0 T2 d3 T7 I6 |
  300.         extension = url.split(".")[-1]
    ' Q8 T# j7 u2 E1 H
  301.         return extension   e; y$ h- y3 L9 u! z( }# E
  302.     , E+ H% z6 X5 F) h9 N! a7 p
  303.     #获取图片名- L$ }9 `6 J6 E/ _% f5 ^1 S
  304.     def getname(self,url):
    , H% M* R- o3 ~0 b
  305.         name=url.split("/")[-1].split(".")[0]! B; v6 e, O0 O( t; F
  306.         return name
复制代码
1 n7 P3 @* q7 W
. M' C. y0 y0 [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-9-20 00:43

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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