专栏首页python3python爬虫第五天

python爬虫第五天

    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网络爬虫》(韦玮著)的总结,纯手打。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python3模拟登录zabbix

    py3study
  • python 3 处理HTTP 请求的包

    http: https://docs.python.org/3/library/http.html

    py3study
  • Python爬虫第二天

            有时候访问网页时长时间未响应,系统就会判断网页超时,无法打开网页。如果需要自己设置超时时间则:

    py3study
  • 源码系列--CallServerInterceptor

    Github下载源码地址https://github.com/square/okhttp

    用户3112896
  • jboss EAP 6.2+ 通过代码控制JNDI数据源

    通过Jboss提供的API,可以操控JBoss,效果跟在管理控制台手动操作完全一样,下面是示例代码: 一、pom.xml添加依赖项 <dependency> ...

    菩提树下的杨过
  • Django学习-第十一讲(下):视图高级(一)网页请求限制、HttpRequest、HttpResponse、JsonResponse对象

    Django内置的视图装饰器可以给视图提供一些限制。比如这个视图只能通过GET的method访问等。以下将介绍一些常用的内置视图装饰器

    小海怪的互联网
  • Java Web之Struts2访问Servlet API

    方法一:直接获取 Map类型 Map request = (Map)Actioncontext.getContext().get("request"); Map...

    YungFan
  • 大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践

    Uber 的全球用户每天会产生500万条行程,保证数据的准确性至关重要。如果所有的数据都得到有效利用,t通过元数据和聚合的数据可以快速检测平台上的滥用行为,如垃...

    fly2wind
  • 大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践

    Uber 的全球用户每天会产生500万条行程,保证数据的准确性至关重要。如果所有的数据都得到有效利用,t通过元数据和聚合的数据可以快速检测平台上的滥用行为,如垃...

    fly2wind
  • block内部实现

    c. 我们先看一下__ main_block_impl_0结构体和 __ main_block_func_0 还有__main_block_desc_0_DAT...

    老沙

扫码关注云+社区

领取腾讯云代金券