zoukankan      html  css  js  c++  java
  • python爬虫第五天

     
     
        cookie
     
            我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态就会消失,十分不方便。而我们可以通过Cookie保存会话信息,将会话信息保存在客户端,或者用session保存会话信息在服务器端。但是服务器端会给客户端发送sessionID等信息,这些信息一般保存在Cookie中,大部分时候我们都要用到Cookie,而爬虫中我们可以通过Cookie保持登录状态进行内容爬取。
     
    Cookiejar实战精析
        注意:python3中使用Cookiejar库进行处理,而在python2中可以使用Cookielib库进行处理。
        现在我们登录ChinaUnix论坛,http://bbs.chinaunix.net
     
    我们先注册一下,然后我们可以通过Fiddler工具进行分析,不过我们现在先使用F12调出调试界面,登录输入用户名密码,点击登录,观察调试界面。在NetWork下找到登录Request URL字段得到POST表单网址http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes。(书中这样写的,但是现在网页自动跳转了,我没找到。。直接用了书上的可以用。)
     
     
     
    import urllib.request
    import urllib.parse
    import http.cookiejar
    #这里填写登录成功的url,这里的loginhash是书上的。这里用肯定不行,这里得在登录页面拿到才行
    url="http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes&loginhash=L68q"
    postdata=urllib.parse.urlencode({
        #这里填写用户名密码,自己填自己的吧
        "username":"yang",
        "password":"1234567890"
    }).encode('utf-8')
    req=urllib.request.Request(url,postdata)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
    #创建CookieJar对象
    cjar=http.cookiejar.CookieJar()
    #使用HTTPCookieProcessor创建cookie处理器,并以其为参数opener为参数
    opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
    #将opener安装为全局
    urllib.request.install_opener(opener)
    file=opener.open(req)
    data=file.read()
    file=open("D:/crawler/9.html","wb")
    file.write(data)
    file.close()
    url2="http://bbs.chinaunix.net"
    data2=urllib.request.urlopen(url2).read()
    fhandle=open("D:/crawler/10.html","wb")
    fhandle.write(data2)
    fhandle.close()
    这个代码我还没有弄成功,先放在这里吧。
     
     
     
     
    接下来开始手写爬虫实战
     
    图片爬虫实战
            首先我们先实现一个简单的爬虫,我们打开京东首页www.jd.com
    进入手机分类商品http://list.jd.com/list.html?cat=9987,653,655,我们点击下一页发现网址变了,
     
    可以发现这里是使用get方法请求的,如何自动爬取其他页的情况呢?我们可以使用for循环每次循环后把page字段加1,即自动切换到下一页,之后我们要获取对应的图片,使用正则表达式匹配源码中的图片的链接部分,然后通过urllib.request.urlretrieve()方法将对应的链接保存在本地。
    我们要先过滤点信息走,我们右击查看源代码:我们要找到一个唯一的标识,并且包含要爬取得内容,以及尽量少的无关信息。这里我们找到<div id = "plist">
    这是开头的部分,结尾的标识<div class="page clearfix"满足要求
        这样过滤就是:用正则表达式只取这两个标识中间的内容:patl='<div id="plist".+?<div class="page clearfix">'
     
    import re
    import urllib.request
    import urllib.error
     
    def craw(url,page):
        html1=urllib.request.urlopen(url).read()
        html1=str(html1)
        pat1='<div id="plist".+?<div class="page clearfix">'
        result1=re.compile(pat1).findall(html1)
        result1=result1[0]
        pat2='<img width="220" height="220" data-img="1" src="//(.+?.jpg)">'
        imagelist=re.compile(pat2).findall(result1)
        x=1
     
        for imageurl in imagelist:
            imagename="D://crawler/image/image"+str(page)+str(x)+".jpg"
            imageurl="http://"+imageurl
            try:
                urllib.request.urlretrieve(imageurl,filename=imagename)
            except urllib.error.URLError as e:
                if hasattr(e,"code"):
                    x+=1
                if hasattr(e,"reason"):
                    x+=1
            x+=1
     
    for i in range(1,15):
        url="http://list.jd.com/list.html?cat=9987,653,655&page="+str(i)
        craw(url,i)
     
     
    这样就爬取成功了,我亲测可以。
     
     
    今天实在是懒就写这么多了
     
     
     
    此文是我在学习《精通Python网络爬虫》(韦玮著)的总结,纯手打。
     
  • 相关阅读:
    批量清理java源码的target目录
    前端移动node_modules到其他位置
    oracle物化视图和视图的数据不一致
    百词斩英语单词素材提取、听力练习
    2048自动游戏AI, 最高可以玩出一二十个2048
    switcheroo: Alt+Tab的替代工具、窗口搜索
    为知笔记wiz.editor.md增强
    腾讯北极星 Polaris 试用
    [分布式] 分布式事务、seata
    Mysql查询所有的表名和查询表中所有的字段名
  • 原文地址:https://www.cnblogs.com/yang4869/p/10333836.html
Copyright © 2011-2022 走看看