2019.7.12:学习py的第一天
来自小甲鱼的基础,很好但是太慢了,后面找了个速成的
BIF:内置函数
help(type):帮助函数
print("")输出字符串
缩进在py中占有很重的地位
alt+n/p:回到上一句下一句
2019.7.24
语法速成:
本来是拍下来的笔记,上传太麻烦了。
基础语法完结,下面是函数,还有各种东西,就不拍了,都记到本子上了
代码笔记
#豆瓣出版社的名字爬取
import re
import urllib.request
#https://read.douban.com/provider/all
data=urllib.request.urlopen("https://read.douban.com/provider/all").read().decode("utf-8")
pat='<div class="name">(.*?)</div>'
res=re.compile(pat).findall(data)
fh=open("C:\\Users\\2280xdyn\\Desktop\\爬虫.txt","w")
for i in range(0,100):
fh.write(res[i]+"\n")
fh.close()
#超时检测,设置,以及异常处理复习
import urllib.request
for i in range(0,100):
try:
file=urllib.request.urlopen("http://www.baidu.com",timeout=0.3)
print(len(file.read().decode("utf-8")))
except Exception as err:
print("出现超时"+str(err))
#get请求实战,其实就是直接百度框子搜索
import re
import urllib.request
keywd="百度百科"
#浏览器可以自动转码,汉字需要转码
keywd=urllib.request.quote(keywd)
#貌似只可以英文,因为提示ascll码超出什么的
#加入页码的构造
for i in range(1,10):
#通过网页查看
page=(i-1)*10
url="http://www.baidu.com/s?wd="+keywd+"&pn="+str(page)
data=urllib.request.urlopen(url).read().decode("utf-8")
pat='"title":(.*?)",'
res=re.compile(pat).findall(data)
for i in range(0,len(res)):
print(res[i],end="\n")
#这个和上面是分开的,爬的某吧的标题
import re
import urllib.request
url="https://www.zhuanyes.com/xianbao/?page="
for i in range(1,10):
data=urllib.request.urlopen(url+str(i-1)).read().decode("utf-8")
pat='<a style="" href="https://www.zhuanyes.com/xianbao/[0-9]{6}.html" target="_blank">(.*?)</a>'
res=re.compile(pat).findall(data)
print("\n\n")
for j in range(0,len(res)):
print(res[j])
#post请求实战
import re
import urllib.request
#转码才能传过去
import urllib.parse
#这个网站已经废了,但是我有没有找到合适的,所以这一段代码是错误的
#posturl="http://www.iqianyue.commypost/"
posturl="http://www.baidu.com"
postdata=urllib.parse.urlencode({
#字典
"name":"sasdsda",
"pass":"asdasd",
}).encode("utf-8")
#进行post就必须用urllib.request下面的Reque(真实post地址,post数据)
#对req进行封装
req=urllib.request.Request(posturl,postdata)
datares=urllib.request.urlopen(req).read().decode("utf-8")
#写入到本地
fh=open("C:\\Users\\2280xdyn\\Desktop\\爬虫.html","w")
#这里没有用循环,直接一步写入
fh.write(datares)
fh.close()
#异常处理
'''
URLError出现的原因:
1. 连接不上服务器
2. 远程url不存在
3. 无网络
4. 触发HTTPError
'''
import urllib.error
import urllib.request
#这个样例得目的是403错误,但是一直不报错就很蒙蔽
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)
#对浏览器伪装
import urllib.request
url="http://blog.csdn.net"
print("1")
#头文件header格式 header=("Uesr-Agent",用户代理值)
#添加用户代理
headers=("Uesr-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
#这里是一个对象
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).read()
fh=open("C:\\Users\\2280xdyn\\Desktop\\ppp.html","wb")
fh.write(data)
fh.close()
#爬去腾讯新闻的所有新闻内容到本地
import re
import urllib.request
#腾讯新闻的主页网址
#https://new.qq.com/omn/NEW20190/NEW2019073000268200.html 测试样例
#url="https://new.qq.com/omn/NEW20190/NEW2019073000268200.html"
#这里的ignore是避免编码错误,继续执行
#data=urllib.request.urlopen(url).read().decode("GBK","ignore")
'''
1. 爬取首页
2. 得到各个新闻链接
3. 爬取新闻链接
4. 寻找是否有frame
5. 如果有frame,抓取网页内容
6. 如果没有,直接抓取当前页面
'''
url="https://news.sina.com.cn/"
pat='<a href="(.*?)" target="_blank">'
data=urllib.request.urlopen(url).read().decode("GB2312","ignore")
alllink=re.compile(pat).findall(data)
fh=open("C:\\Users\\2280xdyn\\Desktop\\111.TXT","w")
for i in range(0,len(alllink)):
#加了个异常处理,但是实际啥都没处理,爬了60+个之后暴毙
try:
thislink=alllink[i]
thispage=urllib.request.urlopen(thislink).read().decode("GB2312","ignore")
pat1="<frame src=(.*?)>"
#这里开始就蒙蔽了,前端没学好不记得啥事frame了,大概看了一下,本质还是一个正则的结果
isframe=re.compile(pat1).findall(thispage)
if(len(isframe)==0):
print(str(i))
#下面函数的介绍https://blog.csdn.net/pursuit_zhangyu/article/details/80556275
urllib.request.urlretrieve(thislink,"C:\\Users\\2280xdyn\\Desktop\\新建文件夹 (2)\\"+"新浪"+str(i)+".html")
else:
flink=isfarme[0]
urllib.request.urlretrieve(flink,"C:\\Users\\2280xdyn\\Desktop\\新建文件夹 (2)\\"+"新浪"+str(i)+".html")
except urllib.request.URLError as e:
pass
import re
import urllib.request
url="https://www.csdn.net/"
'''
视频说需要浏览器伪装,但是实际好像不用也可以,设置头
#("User-Agent","***")
headers=opener=urllib.request.build_opener
opener.addheaders=[headers]
urllib.request.install_opener(opener)
'''
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
pat='<a href="(.*?)" target="_blank".*?>'
#到这一步已经爬取到了目标连接,但是检测了一下,有很多重复的
alllink=re.compile(pat).findall(data)
for i in range(0,15):
print(alllink[i]+"\n")
#下面是判断爬取到的链接能否继续爬去,以此判断是否可以下载
for i in range(0,len(alllink)):
try:
#取出当前页面的链接
thispage=alllink[i]
pat2="<frame src=(.*?)>"
isfarme=re.compile(pat2).findall(thispage)
if(len(isfarme)==0):
#说明没有下一步链接,可以直接下载
#fh=open("C:\\Desktop\\新建文件夹(2)\\"+"CSDN"+str(i)+".html")
urllib.request.urlretrieve(alllink[i],"C:\\Users\\2280xdyn\\Desktop\\新建文件夹 (2)\\"+"CSDN"+str(i)+".html")
else:
#说明不能直接下载,需要进一步爬取
#
urllib.request.urlretrieve(isframe[0],"C:\\Users\\2280xdyn\\Desktop\\新建文件夹 (2)\\"+"CSSDN"+str(i)+".html")
#这里的异常处理也需要注意,不同的错误类型不一样
except urllib.request.URLError as e:
pass
import urllib.request
#下面的几行都挺陌生的,不熟悉
ip="182.34.26.27"
#用到的字典,然后下面的函数实现代理格式的转化
#poxyhandler的详解:https://blog.csdn.net/qq_32252917/article/details/79074219
proxy=urllib.request.ProxyHandler({"http":ip})
#构建一个对象,添加过信息头的
#https://blog.csdn.net/qq_38875300/article/details/80115536 build的讲解
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
url="http://www.baidu.com"
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
print(len(data))
#糗事百科不是关键,主要是代理IP池子
#https://www.qiushibaike.com/
#https://www.qiushibaike.com/8hr/page/2/
#找到控制页码的字段
#https://www.qiushibaike.com/article/121186480
#找到文章的字段
import re
import urllib.request
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
#安装为全局
urllib.request.install_opener(opener)
for j in range(2,10):
try:
url="https://www.qiushibaike.com/text/page/"+str(j)+"/"
pat='<div class="content">.*?<span>(.*?)</span>.*?</div>'
#远程关闭连接错误,需要报头
#这里还有一个错误,编码错误,但是编码错误已经忽略了呀,异常处理这里也米有跳过,不理解
data=urllib.request.urlopen(url).read().decode("UTF-8","ignore")
alltext=re.compile(pat,re.S).findall(data)
for i in range(0,len(alltext)):
print(alltext[i])
print("------------------------------------------------------")
except urllib.request.URLError as e:
pass
弱弱的说一句,我们到目前为止都爬到的是静态网页,含有js的爬不到,就很难受。
而且现在学的貌似都是几年前的视频了,技术早就更新了。