数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)

未经允许,请勿转载。
连载未完成状态

网址:

【数据挖掘】2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av22571713/?p=1

目标:

网络爬虫工程师
数据分析(数据挖掘)工程师

第一周 python基础知识(4课时)
第二周 爬虫
第三周 数据分析与挖掘技术

第一周——第一课

001课程介绍
002初始python
Python 是一门面向对象的,解释型的编程语言。
面向对象:区别于面向过程,大型项目很方便
编程语言:
解释型:区别于编译型,解释型是一行一行的执行。
Python2.X处理速度更快
Python3.X各方面更成熟完善些
Python 优点 :简洁 基本上是全能的
Python 能做什么
数据分析与挖掘、黑客逆向编程、网络爬虫、机器学习(AI)、开发网站WEB项目、开发游戏、自动化运维。

Python 安装
Idle是python的编辑器
Python2和python3可以共存

注释方法

#号注释后面的
‘’’ ‘’’三引号注释法

快捷键

F5运行
CTRL+N 新建文件
CTRL+O 打开文件
CTRL+C 强制停止

标识符命名规则

1第一个字符为字符或者下划线
2除了第一个字符以外的其他字符是字符、下划线或数字。

a+=b 相当于a=a+b

数据类型:数、字符串、列表(list)、元组(tuple)、集合(set)、字典(dictionary)

没有数组的概念,列表和元组类似数组
列表aaa=[“my”,”you”] aaa[0]=’my’ aaa[1]=’you’ 列表中元素可以替换
元组ccc=(“my”,”you”) ccc[0]=’my’ 元组中元素不能替换
集合(set) a=”aadshhdladljaj” b=”sadjhlajaljcjadl” sa=set(a) sb=set(b)
交集(共同的元素)sa&sb 并集(合并起来的元素) sa|sb
字典 格式{key1:value1,key2:value2} 单个元素key1(间):value1(值)d1={“name”:“weiwei”,“sex”:“man”} d1[“name”]=’weiwei’

运算符:常见的有 +、 -、 *、 /、 %(取余) 优先级() //不要余数 整除
  • 字符串和变量之间链接可以用+ p=“python” “hello”+p=‘hellopython’
    缩进 强制缩进了 美观
    同一层次的代码,处于同一个缩进幅度上;下一层次的代码,需要相对于上一层次的代码进行缩进,建议使用tab键缩进。
三种控制流概述(顺序结构、条件分支结构(选择)、循环结构)

控制流:程序的执行流程
3种基本控制流(顺序结构、条件分支结构(选择)、循环结构)
还有一种 叫做 中断结构

If语句(条件分支结构)
a=6
if(a>7):
    print(a)
elif(a<2):
    print(a)
else:
    print("nnn")

在这里插入图片描述

while语句(循环结构)
a=0
while a<8:
    print("hello")
    a+=1

在这里插入图片描述

for语句(循环结构)
a=["a","b","c","d"]
for i in a:
    print(i)

在这里插入图片描述

for i in range(0,10):
    print(i)

在这里插入图片描述

for i in range(0,8):
    print("hello python")

在这里插入图片描述

中断结构 即:中途退出的一种结构。常有break语句和continue 语句

中断一次循环,用continue语句(这一次不做,但之后继续);
中断一个循环,使用break(这一次不做,之后都不做);

输出乘法口诀
for i in range(1,10):
    for j in range(1,i+1):
        print str(i)+"*"+str(j)+"="+str(i*j)+"  ",
    print 

在这里插入图片描述
作业:逆向输出乘法口诀

for i in range(1,10):
    for j in range(1,10-i+1):
        print str(10-i)+"*"+str(j)+"="+str((10-i)*j)+"  ",
    print

在这里插入图片描述

第一周——第二课

认识python函数

函数的本质就是功能的封装。使用函数可以大大提高变成的效率和程序的可读性。

局部变量和全局变量

变量有生效范围的,生效范围被称为作用域。
作用域从变量出现开始到程序的最末的变量叫做全局变量。
作用于只在局部的变量叫做局部变量。
Function 里面的局部变量 加global 变成全局变量

函数参数使用详解

在汉书中,如果需要让函数和外界有数据的传递,我们需要使用参数。参数分为形参和实参,一般来说,在函数定义时使用的参数是形参,在函数调用时使用的参数叫做实参。
函数使用实战

#函数的定义和调用
def abc():
    print("abcd!")
    print("abc")

abc()
什么是python模块

模块相当于函数的升级版;一个模块里面有多个函数(一个函数)。
为了让python程序实验起来更方便,我们可以按需求类别将一些常见的功能(函数)组合在一起,形成模块,以后我们要实现这一类功能的时候,直接导入该模块即可。模块里面的函数叫做模块的方法。系统中自带的模块在安装目录的lib目录中。

Python模块的导入

我们可以使用以下两种方式导入模块:

Import模块名                            将整个模块导入进去
from模块.方法 import函数                 导入某个方法
爬虫
导入方法一
import urllib
from urllib.request import urlopen
data1=urllib.request.urlopen("http://www.baidu.com").read()
print(len(data1))
data2=urlopen("http://m.baidu.com").read()
print(len(data2))

在这里插入图片描述

导入方法二
from urllib import request
data3=request.urlopen("http://jd.com").read()
Import谁,就从谁开始写。
如果是程序陷入死循环,想强制结束,则按Ctrl + C。
自定义python模块

除了使用别人的模块,我们也可以子集定义一些模块,自己定义的模块叫做自定义模块。

返回值

Return 返回的是返回值。

文件操作概述

我们通常会通过手工去打开、写入、读取文件等操作,其实我们也可以使用python程序对文件进行打开,关闭,读取,写入等操作,使用python进行文件操作可以自动对程序进行处理,比如合并多个excel表格文件的内容等。

文件操作实战
文件的创建和打开 (没有文件就是创建,有文件就是打开)
open(“路径”,”目的”)        目的:w(写入) wb(以二进制的方式写入)  r(读取)

例:

open("F:/file1.txt","w")
fh=open("F:/file2.txt","w") #fh是句柄,方便以后的操作定位
fh1=open("F:/file3.txt","w")

在这里插入图片描述

文件的写入和关闭
fh1.write("dsafgafe")
fh1.close()#文件一定要记得关掉 否则之后句柄可能会错乱

在这里插入图片描述

文件的读取和按行读取

#按行输出

fh2=open("F:/file3.txt","r")
while True:
    line=fh2.readline()
    if len(line)==0:
        break
    print(line)
fh2.close()

在这里插入图片描述

天善学院

异常处理概述

Python程序在执行的时候,经常会遇到异常,如果中间异常不处理,经常会导致程序崩溃。比如后面我们写爬虫的时候,如果不进行异常处理,很可能虫爬了一半,直接崩溃了。

异常处理实战
try:#(正常内容)
    print("my")
    printsssv("hi")
except Exception as er:#(异常处理内容)
    print(er)#输出异常内容
print("hello")

在这里插入图片描述

作业2:将多个EXCEL表格里面的内容合并到一个文件中。

思路:这个作业我们可以采用一些操作EXCEL的模块去实现,比如说xlrd,xlwt,openpyxl,xlsxwriter等模块。Xlrd模块主要用于读取excel表,xlwt与xlsxwriter模块主要用于将数据写入表中,两个模块任选其一即可,但是xlwt和 xlsxwriter模块不支持修改表,所以在信息最佳的时候比较麻烦,此时有两种思路解决。其一是换成其他的模块,比如说openpyxl模块等,其二是仍用xlwt和xlsxwriter等模块,但先将每次读取的信息存储到list(列表)中,然后,最后一次写入。此外还有一个难点,当一个表格中有多个sheet,我们希望能够用程序自用获取这多个sheet,然后将各个sheet的内容一起写入最终表格中

之后先学习以下相关模块,再重新学习(目前不懂)

011作业讲解及爬虫知识

如何查看模块功能以及

一、如何了解模块的功能?

1、help()–输入对应的模块名

>>> help()
help> xlrd

在这里插入图片描述
2、阅读该模块的文档,一些大型的模块都有,比如说scrapy等
3、查看模块的源代码,分析个方法的作用,也可以从名字进行相应的分析

二、如何安装模块?

安装模块的时候经常会出现超时然后自动断掉的问题,解决这种问题,我们应该
1、使用VPN(推荐)
2、多试几次
3、使用本地whl文件来安装(推荐)

1、实战讲解:http://www.lfd.uci.edu/~gohlke/pythonlibs/
Ctrl+f find
milk-0.6.1-cp37(python版本)-cp37m-win_amd64(32或者64).whl
2、下载后打开cmd 到达下载好的文件的目录 然后写pip install milk……(可以写了mi,然后按tab键补全)
具体也可以参考我的其他的csdn博客的模块安装的两种方法

第二周 网络爬虫

网络爬虫是什么?

网络爬虫是自动从互联网中定向或不定向的采集信息的一种程序。
网络爬虫的类型很多,常用的有通用网络爬虫(搜索引擎常用)、聚焦网络爬虫(有目标,比通用难,重点)等。

网络爬虫能做什么?

网络爬虫可以做很多事情,比如说通用网络爬虫可以应用在搜索引擎中,聚焦网络爬虫可以从互联网中自动采集信息并代替我们筛选出相关的数据出来。
具体来说,网络爬虫可以应用在一下方面:
1搜索引擎
2采集金融数据
3采集商品数据
4自动过滤广告
5采集竞争对手的客户数据
6采集行业相关数据,进行数据分析
……

第二周——第一节 重点是正则表达式

012网络爬虫运行原理
通用网络爬虫的运行原理

获取最初的URL 爬页面并获取新的URL 将爬到的内容放到我们的服务器中, 将新的URL放到URL队列中 读取新的URL 是否满足停止条件 是就停止,否就继续爬页面并获得新的url 会从当前的页面,爬取当前的网页 再从当前的网页获取新的页面,新的内容 没有什么爬的目的

聚焦网络爬虫的运行原理

首先 要对抓取的目标进行相应的定义或者描述 (比如说提取Q Q号) 需要获取初始URL 爬页面并获得新的URL 爬的页面放到服务器中,并过滤无关链接 将过滤后的URL放入到url队列中 确定下一步要爬的链接 读取待爬url 是否满足停止条件 满足停止 不满足 爬页面并获得新的url
聚焦网络爬虫有一个过滤的过程,通用的网络爬虫没有过滤的过程

013正则表达式实战(重点)
什么是正则表达式

世界上信息非常多,而我们关注的信息是有限的,假如我们希望只提取出关注的数据,此时可以通过一些表达式来进行提取,正则表达式是其中一种进行数据筛选的表达式。
re 正则表达式模块

原子

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

import re
pat="yue"
string="http://yum.iqianyue.com"
rst1=re.search(pat,string)   #pat规则  string总的字符串
print(rst1)

在这里插入图片描述

import re
string2="addsfsgsrb"
rst2=re.search(pat,string2)
print(rst2)

在这里插入图片描述
b:非打印字符作为原子

import re
pat2="\n"
string3='''iiulgujhjklhuihj
gkagauygku'''
rst3= re.search(pat2,string3)
print(rst3)

在这里插入图片描述

c:通用字符作为原子
通用字符表示这个字符可以匹配一系列的东西。

\w(通用字符),可以匹配任意一个字母,数字,下划线(非特殊字符)
\W(通用字符),可以匹配除了字母,数字,下划线(非特殊字符)外的任意一个字符
\d (通用字符),可以匹配任意一个十进制数
\D (通用字符),可以匹配除了十进制数外的任意一个字符
\s (通用字符),可以匹配任意一个空白字符
\s (通用字符),可以匹配除了空白字符外的任意一个字符
\W和\w、\d和\D、\s和\S  匹配内容相反,正好互补。

d:原子表 [jsz] 就是jsz三选一都可以 这就是原子表 jsz三个字符的地位相等

import re
pat="pyth[jsz]n"
string="afgfagafgapythsn"
rst2=re.search(pat,string)
print(rst2)

在这里插入图片描述

元字符

元字符是正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等。

. 可以匹配任意一个字符
^ 可以匹配字符串的开始位置  在原子表[]里面代表除了后面的原子以外的原子
$ 可以匹配字符串的结束位置   
* 可以匹配0次,1次,多次 “s*”  s  ss  sss
?可以匹配0次或1次       “s?”  s   ss
+ 可以匹配1次,多次       “s*”  ss   sss
{n} 可以匹配  前面的字符正好出现n次   t{3}  ttt
{n,} 可以匹配  前面的字符至少出现n次   t{3,}  ttt  tttt
{n,m} 可以匹配  前面的字符至少出现n次,至多出现m次   t{3,4} ttt  tttt 
|模式选择符号  t|s  t或者s
() 模式断垣 可以匹配  体悟某内容  具体看后面  这个没听懂  
()可以输出括号里面的内容
import re
pat=".python..."
string="hjjkdkhpythondshihdsaih"
rst=re.search(pat,string)
print(rst)

在这里插入图片描述

import re
pat="python|php"
string="abcdphp362pythonggigk"
rst=re.search(pat,string)
print(rst)

在这里插入图片描述

模式修正符

模式修真符:即可以再不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

I  匹配时忽略大小写
M 匹配时  进行多行匹配
L  匹配时  本地化识别匹配
U  匹配时  根据unic(写错了)字符进行匹配
S  匹配时   让点.也参与匹配
import re
pat1="python"
string="uguggyhuPythonfuifuy"
rst=re.search(pat1,string)
print(rst)

在这里插入图片描述

import re
pat1="python"
string="uguggyhuPythonfuifuy"
rst=re.search(pat1,string,re.I)
print(rst)

在这里插入图片描述

贪婪模式与懒惰模式

贪婪模式的核心点就是尽可能多的匹配
懒惰模式的核心点是尽可能少的匹配

import re
pat1="p.*y"      #贪婪模式  .任意字符  *任意次 0,1,多   
pat2="p.*?y"  #懒惰模式 ? 0,1次
string="abcddscpythonvfiyftgy"
rst=re.search(pat1,string)
print(rst)

在这里插入图片描述

import re
pat1="p.*y"      #贪婪模式  .任意字符  *任意次 0,1,多   
pat2="p.*?y"  #懒惰模式 ? 0,1次
string="abcddscpythonvfiyftgy"
rst=re.search(pat2,string)
print(rst)

在这里插入图片描述

正则表达式函数

re.match()函数 从头开始搜索 如果头头不匹配 就不合格
re.search()函数 从文本框(字符串)里面搜索 无论是头 尾 中间 都可以 只有一个结果
全局匹配函数
re.sub()函数 用于替换?

import re
pat1="p.*y"
pat2="p.*?y"
string="abcddscpythonvfiyftgy"
rst=re.match(pat1,string)
print(rst)

在这里插入图片描述

import re
pat1="p.*y"
pat2="p.*?y"
string="pabcddscpythonvfiyftgy"#变了
rst=re.match(pat1,string)
print(rst)

在这里插入图片描述>>>

import re
pat1="p.*y"
pat2="p.*?y"
string="hgdfuagphauyfjsgguphbgjkagky"#变了
rst=re.search(pat2,string)#变了
print(rst)

在这里插入图片描述
#re.search()只会出现一个符合要求的

re.compile(pat2).findall(string)

在这里插入图片描述

re.compile(pat1).findall(string)

在这里插入图片描述

常见正则实例
如何匹配.com和.cn,电话号码
import re
##1如何匹配.com和.cn,电话号码
pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
string='<a href="http://www.baidu.com">hj</a>'
rst2=re.compile(pat).findall(string)
print(rst2)

在这里插入图片描述

如何从网页中爬去qq群
import re
#2如何从网页中爬取qq群(如何爬取csdn的一个课程页,并自动提取出QQ群)
pat="<em>QQ:(.*?)</em>"
import urllib.request
data=urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/215").read()
result=re.compile(pat).findall(str(data))
print(result)

.*?是匹配任何字符多次的懒惰模式

第二周第二次课(总共四个小结)

1 urllib实战

作业讲解 :

如何从http://read.douban.com/provider/all中将所有出版社提取出来,把无关信息过滤掉

import re
#3作业  如何从http://read.douban.com/provider/all中将所有出版社提取出来,把无关信息过滤掉
import urllib.request
data=urllib.request.urlopen("http://read.douban.com/provider/all").read()
data=data.decode("utf-8")#指定编码格式解码字符串
pat='<div class="name">(.*?)</div>'
mydata=re.compile(pat).findall(data)
fh=open("E:/1.txt","w")
for i in range(0,len(mydata)):
    fh.write(mydata[i]+"\n")
fh.close()

在这里插入图片描述

#decode()解码
#encode()编码

关于学习方法
1讲过必须熟悉,未讲不急
2多敲代码,自己写的才是自己的
3遇到问题独立解决,利用搜索引擎,提高独立解决问题能力

urllib基础:

urlretrieve()、urlcleanup()、info()、getcode()、geturl()

#urlretrieve()一次性的直接将某个网页爬到我们的本地
#urllib.request.urlretrieve("网址,要爬的url",filename="本地的地址和名字")
#urlcleanup()可以将urlretrieve()产生的缓存清理掉
#info()将一些基本的环境信息展现出来
#getcode()获取当前网页的状态码
#geturl()获取当前爬取的网址

例:

import urllib.request
#urlretrieve()一次性的直接将某个网页爬到我们的本地
#urllib.request.urlretrieve("网址,要爬的url",filename="本地的地址和名字")
urllib.request.urlretrieve("http://www.hellobi.com",filename="E:/1.html")

在这里插入图片描述在这里插入图片描述

#urlcleanup()可以将urlretrieve()产生的缓存清理掉
urllib.request.urlcleanup()
#info()将一些基本的环境信息展现出来
file=urllib.request.urlopen("http://www.hellobi.com")
file.info()

在这里插入图片描述

#getcode()获取当前网页的状态码
#geturl()获取当前爬取的网址
file.getcode()
file.geturl()

在这里插入图片描述

超时设置

由于网速和对方服务器的问题,我们在爬取网页的时候需要时间,如果访问网页时网页长时间未响应,我我们的系统会判断网页超时了,即无法打开该网页。有的时候我们需要根据自己的需要来设置超时的时间值,比如,有些网页反应快,我们希望2秒内没有反应,则判断超时,此时,timeout的值为2.比如,有些网页反应慢,我们希望100秒内没有反应,则判断超时,此时,timeout的值为100.

file=urllib.request.urlopen("http://www.hellobi.com",timeout=1)
file=urllib.request.urlopen("http://www.hellobi.com",timeout=0.01)

在这里插入图片描述

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

在这里插入图片描述

自动模拟HTTP请求

客户端如果要与服务器端进行通信,需要通过http请求,http请求有很多种,我们再次会讲post和get两种请求方式。
登录一个网站就需要post请求,
搜索某些信息时需要get请求。

如何通过爬虫自动获取搜索界面呢?
字段名=字段值 字段与字段之间用 &连接

#自动提交get请求
import urllib.request
keywd="韦玮"#如果是中文会报错,需要加上一行代码urllib.request.quote(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=fh=open("E:/2.html","wb")
fh.write(data)
fh.close()

在这里插入图片描述

#自动提交post请求
#http://www.iqianyue.com/mypost/
#http://www.sina.com.cn/
#找 <form method="post"  找name这个属性对应的单词
import urllib.request
import urllib.parse
url="http://www.iqianyue.com/mypost/"#真实地址
mydata=urllib.parse.urlencode({
    "name":"fanhuiling",
    "pass":"asdafad"
    }).encode("utf-8")#进行相应的编码为中文
req=urllib.request.Request(url,mydata)#封装为请求
#req.add_header#还可以伪装成浏览器,具体之后补充
data=urllib.request.urlopen(req).read()
fh=open("D:/FHLAZ/Python37/test2019.2.10/3.html","wb")
fh.write(data)
fh.close()

在这里插入图片描述
在这里插入图片描述

2爬虫的异常处理

异常处理概述

爬虫在运行的过程中,很多时候都会遇到这样或者那样的异常。如果没有异常处理,爬虫遇到异常时就会直接崩溃停止运行,下次在运行时,优惠重头开始,所以,要开发一个具有顽强生命力的爬虫,必须要进行异常处理。

常见状态码及含义(明白基本含义)
200   请求正常进行
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与HTTPRrror

两者都是异常处理的类,HTTPError是URLError的子类,HTTPError有异常状态码和异常原因,URLError没有异常状态码,所以,在处理的时候,不能用URLError直接代替HTTPError,因为无法获得异常状态码。如果要代替,必须要判断是否有状态码属性。

URLError产生可能原因:

1、连不上服务器
2、远程的URL不存在
3、假如本地没有网络
4、假如触发了对应的HTTPError子类

异常处理实战
#异常处理实战
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)

在这里插入图片描述

3爬虫的浏览器伪装技术

浏览器伪装技术原理

我们可以试着爬取csdn博客,然后会返回403禁止访问,因为对方服务器会对爬虫进行屏蔽,我们需要伪装成浏览器才能爬取。浏览器伪装我们一般通过报头进行。
打开网页 按F12 点击NetworK 然后按刷新f5 最后任意点一下NetworK下面的name里面的一行 然后右边就有Headers 最后找User-Agent:后面的东西进行浏览器伪装

#浏览器伪装
import urllib.request
url="http://blog.csdn.net/weiwei_pig"
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).read()#这种通过有报头的方式打开
fh=open("D:/FHLAZ/Python37/test2019.2.10/4.html","wb")
fh.write(data)
fh.close()

在这里插入图片描述
在这里插入图片描述

4 python新闻爬虫实战

新闻爬虫需求及实现思路

需求:将新浪新闻首页(http://news.sina.com.cn/)所有新闻都爬到本地
思路:先爬首页,通过正则获取所有新闻链接,然后依次爬各个新闻,并储存在本地。

####### 新闻爬虫编写实战

# python新闻爬虫实战

import urllib.request
import re
data=urllib.request.urlopen("http://news.sina.com.cn/").read()
data2=data.decode("utf-8","ignore")#gbk  utf-8
#右键  查看源代码 Ctrl+f
pat='href="(https://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:/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)

这个需要自己在F盘里面建立一个sinanews文件夹
在这里插入图片描述
在这里插入图片描述

作业

爬取csdn博客http://blog.csdn.net/首页显示的所有文章,每个文章内容单独生存一个本地网页存在本地中。
难点:浏览器伪装,循环爬各文章
思路:先爬首页,然后通过正则筛选出所有文章url,然后通过循环分别爬取这些url到本地。

Encode()编码 和 decode()解码

第三周

1爬虫防屏蔽手段之代理服务器实战

作业讲解
思路1 将opener添加为全局

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/63.0.3239.132 Safari/537.36")
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="(https://blog.csdn.net/.*?)"'
allurl=re.compile(pat).findall(data)
print(len(allurl))
for i in range(0,len(allurl)):
    try:
        print("第"+str(i)+"次爬取")
        thisurl=allurl[i]
        file="F:/csdn/"+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
import re
#urllib.request.urlretrieve("http://blog.csdn.net/",filename="D:/FHLAZ/Python37/test2019.2.10/csdn/first.html")
#data=urllib.request.urlopen("http://blog.csdn.net/").read()
headers=("user-agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open("http://blog.csdn.net/").read()
data=data.decode("utf-8","ignore")
fh=open("D:/FHLAZ/Python37/test2019.2.10/csdn/first.html","w")
fh.write(str(data))
fh.close()
pat='<a href="(https://blog.csdn.net/.*?)"'
allurl=re.compile(pat).findall(data)
for i in range(0,len(allurl)):
    try:
        print("第"+str(i)+"次爬取")
        thisurl=allurl[i]
        file="D:/FHLAZ/Python37/test2019.2.10/csdn/"+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)

思路2 用request

什么是代理服务器

代理服务器就是一个处于我们和互联网中间的服务器,如果使用代理服务器,我们浏览信息的时候,先向代理服务器发出请求,然后由代理服务器向互联网获取消息,再返回给我们。

使用代理服务器进行爬取网页实战

使用代理服务器进行信息爬取,可以很好的解决ip限制的问题
免费代理ip 网址 :
http://www.xlcldaili.com/
http://31f.cn/
我试了很多,有的可以,有的不行,结果图如下

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="114.249.118.221:9000"#多个代理ip:roxy_addr=["120.40.253.74:9999",""]
url="http://www.baidu.com"
data=use_proxy(url,proxy_addr)
print(len(data))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2图片爬虫实战(成功)

什么是图片爬虫

图片爬虫是从互联网中自动把对方服务器上的图片趴下来的爬虫程序

淘宝图片爬虫实战:如何爬取淘宝的图片
(没有成功,可能是因为需要登录)

因为后续的内容太长了,而且还在不断尝试是否成功。所以开了个单篇。链接如下:
数据分析与数据挖掘实战视频——学习笔记之淘宝图片爬虫(包括淘宝登录)

2019.5.25号 我尝试了之前没有学习的cookies加session,最后把功能实现了。
之后我回头把失败的项目实现的话,我会开个单篇,不然笔记太长太乱了。还会重新审核。

作业:试试把千图网(http://www.58pic.com/) 某频道的所有图片爬下来,要高清版
(最开始失败了,但最后成功了,好像重点是乱码问题,见下一篇)

接下来的内容见:数据分析与爬虫实战视频——学习笔记(二)
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值