前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python爬虫第五天

python爬虫第五天

作者头像
py3study
发布2020-01-17 12:39:25
3530
发布2020-01-17 12:39:25
举报
文章被收录于专栏:python3python3

    cookie

        我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态就会消失,十分不方便。而我们可以通过Cookie保存会话信息,将会话信息保存在客户端,或者用session保存会话信息在服务器端。但是服务器端会给客户端发送sessionID等信息,这些信息一般保存在Cookie中,大部分时候我们都要用到Cookie,而爬虫中我们可以通过Cookie保持登录状态进行内容爬取。

Cookiejar实战精析

    注意:python3中使用Cookiejar库进行处理,而在python2中可以使用Cookielib库进行处理。

    现在我们登录ChinaUnix论坛,http://bbs.chinaunix.net

http://account.chinaunix.net/login/?url=http%3A%2F%2Fbbs.chinaunix.net%2F

我们先注册一下,然后我们可以通过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,我们点击下一页发现网址变了,

http://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=6#J_main

可以发现这里是使用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网络爬虫》(韦玮著)的总结,纯手打。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档