你是如何开始能写python爬虫?

红牛王 发布于 2017/05/24 11:45
阅读 258
收藏 0

忘记写id了 再编辑一下 镇楼图id=58504168)动机十分简单!因为想下载p站的图片!!!python以前学过没用起来,然后为了实现这个目标又把python的教程全部看了一遍(哭)期间熟练了py,get到了选择器bs4,反反复复阅读re的语法……;w; 然后下面是当时开心的在空间发表的日志:目前的版本只是为了自己用。。。。。。。所以很粗糙,后期是要修改的 不过就第一次写爬虫的我来说达到了目的了,感觉很开心暂且把当下的代码分享一下P.S 创建文件夹的功能也实现了mk_dir函数,但是后期被窝删掉了。因为编码的问题,无法在创建下的文件夹保存图片。即使用了codecs模块也…… 留给以后吧。还有就是偷了下懒,没有改,其实不用那么多get_.*函数应该是根据用户选项自动更改url,后面都一样。下面是当时记录的过程日志============以下是我整个实践过程中的日志和代码(我基本上是从0开始的) 开始准备需要知道的0 我要实现一个什么样的功能?具体的实现逻辑?1 可能会遇到什么问题? 需要解决哪些问题?2 我要用哪种语言来写?3 我需要掌握哪些知识?4 以后如果重写想要扩展哪些功能?----------------------------------------------------------【0】 实现一个自动扒下p站综合日,周,月图片的脚本   步骤:1 登录 输入user和password       2 如果用户名和密码错误:           提示重新输入         否则:            开始扒图片,默认路径~/图片/pixiv/(当日日期)       3  下载完毕通知【1】 可能遇到/需要解决:    1 下载到一半突然中断    2 pixiv自己可能出现的错误    3 让脚本自动打开原始大小的图片。    4 内存不足时提醒    5 不能下载重复的图片【2】用哪种语言:python2.7【3】需要掌握的知识:    1.python爬虫         Urllib库的使用,Cookie,Scrapt框架(ImagePipeline,Signal,内置中间件)    2.linux基础    3.正则表达式    4.一些基本的网页知识。【4】希望以后可以实现搜索图片后,自动下载大于四星的作品。(用到正则表达式?)【5】所以实现/学习的顺序(?)1 实现脚本登录pixiv2 实现下载固定页面的图片3 实现下载日榜打开后的页面的图片(非缩略图,下同)    实现下载提示(下载了几张)    下载时新建今日日期的文件夹,并保存到其中4 实现下载月榜打开后的页面图片5 实现下载新秀后的页面的图片6 根据输入的不同,下载的榜单有所变化是否要使用Proxy呢?思考学习资料:    教程:Python爬虫学习系列教程    搜索引擎:google  --------------------------------------------------7.11看教程学习urllib2库:Request,response,POST和GET(动态网页)POST方式传送:登录一个网站,设置一个字典values并用urlencode将字典编码名为data。给request传入两个参数 url和data即可实现登录。返回的是登录后呈现的页面内容。GET方式传送#*************************************************************#2016年7月12日其实蛮简单的,1h的时间内很快就实现了脚本登录pixiv o(∩∩)o.思考了一下要不要使用代理,暂且看不出来要使用代理的地方=。=学习了cookie保存到变量,cookie保存到文件以及文件中获取cookie并访问的方法。_(:3_|/_)哦莫西哟~优化:    加了timeout 【完成】    加了URLError的提醒【完成】    设置Cookie【完成】接下来实现下载固定页面的图片=-=||因为正则表达式不太熟用下beautifulsoup4? = =||看了爬虫框架概述教程1,大概明白了Scrapy的组件和工作流程。下载scrapy失败,我还是先睡个午觉再继续把Zzz 困了咩-----------------------------------------------------首先先吐槽一下,可能是修地铁的家伙们把网线给卡擦了x一栋楼都没网。然后看老妈的脸色被托到了姥姥家,同样是成年人思考的深度却大不相同。2016年7月15日阿 我就说我不太擅长坚持么x一下子隔了3天= =最后梦到有人说自己不坚持这才勉勉强强到电脑旁,可是(看了看表22时21分23秒)貌似该睡觉了xxx不过。。这漫长的三天还包括我绝食的2天以及因为不想一个人再家准备食物强迫回姥姥的一天(,肚子饿完全没办法思考。对那个冥顽不化的老妈没有办法x 玩了玩手机22时51分17秒恐怕要16日继续写了。。。。好颓废日榜的图片链接分析(http://www.pixiv.net/member_illust.php?mode=medium&illust_id=作品idhttp://www.pixiv.net/member_illust.php?mode=manga&illust_id=作品idmode=manga的时候是漫画mode=medium的时候是单幅画"[pixiv] 総合デイリーランキング 2016年9月13日"今日榜单的页面class="work  _work "【<div class="ranking-image-item"><a href="member_illust.php?mode=medium&amp;illust_id=57881432&amp;uarea=daily&amp;ref=rn-b-4-thumbnail-3" class="work  _work " target="_blank"><div class="_layout-thumbnail"><img src="http://source.pixiv.net/www/images/common/transparent.gif" alt="" class="_thumbnail ui-scroll-view" data-filter="lazy-image"  data-src="http://i1.pixiv.net/c/240x480/img-master/img/2016/07/13/06/30/01/57881432_p0_master1200.jpg"></div></a></div><h2>】分析后得出即”class="work  _work " 之前a href=“之后的链接即作品所在链接即【<div class="ranking-image-item"><a href="】之后,【"】之前的——正则表达式啊啊啊啊完成了:    分析日榜页面代码------------------------------------------------------2016年7月16日如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示<body>和<b>标签都应该被找到import refor tag in soup.find_all(re.compile("^b")):    print(tag.name)框架越来越明确。首先用面向对象改写了以下代码其次就是发现了BeautifulSoup这个利器(突然觉得完全无需用Scrap)- -大概思路是用re+BeautifulSoup扒下来日榜作品的mode和illust_id然后再把获取的mode和illust_id传参到函数中并下载该作品(需要再次分析页面代码)最后下载完毕,输出统计一共下载了多少作品。2016年7月18日想到自己的未来,担忧。。。。。于是我又来了,坚持力度只有这么点真的很抱歉!不过仔细想想技艺的精湛只是一个技工罢了,而真正高一层的人在于懂得该技艺的原理,是那个掌握全局的人x可惜的是,我成不了那样的人( 我是一个管中窥豹的可怜的家伙。 继续写脚本,已经面向对象写了几个模块了分别实现——    login登录    get_daily 寻找日榜所有符合条件的图片的id和mode 下同    get_weekly    get_monthly     page_loop根据get_daily提供的信息打开链接    save_img负责保存图片    mk_dir负责创建新的文件夹(估计0.1版没什么需要它发挥的空间)今天要实现的内容:BeautifulSoup搜出所有满足条件的图片tag (用正则)发现标签为"work _work "的图片均为medium完成了BeatifulSoup搜出所有mode=medium的37张图片(所以后面的图片怎么弄)的标签(BeatifulSoup大法好!)接下来就是正则表达式提取中其中的illust_id了出现的问题:    第50张图片以后的illust_id无法获取困了- -想睡觉了。。。。。。。。23时46分59秒思考。。可是就差一点的感觉- -遇到了个问题,find_all()的list元素类型诉None无法使用正则。快速翻阅bs的文档,我的内心是崩溃的……%¥…………经过40min左右的对正则和bs的研究后:事实的真相总是指向自己的愚蠢= =不过对BeautifulSoup也算是熟悉了吧,吧,吧。至少下次用bs的时候。。。。。。睡了。。。。完成了:    改写+新写了上面的那几个模块2016年7月24日    完成了搜寻出日榜mode为medium的单张页面    完成了mkdir2016年7月28日    根本不知道前几日干了什么    反正下载日榜图片的功能已经实现了(用了requests)   然后成功了# -*- coding: utf-8 -*- 
__author__='Aerial_Yin'
__version__='0.1'
"""为了用session函数,去了解了requests以后好想重写一下啊"""
import urllib
import urllib2
import cookielib
import os
from pyquery import PyQuery as pq
from lxml import etree
from bs4 import BeautifulSoup
import re
import requests
import codecs
class Spider:
    def __init__(self):
        self.url='http://www.pixiv.net'
        
        
    def login(self,base_url):
        filename='p_cookie.txt'
        print'Login....'
        s=s=requests.Session()
        cookie=cookielib.MozillaCookieJar(filename)
        opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
        url='http://www.pixiv.net/login.php' 
        data=urllib.urlencode({
            'mode':'login',
            'pass':pass,
            'pixiv_id':user_id,
            'return_to':'/',
            'skip':1
            } )#user and pass
        headers={'Accept-Language':'zn-CH,zh;q=0.8','User-Agent':'Mozilla/5.0 (X11;     Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/47.0.2526.73 Chrome/47.0.2526.73 Safari/537.36','Referer':'http://www.pixiv.net/'}
        request=urllib2.Request(url,data,headers)
        try:
            login_pixiv=opener.open(request,timeout=20)
            cookie.save(ignore_discard=True,ignore_expires=True)
    
            print'登录成功!'
            daily_pixiv=opener.open(base_url)
            page=daily_pixiv.read()     
            html=page
            return html
        except urllib2.HTTPError,e:
            print e.code
            print e.reason
        
    def Cookie_Login(self):
        cookie_login=cookielib.MozillaCookieJar()
        cookie_login.load('p_cookie.txt',ignore_discard=True,ignore_expires=True)
        opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_login))
        return opener
    
    
    def replace(self,x):
        removeClass=re.compile('<.*?php\?')
        removedic=re.compile('<div.*?>')
        removeother=re.compile('amp;u.*?>')
        removemore=re.compile('<.*?a>')
        removeamp=re.compile('&amp|&')
        x=re.sub(removeClass,"",x)
        x=re.sub(removedic,"\n",x)
        x=re.sub(removeother,"\n",x)
        x=re.sub(removemore,"\n",x)
        x=re.sub(removeamp," ",x)
        return x.strip()
        
    def imgUrl(self,url,p_id):
        request=urllib2.Request(url)
        response=urllib2.urlopen(request)
        page=response.read()
        match=re.search('http://i\d.pixiv.net/c/.*master1200',page)
        if match:
            imgU=match.group()+'.jpg'
            return imgU
        else:
            print 'noooo'
    def get_daily(self):
    
        daily_url='http://www.pixiv.net/ranking.php?mode=daily'
        page=self.login(daily_url)
        opener=self.Cookie_Login()
        soup=BeautifulSoup(page)
    
        h_tag=soup.find_all(class_='work _work ')
        tag=str(h_tag)      
         
        x=self.replace(tag)
        print '正在搜寻作品id哟~'
        
        match=re.findall('\d.*',x)
        
    
        for item in match:
            url=self.page_loop('medium',item)
            print '当前下载的图片id是'+item
            imgU=self.imgUrl(url,item)
            
            
            #self.Download_Pic(path,i,opener,imgU,item)
            self.save_img(imgU,item)
            
    def get_weekly(self):
        weekly_url='http://www.pixiv.net/ranking.php?mode=weekly'
        page=self.login(weekly_url)
        opener=self.Cookie_Login()
        soup=BeautifulSoup(page)
    
        h_tag=soup.find_all(class_='work _work ')
        tag=str(h_tag)      
         
        x=self.replace(tag)
        print '正在搜寻作品id哟~'
        
        match=re.findall('\d.*',x)
        
    
        for item in match:
            url=self.page_loop('medium',item)
            print '当前下载的图片id是'+item
            imgU=self.imgUrl(url,item)
            
            
            #self.Download_Pic(path,i,opener,imgU,item)
            self.save_img(imgU,item)
            
    def get_monthly(self):
        
        monthly_url='http://www.pixiv.net/ranking.php?mode=monthly'
        page=self.login(monthly_url)
        opener=self.Cookie_Login()
        soup=BeautifulSoup(page)
    
        h_tag=soup.find_all(class_='work _work ')
        tag=str(h_tag)      
         
        x=self.replace(tag)
        print '正在搜寻作品id哟~'
        
        match=re.findall('\d.*',x)
        
    
        for item in match:
            url=self.page_loop('medium',item)
            print '当前下载的图片id是'+item
            imgU=self.imgUrl(url,item)
            
            
            #self.Download_Pic(path,i,opener,imgU,item)
            self.save_img(imgU,item)
            
        
    
        
    def page_loop(self,mode,pageid):
        base_url='http://www.pixiv.net/member_illust.php'
        url=base_url+'?mode=%s&illust_id=%s' %(mode,pageid)
        
        return url
    def save_img(self,url,item):
        
        headers={'referer':'http://pixiv.net/'}
        r=requests.get(url,headers=headers)
        filename=item+'.jpg'
        
        with open(filename,'wb') as fd:
            for chunk in r.iter_content():
                fd.write(chunk)
        print item+'已经下载好了哟(///A///)'        
            
    def Program_Start(self):
    #   self.login(self.url)
    #   opener=self.Cookie_Login()
    
    #   self.get_daily()
        self.get_monthly()
        self.get_weekly()
    
x=Spider()
h=x.Program_Start
h()
学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是304050799,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。

加载中
返回顶部
顶部