urllib实战

来源:韦玮老师课堂笔记

1、urllib基础

2、超时设置

3、自动模拟HTTP请求


正则表达式作业:上节课作业爬取豆瓣里的所有出版社

import urllib.request
urllib.request.urlopen("")
data=urllib.request.urlopen("https://read.douban.com/provider/all").read()
data=data.decode("utf-8")
import re
pat='<div class="name">(.*?)</div>'
mydata=re.compile(pat).findall(data)
fh=open("f:/result/22/1.txt","w")
for i in range(0,len(mydata)):
	fh.write(mydata[i]+"\n")

urllib模块

其中urllib.request里的常用函数有

    urlopen(URL),只能爬http

    urlretrieve(URL,filename=””),将某个网页爬到本地,下载格式有 .html .jpg

    urlcleanup()清除retrieve的缓存

    getcode(),获得网页状态码

    geturl(),获得当前爬取网页的地址



超时设置,设置时间timeout

    timeout的意义在于有些网页速度快,如果超时2S则判断为超时;有些服务器慢,超过100S才判断为超时

    urlopen(“”,timeout=1)

    file=url.request.urlopen()


爬虫异常处理

异常处理的类 HTTPerror,  是URLError的子类,含有异常状态码,异常原因

                         URLerror     包括Httperror, 无异常状态码


for i in range(0,100):
	try:
		file=urllib.request.urlopen("http://",timeout=1)
		data=file.read()
		print(len(data))
	except Exception as e:
		print("出现异常:"+str(e))
import urllib.error
import urllib.request
try:
    urllib.request.urlopen("http://blog.csdn.net")
except urllib.error.URLError  as e:
    if hasattr(e,"code"):
        print(e.code)
    if hasattr(e,"reason"):
        print(e.reason)

结果会出现403禁止访问的异常。

    urlopen error timed out.


爬虫的浏览器伪装技术:

    按F12得到Network,然后刷新网页,得到request headers的请求头,然后复制User_Agent

    opener=urllib.request.build_opener()将opener设置为全局变量。

import urllib.request
url="http://blog.csdn.net/weiwei_pig/article/details/52123738"
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).read()
fh=open("F:/天善-Python数据分析与挖掘课程/result/22/4.html","wb")
fh.write(data)
fh.close()

    应用:爬取CSDN博客

     难点:浏览器伪装,循环爬取各文章

    实现思路:先爬首页,然后通过正则筛选出所有文章URL,然后通过循环分别爬取这些URL到本地

import urllib.request
import re
url="http://blog.csdn.net/"
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
pat='<h3  class="tracking-ad" data-mod="popu_254"><a href="(.*?)"'
result=re.compile(pat).findall(data)
for i in range(0,len(result)):
    file="F:/天善-Python数据分析与挖掘课程/result/31/"+str(i)+".html"
    urllib.request.urlretrieve(result[i],filename=file)
    print("第"+str(i+1)+"次爬取成功")


经典示例:

爬取新浪新闻的所有新闻,并以html保存到本地

思路:打开新浪新闻首页,查看网页代码,发现所有新闻链接都是以<a href="something"> URL </a>中获取。

import urllib.request
import re
data=urllib.request.urlopen("http://news.sina.com.cn/").read()
data2=data.decode("utf-8","ignore")
pat='href="(http://news.sina.com.cn/.*?)"'
allurl=re.compile(pat).findall(data2)
for i in range(0,len(allurl)):
    try:
        print("第"+str(i)+"次爬取")
        thisurl=allurl[i]
        file="F:/天善-Python数据分析与挖掘课程/result/22/sinanews/"+str(i)+".html"
        urllib.request.urlretrieve(thisurl,file)
        print("-------成功-------")
    except urllib.error.URLError  as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)


百度搜索关键词

import urllib.request
keywd='Python'
url="http://www.baidu.com/s?wd="+keywd+"&ie=utf-8&tn=96542061_hao_pg"
req=urllib.request.Request(url)
data=urllib.request.urlopen(req).read()
fh=open("路径.html","wb")
fh.write(data)
fh.close()

防屏蔽之代理服务器

import urllib.request
def use_proxy(url,proxy_addr):
    proxy=urllib.request.ProxyHandler({"http":proxy_addr})
    opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
    urllib.request.install_opener(opener)
    data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
    return data
proxy_addr=["119.183.220.224:8888",""]
url="http://www.baidu.com"
data=use_proxy(url,proxy_addr)
print(len(data))


图片爬虫

import urllib.request
import re
keyname="连衣裙"
key=urllib.request.quote(keyname)
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4549.400 QQBrowser/9.7.12900.400")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
for i in range(1,101):
    url="https://s.taobao.com/list?q="+key+"&cat=16&style=grid&seller_type=taobao&spm=a219r.lm874.1000187.1&bcoffset=12&s="+str(i*60)
    data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
    pat='pic_url":"//(.*?)"'
    imagelist=re.compile(pat).findall(data)
    for j in range(0,len(imagelist)):
        thisimg=imagelist[j]
        thisimgurl="http://"+thisimg
        file="E:/文档/python/Practise/taobao"+str(i)+str(j)+".jpg"
        urllib.request.urlretrieve(thisimgurl,filename=file)


自动处理表单

import urllib.parse
url="http://www.iqianyue.com/mypost/"
mydata=urllib.parse.urlencode({
"name":"ceo@iqianyue.com",
"pass":"1235jkds"
    }).encode("utf-8")
req=urllib.request.Request(url,mydata)
data=urllib.request.urlopen(req).read()
#fh=open("F:/天善-Python数据分析与挖掘课程/result/22/3.html","wb")
#fh.write(data)
#fh.close()
print(data)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值