Pyspider脚本编写指南

  • A+
所属分类:AMH
 
import sys
reload(sys)
sys.setdefaultencoding('utf8') 
import copy
import json
import time,datetime
import re
from pyspider.libs.base_handler import *
from pyquery import PyQuery as pq
 
result_template = {
    "info_id":"",    # 资讯信息编号(自增)
    "url":"",          # 原文URL
    "title":"",        # 标题
    "subheading":"",    # 副标题
    "fetch_time":"",
    "pub_time":"",      # 发布时间 文章内容中的发布时间,并非爬虫爬去到文章的时间
    "sort":"",        # 分类接口 ? 
    "summary":"",       # 资讯信息摘要
    "content":"",      #正文
    "persons":"",      # 涉及到的人
    "companys":"",     # 涉及到的公司
    "stocknames":"",    # 涉及到的股票
    "stockcodes":"",    # 涉及到的股票代码
    "industries":"",  # 涉及的行业
    "sections":"",     # 涉及的板块
    "others":"",
    "info_type":"",     # 文章所属类型  公告 / 新闻
    "source":"",   # 发布单位
    "info_channel":"",    # 2级标题/频道及以下所有标题/频道。不同频道之间,使用下划线"_"连接,不包含"首页"及"正文"。
    "editor":"",      #编辑者
    "keywords":"",       # 文章自带关键词
    "datetime":"",    # 文章采集时间   
    "imageAttachment":"null",    #图片附件
    "fileAttachment":"null",     # 文件附件
    
    "html":"",
}
 
source_name = "中国金融网"
source_list = [
    {
        "url": "http://www.cnfinance.cn/articles/?template=sample_397.html&page=%s",  
        "source_channel": "新闻",       
    },
    {
        "url": "http://www.financeun.com/articleList/1.shtml?page=%s",  
        "source_channel": "焦点",     "source_name": "中国金融网"
    }   
]
 
# headers=headers,
 
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
class Handler(BaseHandler):
    crawl_config = {
    }
 
    @every(minutes=2 * 60)  
    def on_start(self):
        for source in source_list:
            url = source['url']
            source_channel = source['source_channel']
           
            for i in range(1,2):
                self.crawl(url % str(i),headers=headers, callback=self.index_page, save=source) 
                      
    
    @config(age=1)
    def index_page(self, response):
        for each in response.doc('dl.dl_artListB dt a').items():
            href = each.attr.href
            if href:
                self.crawl(href,headers=headers, callback=self.detail_page,save=response.save)
            
            
    @config(priority=2,age=10 * 24 * 60 * 60)
    def detail_page(self, response):
        result = copy.deepcopy(result_template)
        result["url"] =  response.url
        result["source_channel"] = response.save['source_channel']
        result["source_name"] = source_name
        
        if response.doc('div.contDetailsBox').html():           
            result["html"] = response.doc('div.contDetailsBox').html().strip()
            result["editor"]  = response.doc('p.p_author.span').text().replace('作者:','')
            result["source"] = response.doc(' p.p_artInfo span ').eq(1).text().replace('摘自:','')
            result["title"] = response.doc('h2.h2_artDetails').text()
      
            result["pub_time"] = response.doc('p.p_artInfo span ').eq(0).text().replace(u'年', '-').replace(u'月', '-').replace(u'日', '')
        
        result["content"] = get_content_from_html(result["html"])
        result["pub_time"] = str_2_timestamp(result["pub_time"])
        result["pub_time"] = get_pub_time(result["pub_time"])
        result["datetime"] = get_now_time()
        self.send_message(self.project_name, result, url=result["url"])
      
   
    def json_handler(self, response):
        result = copy.deepcopy(result_template)
        data = json.loads(response.text)
        result["title"] = response.save['title']
        result["author"] = response.save['author']
        html = "<h1>%s</h1>" % response.save['title']
        html += data['data']['content']
        result['html'] = html
        result["content"] = get_content_from_html(html)
        result["summary"] = data['data']['content_short']
        result['pub_time'] = timestamp_to_str(response.save['display_time'])
        self.send_message(self.project_name, result, url=result["url"])
     
    def on_message(self, project, msg):
        return msg
    
def get_content(response):
    import chardet
    from readability import Document
    import html2text
    char_encoding = chardet.detect(response.content)   # bytes
    #print(char_encoding)
    if char_encoding["encoding"] == "utf-8" or char_encoding["encoding"] == "utf8":
        doc = Document(response.content.decode("utf-8"))
    else:
        doc = Document(response.content.decode("gbk","ignore"))
    title = doc.title()
    content = doc.summary()
    h = html2text.HTML2Text()
    h.ignore_links = True
    # h.ignore_images = True
    d_data = h.handle(content).replace("-\n","-")
    return d_data.rstrip()     
       
def str_2_timestamp(time_str, fmt="%Y-%m-%d %H:%M:%S"):
    if not time_str:
        return ""
    elif len(time_str) == 9:
        fmt = "%Y-%m-%d"
    elif len(time_str) == 10:
        fmt = "%Y-%m-%d"
    elif len(time_str) == 13:
        fmt = "%Y-%m-%d %H"
    elif len(time_str) == 16:
        fmt = "%Y-%m-%d %H:%M"
    return int(time.mktime(time.strptime(time_str, fmt)))
 
def get_content_from_html(html):
    import html2text
    h = html2text.HTML2Text()
    h.ignore_links = True
    # h.ignore_images = True
    d_data = h.handle(html).replace("-\n","-")
    return d_data.rstrip() 
 
def get_pub_time(response):
    #date_time = response.doc('div.content div.titleHead div.newsDate').text()
    #date_time = response.doc("div#article.article span#pubtime_baidu").text()
    
    #return date_time
    
    #timeArray = time.strptime(response, "%Y-%m-%d %H:%M:%S")
    #转换成时间戳
    #timestamp = time.mktime(timeArray)
    return str(response*10)[0:10]
   
def re_search_time(time_str):
    r_str = r"(\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}|\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}|\d{4}-\d{1,2}-\d{1,2})"
    mat = re.search(r_str, time_str)
    if not mat:
        return ""
    return mat.group(0)
 
def re_sub_html(html):
    return re.sub(r'<!--.*?-->','',html)
   
def get_now_time():
    return str(int(time.time())) 

基本处理

 
标签拼接
html = "<h1>%s</h1>" % result["title"]
html += "<div>%s</div>" % response.doc("div#News_Body_Txt_A").html()
result["title"] = response.doc('div.lasttle>p').remove() # 删除标签
result["pub_time"] = response.doc(' div.source ').addClass('beauty')
result["source"] = response.doc('div.article-info > span:contains("来源")').text()
result["html"] = response.doc('div.article_content').remove('div.article_content>div:last-child').html()
result['source'] = response.doc('div.attr span').eq(1).text().replace(u'来源:', '') # eq(index)
response.doc('ul#news_list >li:nth-child(-n+20) > div[class|="txt"] > h3 > a') # 前20个标签
div.newsCon section:nth-child(2) p:nth-last-child(-n+3) 后三个p标签
response.doc("td.STYLE4").parent().parent()('tr').eq(1).text()  eq(index) 0是第一行 1是第二行
response.doc('div.weicode').nextAll().remove()
response.doc("div.Middle4 div.Middle4_body div.txt1").nextAll().remove()
 
content_table = response.doc("div.portlet table.hui12").siblings('table')
对于tbody table tr td 过多的网页提取标签 可以只拿table标签 body > table table table table:nth-child(2) table table td
 
.next() 获得匹配元素集合中每个元素紧邻的同胞元素。如果提供选择器,则取回匹配该选择器的下一个同胞元素。
 
1、.next()方法的作用:指针指向下一条记录,有记录(有值)返回true并把记录内容存入到对应的对象中,也就是obj.next()的obj中。如果没有返回false。
 
2、.next()方法的应用:一般和ResultSet对象和while循环一起使用,去迭代结果集,并在循环中调用getXXX(intfieldIndex)/getXXX(String columnName)方法获取字段值。
 
 
 page = source['page'] if 'page' in source else num  可以指定page=1不翻页  指定全局变量num 翻num页的  就不用再根据频道判断是否翻页
 
删除标签操作
result["html"] = re.sub(r'\<section.*?\<\/section\>','',result["html"],flags=re.S)
result["html"] = re.sub(r'<\/section\>','',result["html"],flags=re.S)
html = pq(result["html"])
result["html"] = html.remove('section').html().replace('\n  \n','')
 
获取content的另一种方式 
def get_content_from_html(html):
    import html2text
    h = html2text.HTML2Text()
    h.ignore_links = True
    # h.ignore_images = True
    d_data = h.handle(html).replace("-\n","-")
    return d_data.rstrip() 
 
def re_search_time(time_str): 正则处理时间
    r_str = r"(\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}|\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}|\d{4}-\d{1,2}-\d{1,2})"
    mat = re.search(r_str, time_str)
    if not mat:
        return ""
    return mat.group(0)
 
def make(time):时间处理
	"n天、小时、分钟、前时间"  print (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d %H:%M")
	str(datetime.datetime.now().month) 获取 当前的年份、月份、日
	处理"今天08:56"这样的时间 time.strftime('%Y-%m-%d', time.localtime())+' '+result["pub_time"].replace('今天','') 或者
		str(datetime.datetime.now().month) + ' '+result["pub_time"].replace('今天','')
	处理a = "20181107" 可以用切片 拼接 a_time = '-'.join([a[0:4],a[4:6],a[6:8]])
 
 
def code(): 编码问题解决
	json.loads(unicode) 直接将Unicode转为json
	data.decode("unicode-escape").encode('utf-8') # unicode 转中文
 
 
pyquery对象,遍历节点 在对节点操作
def index_page(self, response):
        for content in response.doc('article.post div.content').items():
            data= {
            'url': response.save['url'],
            'source_channel' : response.save['source_channel'],
            'source_name' : response.save['source_name'],
            'pub_time':content('div.data span.u-time').text()
                   
            }
            print data
            self.crawl(content('h2>a').attr.href, callback=self.detail_page,save=data)
 
pyspider 默认去重不会对同一地址请求 
循环post请求 地址相同 需要强制对同一URL循环爬取 解决办法发  加上itag参数  记得url后边要加上?问好号
def index_page(self, response):
    detail_url = 'http://news.cqcoal.com/manage/newsaction.do?method:getNewsAddonarticle'
    dict_list = response.json['rows']   
 
    for aid in dict_list:  
        print aid['id']
        url = '%s?id=%s' % (detail_url,'')
        data= {
        'source_channel' : response.save['source_channel'],
        'source_name' : response.save['source_name'],
        'source_typeide' : response.save['typeid'],
        'pub_time': aid['pubdate'],
        'title': aid['title'],
        'editor': aid['fshuser'],
        'source': aid['source'],
        'content': aid['description']       
        }
        timestampStr = datetime.datetime.now().strftime("%Y%m%d_%H%M%S_%f")
        fakeItagForceRecrawl = "%s" % timestampStr
        url = detail_url + "#" + timestampStr
        self.crawl(url,itag=fakeItagForceRecrawl,data={'id':aid['id']}, headers=headers,callback=self.detail_page, save=data, method='POST') 
				    
 
@config(age=1)
    def index_page(self, response):
        source_channel = response.save['source_channel']
        itemList =response.doc('div.trends').items()
        for each in itemList:
            param = {}
            href = each('h3 a').attr.href
            title = each('a').text()
            print('title:'+title)
            pub_time = each('span').text()
            print('pub_time:'+pub_time)
            param["title"] = title
            param["pub_time"] = pub_time
            param.update(response.save)
            if href:
                self.crawl(href, callback=self.detail_page,save = param,headers=header)
 
 
 
@config(priority=1, age=10*24*60*60)
    def detail_page(self, response):
        result = copy.deepcopy(result_template)
        result.update(response.save)
        result["url"] = response.url
        source_channel = response.save['source_channel']
        result["source_name"] = source_name
 
        result["fetch_time"] = get_now_time()
 
        # 需要根据网页内容进行相应提取
        html = None
        html = response.doc("div#pageTxt").html()
        if html:
            result["html"] = html 
            result["content"] = get_content_from_html(html)
            result["title"] = response.save['title']
            pub_time =""
            if response.save.__contains__('pub_time'):
                pub_time = response.save['pub_time']
            else:
                temp = response.doc("div.scd-title em").text()
                if temp.find("今天") !=-1:
                    temp = "%s%s%s%s%s" %(str(datetime.datetime.now().month),"-",str(datetime.datetime.now().day)," ",temp.replace("今天",""))
                else:
                    temp = temp.replace("月","-").replace("日","")
                pub_time ="%s%s%s" %(str(datetime.datetime.now().year),"-",temp)
            print("pub_time:"+pub_time)
            source="蓝鲸TMT网"  
            print("source:"+source)
            result["source"] = source
            result["pub_time"] = str_2_timestamp(pub_time)
   
            self.send_message(self.project_name, result,url=result["url"])
def str_2_timestamp(time_str, fmt="%Y-%m-%d %H:%M:%S"):
    if not time_str:
        return ""
   
    elif time_str.find(':') == -1:
        fmt = "%Y-%m-%d"
    elif len(re.findall(r':',time_str)) == 1:  
        fmt = "%Y-%m-%d %H:%M"
    elif len(re.findall(r':',time_str)) == 2:
        fmt = "%Y-%m-%d %H:%M:%S"
    return int(time.mktime(time.strptime(time_str, fmt)))

结构_model_for_crawl_demo加注释:

#爬取模板:加注释版
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2017-12-05 20:59:56
# Project: boeing

from pyspider.libs.base_handler import *
import re
from pyspider.database.mysql.mysqldb import SQL
import sys  
import os
import time as ti
from dateutil import parser
  
reload(sys)  
sys.setdefaultencoding('utf8')

#图片存放目录
DIR_PATH = "./"  # pyspider默认目录?

class Handler(BaseHandler):
    
    headers= {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding":"gzip, deflate, sdch",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Cache-Control":"max-age=0",
    "Connection":"keep-alive",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
    }

    crawl_config = {
        'itag': 'v1.1',
        "headers" : headers,
        "timeout" : 100000
    }
    
    def __init__(self):
        self.dir_path = DIR_PATH
        self.tool = Tool()
    
    @every(minutes=24 * 60)
    def on_start(self):				#这里设置你要爬取的网页,先登录看看是否对应,否则容易出错
        self.crawl('http://boeing.mediaroom.com/news-releases-statements', callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):				#设置索引页
        for each in response.doc('.archive_nav > a').items():
            year=each.text()
            if(year != "Search"):
                if(year=="2016" or year=="2015"):			#这里设置爬取网页新闻的年份(按年份分类),最好把最新的年份都爬取下来【注意,不是所有的网站都有这个分类!】
                    self.crawl(each.attr.href, callback=self.news_page)
    
    #进入某一年份的index页面            
    def news_page(self, response):
        for each in response.doc('.item').items():
            time=each.find('div').eq(0).text()          # find'div'是找到.item下的所有元素,然后eq(0)获取第0个(首个)元素的text(),即内容
            datetime_struct = parser.parse(time)
            time=datetime_struct.strftime('%Y-%m-%d')   # 这里的功能是,将网页代表时间的字符串格式化为%Y-%m-%d(原网页是英文格式)
            self.crawl(each.find('div').find('a').attr.href, save={'time': time},callback=self.news,connect_timeout = 5000, timeout = 20000)    #调取新闻页。注意,所有的time都是提前在index页获取的,因此需要传递给最后的处理函数
        for each_page in response.doc('.table_footer > b > a').items():
            self.crawl(each_page.attr.href, callback=self.news_page2)   #调取其它新闻页
    
    #基于该年份,调取其它index页(一个年份可能对应多个index页面,一个index页面又对应多个新闻页)       
    def news_page2(self, response):
        for each in response.doc('.item').items():
            time=each.find('div').eq(0).text()  #同理,以下
            datetime_struct = parser.parse(time)
            time=datetime_struct.strftime('%Y-%m-%d')
            self.crawl(each.find('div').find('a').attr.href, save={'time': time},callback=self.news,connect_timeout = 5000, timeout = 20000)    # each.find('div').find('a').attr.href是获得新闻页的url
    
    #主方法,进入新闻页
    def news(self, response):
        time=response.save['time']  #记录已经格式化的时间,继续往下传递
        if response.doc('#assets_20295_130083-117_tab_link'):   # 这里的if else是用来判断新闻有无图片
            self.crawl(response.doc('#assets_20295_130083-117_tab_link').attr.href,save={'time': time}, callback=self.detail_page,validate_cert=False,connect_timeout = 5000, timeout = 20000)
        else:
            self.crawl(response.url, save={'time': time},callback=self.detail_page,validate_cert=False,connect_timeout = 5000, timeout = 20000)
        
    @config(priority=2)
    def detail_page(self, response):
        title=response.doc('.wd_news_releases-detail > h1').text()  #通过正则表达式获取新闻题目
        time=response.save['time']  #最终获取到时间
        content = ''    #初始化新闻内容为空,字符串
        for each in response.doc('.news_body > p').items():  # 对于每一个在.news_body > p中的内容都添加到content中
            content += each.text()
        url = response.url      # 保存网址为当前网址
        picture_url = ''    #与content同理
        picture_local_path = ''
        file_title = re.sub('[\/:*?"<>|]','-',title)    # ???某个正则表达式?
        imgDir = self.dir_path
 #处理图片的方法1:
        for imgElem in response.doc('.detail_image > img').items():
            imgUrl = imgElem.attr.src
            picture_url += imgUrl + ';'
            if imgUrl:
                #获取图片文件后缀
                extension = self.tool.get_extension(imgUrl)
                name = self.tool.get_name(imgUrl)
                #拼接图片名
                file_name = name + "." + extension
                picture_local_path += ';' + file_name
                self.crawl(imgUrl,callback=self.save_img,save={"file_name":file_name, "imgDir":imgDir},validate_cert=False, connect_timeout = 5000, timeout = 20000)
  #处理图片的方法2:               
        for imgElem in response.doc('.PRN_ImbeddedAssetReference > p > img').items():
            imgUrl = imgElem.attr.src
            picture_url += imgUrl + ';'
            if imgUrl:
                #获取图片文件后缀
                extension = self.tool.get_extension(imgUrl)
                name = self.tool.get_name(imgUrl)
                #拼接图片名
                file_name = name + "." + extension
                picture_local_path += ';' + file_name
                self.crawl(imgUrl,callback=self.save_img,save={"file_name":file_name, "imgDir":imgDir},validate_cert=False, connect_timeout = 5000, timeout = 30000)   
                
        return {
            "title":title,
            "introduction":"null",
            "time":time,
            "content":content,
            "keywords":"null",
            "name":"boeing",      #这里根据你建的表格名修改
            "source":"原创",
            "url":url,
            "picture_url":picture_url,
            "picture_local_path":picture_local_path
        }
    
    #保存图片
    def save_img(self,response):
        content = response.content
        file_name = response.save["file_name"]
        imgDir = response.save["imgDir"]
        file_path = imgDir + file_name
        self.tool.save_img(content,imgDir,file_path)
    
    def on_result(self,result):
        if not result or not result['title']:
            return
        sql = SQL()
        sql.insert('boeing',**result)       #这里也要对应修改哦
        
#工具类    
class Tool:
    #保存图片
    def save_img(self,content,imgDir,path):
        if not os.path.exists(imgDir):                         
            os.makedirs(imgDir)
        f = open(path,"wb" )        #写入文件
        f.write(content)
        f.close()

    #获取url后缀名
    def get_extension(self,url):                            
        extension = url.split(".")[-1]
        return extension 
    
    #获取图片名
    def get_name(self,url):
        name=url.split("/")[-1].split(".")[0]
        return name

功能_for_compositesworld_详注:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-03-18 18:13:33
# Project: compositesworld
#问题:
#1. 爬取introduction项的正则表达式不够准确,一部分项爬不下来      ---已解决(注意分析网站的html,而不是一味地依赖CSS选择器)
#2. 如何动态、高效地控制爬取的年份截止日期?比如,最早到2016.01.01
#3. 在单步调试,尝试调用保存图片函数时出现 Exception: HTTP 599:…… OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to d2n4wb9orp1vta.cloudfront.net:443  错误     ---已解决(似乎与网络连接状况有关,但正常运行时反而没什么问题。暂时忽略)
#4. python反反爬虫机制(代理IP。sleep延时:防止爬取过快导致封IP)      ---已解决。 使用ti.sleep(t),t为参数,单位为秒。如:ti.time.sleep(3),表示停顿3秒后继续执行

from pyspider.libs.base_handler import *        #这个库中定义了爬取的各种控制函数和方法
import re   #re就是regular expression,即正则表达式。正则表达式(通项公式)是用来简洁表达一组字符串的表达式。优势是简洁,一行胜千言。这个库主要用于字符串匹配。
from pyspider.database.mysql.mysqldb import SQL
import sys      #用于接下来修改编码格式
import os       #OS库提供了使用各种操作系统功能的接口
import time as ti       # 用于延时控制
from dateutil import parser       #日期处理库,parser子库是根据字符串解析成datetime

#编码转换
reload(sys)     #Python运行的时候首先加载了site.py,在site.py文件里有这么一段代码:
                #    if hasattr(sys, "setdefaultencoding"):
                #        del sys.setdefaultencoding
                #可以看出,在sys加载后,setdefaultencoding方法被删除了,所以我们要通过重新导入sys来设置系统编码
sys.setdefaultencoding('utf8')	#设置默认编码,UTF-8

#图片存放目录
DIR_PATH = "./"      # ./ 的意思是:当前目录(登录pyspider时)

class Handler(BaseHandler):
    
    headers= {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding":"gzip, deflate, sdch",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Cache-Control":"max-age=0",
    "Connection":"keep-alive",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
    }

    crawl_config = {
        'itag': 'v1.1',		#修改这个tag号,可以重新启动爬取
        "headers" : headers,
        "timeout" : 100000
    }
    
    
    def __init__(self):
        self.dir_path = DIR_PATH
        self.tool = Tool()
    
    
    @every(minutes=24 * 60)			# @every修饰器,表示每24小时会执行一次
    def on_start(self):				# 这里设置你要爬取的网页URL(最好是列表的形式,按更新顺序排列),先登录看看是否对应,否则容易出错
        self.crawl('https://www.compositesworld.com/news/list',validate_cert=False, callback=self.index_page)	# self.crawl 告诉 pyspider 抓取指定页面,然后使用 callback 函数对结果进行解析,并调用接下来的index_page
# 总结:
# 通过 on_start 回调函数,作为爬取的入口点,当点击主面板上的 run 的时候,就是调用这个函数,启动抓取。
# self.crawl 告诉调度器,我们需要抓取 'https://www.compositesworld.com/news/list' 这个页面,然后使用 callback=self.index_page 这个回调函数进行解析。
# 所有 return 的内容默认会被捕获到 resultdb 中,可以直接在 WEBUI 上看到(如果结果)。

    
    @config(age=10 * 24 * 60 * 60)	#在这表示我们认为 10 天内页面有效,不会再次进行更新抓取
    #由此,注意,pyspider不会抓取同一个URL两次(永久丢弃),即使修改了代码,对于第一次运行该项目并修改并第二次运行该项目的初学者来说,这是非常常见的。
    #以上是引述。但是,在实际操作WebUI时,通过单步调试可以很方便地抓取同一个页面。
    def index_page(self, response):				#设置索引页
        for each in response.doc('.headline > a').items(): 
            self.crawl(each.attr.href, validate_cert=False,callback=self.detail_page)
        next = response.doc('a[aria-label="Next"]')
        self.crawl(next.attr.href,validate_cert=False, connect_timeout = 5000, timeout = 20000,callback=self.index_page)
        # validate_cert=False 参数,用来解决SSL证书问题,对于以“https”开头的网站,必须添加
    
    @config(priority=2)
    def detail_page(self, response):
        # 使用CSS正则表达式工具修改doc()中的路径,进行页面上的元素的采集
        title = response.doc('.content-headline').text()
        introduction = response.doc('.col-sm-12 > h1').text()
        time = response.doc('.cell-vert-center > div > span').text()
        time = time[10:] #我这里采用了截取字符段的形式,获得真正的时间字符子序列(不通用!!!)
        datetime_struct = parser.parse(time)
        time=datetime_struct.strftime('%Y-%m-%d')   # 这里的功能是,将网页代表时间的字符串格式化为%Y-%m-%d(原网页是英文格式)
        content = response.doc('#short > div > div > p').text()
        url = response.url
        picture_url = ''    #与content同理
        picture_local_path = ''
        file_title = re.sub('[\/:*?"<>|]','-',title)
        imgDir = self.dir_path
        for imgElem in response.doc('picture > img').items():
            imgUrl = imgElem.attr.src
            imgUrl = imgUrl[:-10]  #为了截掉后面多余的字段";width=560",总共10个字符(不通用!!!)
            picture_url += imgUrl + ';'
            if imgUrl:
                #获取图片文件后缀
                extension = self.tool.get_extension(imgUrl)
                name = self.tool.get_name(imgUrl)
                #拼接图片名
                file_name = name + "." + extension
                picture_local_path += ';' + file_name
                self.crawl(imgUrl,callback=self.save_img,save={"file_name":file_name, "imgDir":imgDir},validate_cert=False, connect_timeout = 5000, timeout = 20000)   
                # 这里回调了save_img函数,在单步调试时可以明显看到

    # def detail_page(self, response)作为结果返回一个对象。
    # 结果将被resultdb默认捕获。
    # 可以通过覆盖on_result(self, result)自己管理结果的方法。        
        return {	# 与你建立的表结构对应。这是python中的字典结构,即“键-值对”
            "title":title,
            "introduction":introduction,
            "time":time,
            "content":content,
            "keywords":"null",
            "name":"compositesworld",      #这里根据你建的表格名修改
            "source":"原创",
            "url":url,
            "picture_url":picture_url,
            "picture_local_path":picture_local_path
        }

    
    #保存图片
    def save_img(self,response):    # 可以看到,上面save中保存的内容其实通过response传了过来
        content = response.content  # resp.content返回的是bytes型也就是二进制的数据,resp.text返回的是Unicode型的数据。
                                    # 简而言之,如果你想取文本,可以通过r.text。    如果想取图片,文件,则可以通过r.content。
        file_name = response.save["file_name"]
        imgDir = response.save["imgDir"]
        file_path = imgDir + file_name
        self.tool.save_img(content,imgDir,file_path)
    
    #数据存储函数:on_result方法
    # 调试的时候建议将 on-result 整个移除,便于显示实时获取结果。最后再保存到数据库
    def on_result(self,result): 		
        if not result or not result['title']:	# 如果没到最后,继续返回数据
            return
        sql = SQL()		# 覆盖默认方法,使用mysqldb文件中定义的方法,连接数据库
        sql.insert('compositesworld',**result)	#将结果插入到表格。同理,这里根据你建的表格名修改    
        
    
#工具类    
class Tool:
    #保存图片
    def save_img(self,content,imgDir,path):
        if not os.path.exists(imgDir): 	# os.path.exists(name)判断是否存在文件或目录name
            os.makedirs(imgDir)  # os.makedirs() 方法用于递归创建目录
        f = open(path,"wb" )     # wb 以只写方式打开
        f.write(content)        # 写入文件
        f.close()

    #获取url后缀名
    def get_extension(self,url):                            
        extension = url.split(".")[-1]
        return extension 
    
    #获取图片名
    def get_name(self,url):
        name=url.split("/")[-1].split(".")[0]
        return name

for_jeccomposites_伪宏控制__范式编程_注译:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-03-19 22:26:12
# Project: jeccomposites
#问题:
#1. 爬取下来的content是一连串的字符串,没有考虑到换行的问题,可能需要添加'\n'?
#2. 爬取这个网站的content似乎有一段开头是单独放在title的class后面的,或许添加该段?
#3. 是否应该增加一个 tag 标签属性,因为很多网站只有tag但没有keywords,或者两者认为一致?   
#4. [Caution]图片存储功能出现异常错误。显示TypeError与'NoneType'和Unicode'有关   ----已解决(第一,os.makedirs的返回值不是路径。改正这个之后。第二,非常坑!一个意想不到的意外错误!!!!与空格、制表符对齐的区别有关,两者不能混用!!!)


#**********************************************************************************----------~~~~~~~~\
#伪宏控制__范式编程
#------(理论上)你只需要在这里[正确]填入所有信息,整个程序即可运行!【只适用于单一index的爬取。多重分类页面,或者需要对采集的数据做进一步规范化,则必须在后面相应地方改进】
project_name = "jeccomposites" 		#你的项目 的名称
website_url_initial = 'http://www.jeccomposites.com/knowledge/international-composites-news'  #你爬取的初始网页(index页) 的地址
detail_page_css = '.nodetitle > a'							#新闻页面链接 	的CSS表达式
next_page_css = '.pager-next > a'							#下一页链接 	的CSS表达式
title_css = '.content > h1'									#新闻标题		的CSS表达式
introduction_css = '.content-block-txt > p'					#新闻简介		的CSS表达式
time_css = '.content-block-txt > div'						#发布时间		的CSS表达式
content_css = '.block-system > div > div div > div > p'		#新闻内容		的CSS表达式
img_css = '.content > a > img'								#新闻图片		的CSS表达式
keywords_css = 'null'										#关键词,一般页面中无,因此默认为空。#!【重要:如果其他的 *_css 在网页中也找不到对应项的话,可以填'null',程序将自动返回空值】
source_declaration = "原创"									#原创声明,一般不改动
#**********************************************************************************-----------~~~~~~~/

from pyspider.libs.base_handler import *        #这个库中定义了爬取的各种控制函数和方法
import re   #re就是regular expression,即正则表达式。正则表达式(通项公式)是用来简洁表达一组字符串的表达式。优势是简洁,一行胜千言。这个库主要用于字符串匹配。
from pyspider.database.mysql.mysqldb import SQL
from pyspider.database.mysql.mysqldb_new import SQL as SQL_new
import sys      #用于接下来修改编码格式
import os       #OS库提供了使用各种操作系统功能的接口
import time as ti       # 用于延时控制
from dateutil import parser       #日期处理库,parser子库是根据字符串解析成datetime

#根据项目名称,自动创建表
sql_new = SQL_new()
sql_new.create_table(project_name)


#图片存放目录【在当前目录自动创建项目子目录,分类各项目的爬取内容。可实现多项目的同时爬取,而内容分开】
path_for_project = "./"+project_name+"/"     # ./ 的意思是:当前目录(登录pyspider时)
if not os.path.exists(path_for_project):
    os.makedirs(path_for_project)
    DIR_PATH = path_for_project
else:
    DIR_PATH = path_for_project
#注意哦,“data”文件夹是pyspider启动时自动生成的,其中的db文件是用来默认储存捕获的数据的。但是,我们已经实现了on_result方法把数据传给了Mysql,所以这data文件夹是不起作用的,因此可以忽略。

#编码转换
reload(sys)     #Python运行的时候首先加载了site.py,在site.py文件里有这么一段代码:
                #    if hasattr(sys, "setdefaultencoding"):
                #        del sys.setdefaultencoding
                #可以看出,在sys加载后,setdefaultencoding方法被删除了,所以我们要通过重新导入sys来设置系统编码
sys.setdefaultencoding('utf8')  #设置默认编码,UTF-8


class Handler(BaseHandler):
    
    headers= {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding":"gzip, deflate, sdch",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Cache-Control":"max-age=0",
    "Connection":"keep-alive",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
    }

    crawl_config = {
        'itag': 'v1.1',     #修改这个tag号,可以重新启动爬取
        "headers" : headers,
        "timeout" : 100000
    }
    
    
    def __init__(self):
        self.dir_path = DIR_PATH
        self.tool = Tool()
    
    
    @every(minutes=24 * 60)         # @every修饰器,表示每24小时会执行一次
    def on_start(self):             # 这里设置你要爬取的网页URL(最好是列表的形式,按更新顺序排列),先登录看看是否对应,否则容易出错
        self.crawl(website_url_initial,validate_cert=False, callback=self.index_page)    # self.crawl 告诉 pyspider 抓取指定页面,然后使用 callback 函数对结果进行解析,并调用接下来的index_page
# 总结:
# 通过 on_start 回调函数,作为爬取的入口点,当点击主面板上的 run 的时候,就是调用这个函数,启动抓取。
# self.crawl 告诉调度器,我们需要抓取 '某个url' 这个页面,然后使用 callback=self.index_page 这个回调函数进行解析。
# 所有 return 的内容默认会被捕获到 resultdb 中,可以直接在 WEBUI 上看到(如果结果)。

    
    @config(age=10 * 24 * 60 * 60)  #在这表示我们认为 10 天内页面有效,不会再次进行更新抓取
    #由此,注意,pyspider不会抓取同一个URL两次(永久丢弃),即使修改了代码,对于第一次运行该项目并修改并第二次运行该项目的初学者来说,这是非常常见的。
    #以上是引述。但是,在实际操作WebUI时,通过单步调试可以很方便地抓取同一个页面。
    def index_page(self, response):             #设置索引页
        for each in response.doc(detail_page_css).items(): 
            self.crawl(each.attr.href, validate_cert=False,callback=self.detail_page)
        next = response.doc(next_page_css)
        self.crawl(next.attr.href,validate_cert=False, connect_timeout = 5000, timeout = 20000,callback=self.index_page)
        # validate_cert=False 参数,用来解决SSL证书问题,对于以“https”开头的网站,必须添加
    
    @config(priority=2)
    def detail_page(self, response):
        # 使用CSS正则表达式工具修改doc()中的路径,进行页面上的元素的采集
        title = title_css
        if (title_css != 'null'):
        	title = response.doc(title_css).text()
        introduction = introduction_css
        if (introduction_css != 'null'):
        	introduction = response.doc(introduction_css).text()
        time = time_css
        if (time_css != 'null'):
        	time = response.doc(time_css).text()
#        time = time[10:] #我这里采用了截取字符段的形式,获得真正的时间字符子序列(不通用!!!)
        	datetime_struct = parser.parse(time)
        	time=datetime_struct.strftime('%Y-%m-%d')   # 这里的功能是,将网页代表时间的字符串格式化为%Y-%m-%d(原网页是英文格式)
        content = content_css
        if (content_css != 'null'):
        	content = response.doc(content_css).text()
        keywords = keywords_css
        if (keywords_css != 'null'):
        	keywords = response.doc(keywords_css).text()        	
        url = response.url
        picture_url = ''
        picture_local_path = ''
        file_title = re.sub('[\/:*?"<>|]','-',title)
        imgDir = self.dir_path
        for imgElem in response.doc(img_css).items():
            imgUrl = imgElem.attr.src
#            imgUrl = imgUrl[:-10]  #为了截掉后面多余的字段";width=560",总共10个字符(不通用!!!)
            if imgUrl and self.tool.get_name(imgUrl) != 'logo':  #这个网站每个网页都莫名其妙地爬两个logo图片下来,因此要过滤掉(不通用!!!)
                picture_url += imgUrl + ';'  #picture_url和picture_local_path都需要滞后于这个过滤操作
                #获取图片文件后缀
                extension = self.tool.get_extension(imgUrl)
                name = self.tool.get_name(imgUrl)
                #拼接图片名
                file_name = name + "." + extension
                picture_local_path += ';' + file_name
                self.crawl(imgUrl,callback=self.save_img,save={"file_name":file_name, "imgDir":imgDir},validate_cert=False, connect_timeout = 5000, timeout = 20000)   
                # 这里回调了save_img函数,在单步调试时可以明显看到

    # def detail_page(self, response)作为结果返回一个对象。
    # 结果将被resultdb默认捕获。
    # 可以通过覆盖on_result(self, result)自己管理结果的方法。        
        return {    # 与你建立的表结构对应。这是python中的字典结构,即“键-值对”
            "title":title,
            "introduction":introduction,
            "time":time,
            "content":content,
            "keywords":keywords,
            "name":project_name,      #这里根据你建的表格名修改
            "source":source_declaration,
            "url":url,
            "picture_url":'null' if picture_url == '' else picture_url,
            "picture_local_path":'null' if picture_local_path == '' else picture_local_path
        }

    
    #保存图片
    def save_img(self,response):    # 可以看到,上面save中保存的内容其实通过response传了过来
        content = response.content  # resp.content返回的是bytes型也就是二进制的数据,resp.text返回的是Unicode型的数据。
                                    # 简而言之,如果你想取文本,可以通过r.text。    如果想取图片,文件,则可以通过r.content。
        file_name = response.save["file_name"]
        imgDir = response.save["imgDir"]
        file_path = imgDir + file_name
        self.tool.save_img(content,imgDir,file_path)
    
    #数据存储函数:on_result方法
    def on_result(self,result):         
        if not result or not result['title']:   # 如果没到最后,继续返回数据
            return
        sql = SQL()     # 覆盖默认方法,使用mysqldb文件中定义的方法,连接数据库
        sql.insert(project_name,**result)  #将结果插入到表格。同理,这里根据你建的表格名修改    
        
    
#工具类    
class Tool:
    #保存图片
    def save_img(self,content,imgDir,path):
        if not os.path.exists(imgDir):  # os.path.exists(name)判断是否存在文件或目录name
            os.makedirs(imgDir)  # os.makedirs() 方法用于递归创建目录
        f = open(path,"wb" )     # wb 以只写方式打开
        f.write(content)        # 写入文件
        f.close()

    #获取url后缀名
    def get_extension(self,url):                            
        extension = url.split(".")[-1]
        return extension 
    
    #获取图片名
    def get_name(self,url):
        name=url.split("/")[-1].split(".")[0]
        return name

for_compositesworld_改进版_注译

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-03-19 22:26:12
# Project: Model
#问题:
#1. ValueError(u'String does not contain a date)。time的抓取规则仍待改善。对于特别难分离的日期,需要更先进的手段。  ---已解决,注意首先要选择合适、准确、无歧义的CSS表达式。再进行时间格式的处理!或者选取更合适的日期项,如在首页中选择。
#2. 仍然有少量OpenSSL connet SSL_ERROR_SYSCALL型的错误。


#**********************************************************************************----------~~~~~~~~\
#伪宏控制__范式编程
#------(理论上)你只需要在这里[正确]填入所有信息,整个程序即可运行!【只适用于单一index的爬取。多重分类页面,或者需要对采集的数据做进一步规范化,则必须在后面相应地方改进】
project_name = "compositesworld"        #你的项目 的名称
website_url_initial = 'https://www.compositesworld.com/news/list'  #你爬取的初始网页(index页) 的地址
detail_page_css = '.headline > a'                           #新闻页面链接     的CSS表达式
next_page_css = 'a[aria-label="Next"]'                          #下一页链接  的CSS表达式
title_css = '.content-headline'                                 #新闻标题       的CSS表达式
introduction_css = '.col-sm-12 > h1'                    #新闻简介       的CSS表达式
time_css = '.clearfix span[property="dc:created"]'                     #发布时间       的CSS表达式
content_css = '#short > div > div > p'      #新闻内容       的CSS表达式
img_css = 'picture > img'                               #新闻图片       的CSS表达式
keywords_css = 'null'                                       #关键词,一般页面中无,因此默认为空。#!【重要:如果其他的 *_css 在网页中也找不到对应项的话,可以填'null',程序将自动返回空值】
source_declaration = "原创"                                   #原创声明,一般不改动
#**********************************************************************************-----------~~~~~~~/

from pyspider.libs.base_handler import *        #这个库中定义了爬取的各种控制函数和方法
import re   #re就是regular expression,即正则表达式。正则表达式(通项公式)是用来简洁表达一组字符串的表达式。优势是简洁,一行胜千言。这个库主要用于字符串匹配。
from pyspider.database.mysql.mysqldb import SQL
from pyspider.database.mysql.mysqldb_new import SQL as SQL_new
import sys      #用于接下来修改编码格式
import os       #OS库提供了使用各种操作系统功能的接口
import time as ti       # 用于延时控制
from dateutil import parser       #日期处理库,parser子库是根据字符串解析成datetime

#根据项目名称,自动创建表
sql_new = SQL_new()
sql_new.create_table(project_name)


#图片存放目录【在当前目录自动创建项目子目录,分类各项目的爬取内容。可实现多项目的同时爬取,而内容分开】
path_for_project = "./"+project_name+"/"     # ./ 的意思是:当前目录(登录pyspider时)
if not os.path.exists(path_for_project):
    os.makedirs(path_for_project)
    DIR_PATH = path_for_project
else:
    DIR_PATH = path_for_project
#注意哦,“data”文件夹是pyspider启动时自动生成的,其中的db文件是用来默认储存捕获的数据的。但是,我们已经实现了on_result方法把数据传给了Mysql,所以这data文件夹是不起作用的,因此可以忽略。

#编码转换
reload(sys)     #Python运行的时候首先加载了site.py,在site.py文件里有这么一段代码:
                #    if hasattr(sys, "setdefaultencoding"):
                #        del sys.setdefaultencoding
                #可以看出,在sys加载后,setdefaultencoding方法被删除了,所以我们要通过重新导入sys来设置系统编码
sys.setdefaultencoding('utf8')  #设置默认编码,UTF-8


class Handler(BaseHandler):
    
    headers= {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding":"gzip, deflate, sdch",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Cache-Control":"max-age=0",
    "Connection":"keep-alive",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
    }

    crawl_config = {
        'itag': 'v1.1',     #修改这个tag号,可以重新启动爬取
        "headers" : headers,
        "timeout" : 100000
    }
    
    
    def __init__(self):
        self.dir_path = DIR_PATH
        self.tool = Tool()
    
    
    @every(minutes=24 * 60)         # @every修饰器,表示每24小时会执行一次
    def on_start(self):             # 这里设置你要爬取的网页URL(最好是列表的形式,按更新顺序排列),先登录看看是否对应,否则容易出错
        self.crawl(website_url_initial,validate_cert=False, callback=self.index_page)    # self.crawl 告诉 pyspider 抓取指定页面,然后使用 callback 函数对结果进行解析,并调用接下来的index_page
# 总结:
# 通过 on_start 回调函数,作为爬取的入口点,当点击主面板上的 run 的时候,就是调用这个函数,启动抓取。
# self.crawl 告诉调度器,我们需要抓取 '某个url' 这个页面,然后使用 callback=self.index_page 这个回调函数进行解析。
# 所有 return 的内容默认会被捕获到 resultdb 中,可以直接在 WEBUI 上看到(如果结果)。

    
    @config(age=10 * 24 * 60 * 60)  #在这表示我们认为 10 天内页面有效,不会再次进行更新抓取
    #由此,注意,pyspider不会抓取同一个URL两次(永久丢弃),即使修改了代码,对于第一次运行该项目并修改并第二次运行该项目的初学者来说,这是非常常见的。
    #以上是引述。但是,在实际操作WebUI时,通过单步调试可以很方便地抓取同一个页面。
    def index_page(self, response):             #设置索引页
        for each in response.doc(detail_page_css).items(): 
            self.crawl(each.attr.href, validate_cert=False,callback=self.detail_page)
        next = response.doc(next_page_css)
        self.crawl(next.attr.href,validate_cert=False, connect_timeout = 5000, timeout = 20000,callback=self.index_page)
        # validate_cert=False 参数,用来解决SSL证书问题,对于以“https”开头的网站,必须添加
    
    @config(priority=2)
    def detail_page(self, response):
        # 使用CSS正则表达式工具修改doc()中的路径,进行页面上的元素的采集
        title = title_css
        if (title_css != 'null'):
            title = response.doc(title_css).text()
        introduction = introduction_css
        if (introduction_css != 'null'):
            introduction = response.doc(introduction_css).text()
        time = time_css         #以下都是在改日期判断
        if (time_css != 'null'):
            time = response.doc(time_css).text()
            time.strip()  #先作去空格处理
            time = time[10:] #我这里采用了截取字符段的形式,获得真正的时间字符子序列(不通用!!!)
            datetime_struct = parser.parse(time)
            time=datetime_struct.strftime('%Y-%m-%d')   # 这里的功能是,将网页代表时间的字符串格式化为%Y-%m-%d(原网页是英文格式)
        content = content_css
        if (content_css != 'null'):
            content = response.doc(content_css).text()
        keywords = keywords_css
        if (keywords_css != 'null'):
            keywords = response.doc(keywords_css).text()            
        url = response.url
        picture_url = ''
        picture_local_path = ''
        file_title = re.sub('[\/:*?"<>|]','-',title)
        imgDir = self.dir_path
        for imgElem in response.doc(img_css).items():
            imgUrl = imgElem.attr.src
            imgUrl = imgUrl[:-10]  #为了截掉后面多余的字段";width=560",总共10个字符(不通用!!!)
            if imgUrl:  
                picture_url += imgUrl + ';'  #picture_url和picture_local_path都需要滞后于这个过滤操作
                #获取图片文件后缀
                extension = self.tool.get_extension(imgUrl)
                name = self.tool.get_name(imgUrl)
                #拼接图片名
                file_name = name + "." + extension
                picture_local_path += ';' + file_name
                self.crawl(imgUrl,callback=self.save_img,save={"file_name":file_name, "imgDir":imgDir},validate_cert=False, connect_timeout = 5000, timeout = 20000)   
                # 这里回调了save_img函数,在单步调试时可以明显看到

    # def detail_page(self, response)作为结果返回一个对象。
    # 结果将被resultdb默认捕获。
    # 可以通过覆盖on_result(self, result)自己管理结果的方法。        
        return {    # 与你建立的表结构对应。这是python中的字典结构,即“键-值对”
            "title":title,
            "introduction":introduction,
            "time":time,
            "content":content,
            "keywords":keywords,
            "name":project_name,      #这里根据你建的表格名修改
            "source":source_declaration,
            "url":url,
            "picture_url":'null' if picture_url == '' else picture_url,
            "picture_local_path":'null' if picture_local_path == '' else picture_local_path
        }

    
    #保存图片
    def save_img(self,response):    # 可以看到,上面save中保存的内容其实通过response传了过来
        content = response.content  # resp.content返回的是bytes型也就是二进制的数据,resp.text返回的是Unicode型的数据。
                                    # 简而言之,如果你想取文本,可以通过r.text。    如果想取图片,文件,则可以通过r.content。
        file_name = response.save["file_name"]
        imgDir = response.save["imgDir"]
        file_path = imgDir + file_name
        self.tool.save_img(content,imgDir,file_path)
    
    #数据存储函数:on_result方法
    def on_result(self,result):         
        if not result or not result['title']:   # 如果没到最后,继续返回数据
            return
        sql = SQL()     # 覆盖默认方法,使用mysqldb文件中定义的方法,连接数据库
        sql.insert(project_name,**result)  #将结果插入到表格。同理,这里根据你建的表格名修改    

    
#工具类    
class Tool:
    #保存图片
    def save_img(self,content,imgDir,path):
        if not os.path.exists(imgDir):  # os.path.exists(name)判断是否存在文件或目录name
            os.makedirs(imgDir)  # os.makedirs() 方法用于递归创建目录
        f = open(path,"wb" )     # wb 以只写方式打开
        f.write(content)        # 写入文件
        f.close()

    #获取url后缀名
    def get_extension(self,url):                            
        extension = url.split(".")[-1]
        return extension 
    
    #获取图片名
    def get_name(self,url):
        name=url.split("/")[-1].split(".")[0]
        return name

weinxin
QQ群:20764411
QQ群扫码加群
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: