python爬虫

一、正则表达式

#python网络爬虫
#通用网络爬虫(没有目的,爬去所有的URL)  聚焦网络爬虫(过滤无关的链接)

#python数据分析与挖掘实战的正则表达式
#正则表达式  世界上信息非常多,而我们关注的信息有限。假如我们希望只提取出关注数据,此时可以通过一些表达式进行提取,正则表达式就是其中一种进行数据筛选的表达式。

#原子
#原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子。
#常见的原子类型有:普通字符作为原子,非打印字符作为原子,通用字符作为原子,原子表

import re
pat="yue"         #普通字符作为原子
string="http://yum.iqianyue.com"
rst=re.search(pat,string)
print(rst)

pat1="\n"  #\n  \t            #非打印字符作为原子
string1='''dsfjsdjf
sdfsdfsdfsdf'''
rst1=re.search(pat1,string1)
print(rst1)

pat2="\w\dpython\w"
#\w 通用字符,匹配任意字母,数字,下划线
#\d 匹配任意一个十进制数       #\S 除了十进制数的任意
#|s 匹配空白字符       #\S 除了空白字符的任意字符
#\W 匹配任意一个除了字母,数字,下划线的东西
string2="hsdlfsga7pythonkdfshdskjf"
rst2=re.search(pat2,string2)
print(rst2)

pat3="pyth[jsz]n"           #原子表  定义一组平等的字符
string3="fsdjfpythjnjslkdfpythsnjfsjpythjsnfsd"
rst3=re.search(pat3,string3)
print(rst3)

#元字符
#正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等
#. 匹配任意字符
#^ 匹配字符串中的开始位置
#$ 匹配字符串中结束的位置
#* 匹配0次 1次或者多次的前面的原子
#?匹配0次或者1次前面的原子
#+ 匹配一次或多次前面的原子
#{3} 前面的原子恰好出现了3次  并且连在一起的
#{n} 出现了n次
#{4,7} 至少出现4次  之多出现7次  {4,}
#t|s  出现t或者s
#() 提取某一个内容
pat4=".python..."
string4="sjslkdjfpythonslfjshf"
rst4=re.search(pat4,string4)
print(rst4)

pat5="python|php"
string5="jfsdjphpjsljfspythonfsd"
rst5=re.search(pat5,string5)
print(rst5)

#模式修正符
#可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能
#I 使正则表达式不区分大小写
#M 多行匹配
#L 本地化识别匹配
#U 根据Unicode解析字符
#S 让点也能匹配包括换行符
pat6="python"
pat7="python"
string6="sjljfaljafPythonsfjlsjfssfs"
rst6=re.search(pat6,string6)
print(rst6)

rst7=re.search(pat7,string6,re.I)    #模式修正符实例,不区分大小写
print(rst7)

#贪婪模式和懒惰模式
#贪婪模式尽可能的多的去匹配   #懒惰模式尽可能少的去匹配
pat8="p.*y"   #贪婪模式 更多的去覆盖
pat9="p.*?y"  #懒惰模式 更精准的定位
string8="jlsjfhspythonslfjshdpy"
rst8=re.search(pat8,string8)
rst9=re.search(pat9,string8)
print(rst8)
print(rst9)

#正则表达式函数
#正则表达式函数有re.match()函数,re.search()函数,全局匹配函数,re.sub()函数
#re.search()  从字符串中搜索出来
#re.match()   从头开始匹配,如果一开始没有,那么就返回None
#全局匹配函数
#re.sub()     主要用于替换

string10="phskfhskjhfkjshfjksgjfyskjhfksdh"
rst10=re.match(pat8,string10)
print(rst10)

rst11=re.compile(pat8).findall(string10)   #全局搜索函数  显示所有满足条件的  后面用的最多
print(rst11)

#常见正则表达式实例
#匹配.com .cn网址
pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
string='fjsljflds'
rst=re.compile(pat).findall(string)
print(rst)

#简单的爬虫,如何爬取csdn某个课程页面上的QQ群
pat="

(\d*?)

" import urllib.request data=urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/215").read() rst=re.compile(pat).findall(str(data)) print(rst) #作业:如何爬取豆瓣出版社列表并写入文件中 #豆瓣网址:https://read.douban.com/provider/all import urllib.request import re data=urllib.request.urlopen("https://read.douban.com/provider/all").read() data=data.decode("utf-8") pat='
(.*?)
' mydata=re.compile(pat).findall(data) print(mydata) fh=open("/Users/xubin/myapp/pythonfile/出版社file4.txt","w") for i in range(0,len(mydata)): fh.write(mydata[i]+"\n") fh.close()

二、Urllib库

#python中Urllib库实战
#系统学习urllib模块,从urllib基础开始。学习urlretrieve(),urlcleanup(),info(),getcode(),geturl()
import urllib.request
#urlretrieve() 直接将一个网页爬到本地
urllib.request.urlretrieve("http://www.hellobi.com",filename="/Users/xubin/myapp/pythonfile/urlretrieve.html")

#urlcleanup() 将urlretrieve产生的缓存,清空
urllib.request.urlcleanup()

#info()  将一些基础的环境信息展示粗来
file=urllib.request.urlopen("http://www.hellobi.com")
print(file.info())

#getcode() 获取访问url的状态码,返货200,
print(file.getcode())

#geturl()  获取爬取得网址
print(file.geturl())

#超时设置
#爬取一个网页,需要时间。访问网页,网页长时间未响应,系统判断网页超时了,无法打开网页。
#服务器反应快设置2秒没反应未超时,如果服务器反应慢设置100秒没反应未超时,timeout超时时间为2 100
file=urllib.request.urlopen("http://www.hellobi.com",timeout=1)

for i in range(0,10):
    try:
        file=urllib.request.urlopen("http://yum.iqianyue.com",timeout=0.1)
        data=file.read()
        print(len(data))
    except Exception as e:
        print("出现异常:"+str(e))

#自动模拟http请求
#客户端如果要与服务器端进行通信,需要通过http请求进行,http请求有很多种
#主要涉及post,get两种方式,比如登录,搜索某些信息的时候会用到
#一般登录某个网站的时候,需要post请求
#一般搜索某些信息的时候,需要get请求

#在百度上搜索关键词,用python实现,需要用到请求,get  get请求URL中有?
#https://www.baidu.com/s?wd=python
import urllib.request
import re
keywd="徐彬"
keywd=urllib.request.quote(keywd)
url="http://www.baidu.com/s?wd="+keywd    #注意不能用https
req=urllib.request.Request(url)
data=urllib.request.urlopen(req).read()
fh=open("/Users/xubin/myapp/pythonfile/百度python.html","wb")
fh.write(data)
fh.close()

#post请求  比如需要登录用户  需要提交post请求
#http://passport.csdn.net/account/login    用户名:username  密码:password
import urllib.request
import urllib.parse
url="https://passport.csdn.net/account/login"
mydata=urllib.parse.urlencode({"username":"bingoxubin","password":"19900127LLBingo"}).encode("utf-8")
req=urllib.request.Request(url,mydata)
data=urllib.request.urlopen(req).read()
fh=open("/Users/xubin/myapp/pythonfile/csdn登录界面.html","wb")
fh.write(data)
fh.close()


'''
#爬取oa上的所有照片,存到OA照片.docx中  #遇到问题,目前所学,只能爬取单页的内容
import re
import urllib.request

data=urllib.request.urlopen("oa.epoint.com.cn").read()
data=data.decode("utf-8")
pat=""
mydata=re.compile(pat).findall(data)
fh=open("/Users/xubin/myapp/pythonfile/OA照片.docx","w")
for i in range(0,len(mydata)):
    fh.write(mydata[i]+"\n")
fh.close()
'''

三、状态码

#python爬虫的异常处理
#爬虫遇到异常时就会直接崩溃停止运行,下次再运行时,又会从头开始。
#开发一个具有顽强生命力的爬虫,必须要进行异常处理。

#常见状态码以及含义
#301 Moved Permanently:重定向到新的URL,永久性
#302 Found:重定向到临时的URL,非永久性
#304 Not Modified:请求的资源未更新
#400 Bad Request:非法请求
#401 Unauthorized:请求未经授权
#403 Forbidden:禁止访问
#404 Not Found:没有找到对应页面
#500 Internal Server Error:服务器内部出现错误
#501 Not Implemented:服务器不支持实现请求所需要的功能

#异常处理的两个类URLError和HTTPError
#HTTPError是URLError的子类,HTTPError有异常状态码及异常原因,而URLError没有异常状态码
##URLError发生的原因主要有:1.连不上服务器。2.访问的URL不存在。3.没有网络。4.触发了HRRPError子类

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)

四、伪装技术

#python爬虫的浏览器伪装技术
#爬取csdn博客,会返回403错误,因为对方服务器会对爬虫进行屏蔽,此时需要伪装成浏览器才能爬取
#浏览器伪装,一般通过报头进行。

import urllib.request
url="http://blog.csdn.net/bingoxubin/article/details/78503370"
headers=("User-Agent","浏览器中User-Agent的值")
opener=urllib.request.build_opener()
opener.add_handlers=[headers]
data=opener.open(url).read()
print(len(data))

五、爬新闻

#python爬虫实例   爬取新闻
#爬取新浪新闻首页中所有的新闻,爬到本地(http://news.sina.com.cn/)
#实现过程,先爬首页,通过正则表达式获取所有新闻链接,然后依次爬各新闻,并存储到本地

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,10):
    try:
        print("第"+str(i)+"次爬取")
        thisurl=allurl[i]
        file="/Users/xubin/myapp/pythonfile/sina/"+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)

你可能感兴趣的:(算法)