**发起一个get请求**
?
导入模块
import request
发起请求
响应对象 = requests.get(网址)
**发起一个带请求头的get请求**
?
requests.get(网址,headers=字典)
**发起一个get请求,带上参数**
?
request.get(url, params=参数字典)
!
效果,会在url后拼上传递的参数
**例如**http://www.baidu.com/?name=zs&age=18
post请求同理
**发起请求,伪装为浏览器**
?
办法,发起请求时,在请求头中添加user-agent数据
**使用代理发起请求**
?
request.get(网址,proxies=代理字典)
!
代理字典的格式:
{"协议":"ip:端口""}
例如:
{"http":"http://12.34.56.01:8000", "https":"https://12.34.56.01:8000"}
**发起一个post请求**
?
requests.post(url, params=参数字典)
**访问用户中心的办法**
?
**一,请求头中带上cookies数据**
request.get(网址,headers=字典)
备注,字典中存一个cookie的键值对
键是:Cookie
值就是类似于这样的字符串:uuid_tt_dd=10_28743412270-1569723942844-420746; dc_session_id=10_1569723942844.879679;
**二,get方法带上cookie参数,值是一个字典**
**格式:**
response = request.get(url, headers=请求头字典, cookies=cookie字典)
字典的键是:uuid_tt_dd
值是:10_28743412270-1569723942844-420746
字典的完整形态类以于
{
'uuid_tt_dd'='10_28743412270-1569723942844-420746',
'dc_session_id'='10_1569723942844.879679'
}
**三,使用session类**
1,实例化一个对session类对象
2,让该对象去登陆网站,登陆成功对象便得到了cookie数据
3,让该对象去访问用户中心URL,访问时会带上cookie。所以可以得到正确的响应。
**例子:**
s = requests.session()
s.post(登陆url, params=参数字典)
res = s.get(用户中心url)
**如何安装requests模块**
?
pip install requests
**获取响应内容**
?
方式一:string类型的结果
响应对象.text
方式二:bytes数据类型
响应对象.content
**获取响应对象的默认解码格式**
?
响应对象.encoding
**修改响应对象的默认解码格式为utf8**
?
响应对象.encoding="utf8"
**响应对象的text属性与content属性的相同点与不同点**
?
相同点:
都可以拿到响应的内容
不同点:
数据类型不一样
text拿到string类型
content拿到bytes类型
注意:
如果访问的目标是图片,文件,音频视频等,需要使用content属性来拿内容
**根据图片网址img_url,保存图片
介绍流程**
?
1 发起请求,获取响应对象。
2 读取响应对象中的内容,用content属性读,得到图片的内容,bytes类型
3 保存图片,以字节流模式写入内容
**获取响应状态码**
?
响应对象.status_code
**获取响应头**
?
响应对象.headers
**获取响应网址**
?
响应对象.url
**获取请求头**
?
响应对象.request.headers
**伪造成浏览器在访问**
?
通过在请求头中添加user-agent来伪造成浏览器
爬虫经验小结:
基本的爬虫流程
?
一,发起请求,获得响应对象
二,从响应对象中提出有效内容
包括:
后面要爬取的url
期望的数据
三,保存数据
四,发起新的请求或者结束
如何获取下一页的URL地址
?
一,寻找URL规律,根据规律来拼下一页
二,通过"下一页"链接url来找
如何解决破解图片验证码
?
使用打码平台
执行给定的代码,打码平台会识别指定路径的图片验证码
并且返回识别后的结果
多线程爬虫:
如何启动一个线程
?
》导入线程模块
import threading
》创建线程对象
t = threading.Thread(target=函数体,args=(参数,))
》让线程对象运行起来
t.start()
!
明确主线程与子线程的执行与等待关系
获取当前代码中所有的线程对象,得到一个列表
?
threading.enumerate()
!
[<_MainThread(MainThread, started 22116)>, <Thread(Thread-1, started 16752)>, <Thread(Thread-2, started 14352)>] 总的
获取当前线程的对象
?
threading.current_thread()
线程类的定义与启动
?
自定义一个类
让该类继承threading.Thread
同时在自定义类中重写run方法
就可
例子:
class Drawing(threading.Thread):
def run(self):
for x in range(3):
print('正在绘制图片', x)
time.sleep(1)
》线程类实例化为一个对象并运行:
t2 = Drawing()
t2.start()
让当前的线程全部执行完毕后
主线程再进行下一条
?
线程对象.join()
例子:
t.join()
线程锁的定义与使用
?
定义
import threading
生成线程锁对象
锁对象 = threading.Lock()
上锁
锁对象.acquire()
解锁
锁对象.release()
创建一个线程队列队象
?
代码:
import queue
q = queue.Queue()
补充:
生成一个容量为6的队列对象
q = queue.Queue(6)
往线程队列中存入数据
?
代码:
队列.put(数据)
说明:
如果队列满了,会阻塞
补充:
队列.put(数据,block=False)
队列如果满了,就会报一个错误
从线程队列中取出数据
?
代码:
队列.get()
说明:
队列如果是空的,会阻塞
补充:
队列.get(block=False)
队列如果空了,就会报一个错误
队列中计数器减一
?
队列.task_done()
补充:
一般与队列等待共同使用
队列中的等待
?
队列.join()
可以让任务没有完成的队列,阻塞
scrapy爬虫框架
安装scrapy
?
pip install scrapy
创建项目
?
格式:
scrapy startproject 项目名称
例子:
scrapy startproject xiaoshuo
效果:
会在当前目录创建一个目录
创建爬虫
?
格式:
scrapy genspider 爬虫名称 允许访问的域名
例子:
scrapy genspider qidian www.qidian.com
注意:
要先cd到项目目录中
然后再创建爬虫
效果:
在spiders目录中新增了一个爬虫名.py
爬虫项目运行
?
格式:
scrapy crawl 爬虫名称
例子:
scrapy crawl qidian
配置:
不尊守爬虫协议
ROBOTSTXT_OBEY = False