s16day37 爬虫2

参考博客:http://www.cnblogs.com/wupeiqi/articles/6229292.html

课堂代码:https://github.com/liyongsan/git_class/tree/master/day37/

内容回顾:
1. Http协议
Http协议:GET / http1.1/r/n...../r/r/r/na=1
TCP协议:sendall("GET / http1.1/r/n...../r/r/r/na=1")

2. 请求体
GET: GET / http1.1/r/n...../r/r/r/n
POST:
POST / http1.1/r/n...../r/r/r/na=1&b=2
POST / http1.1/r/n...../r/r/r/{"k1":123}

PS: 依据Content-Type请求头
3. requests模块
- method
- url
- params
- data
- json
- headers
- cookies
- proxies
4. BeautifulSoup4模块
HTML
XML

5. Web微信
- 轮训
- 长轮训

今日内容概要:
1. Web微信

2. 高性能相关

3. Scrapy

内容详细:
1. Web微信

- 防盗链
- headers
- cookies

- 检测请求
- url

- Session中:
- qcode
- ctime
- login_cookie_dict
- ticket_dict_cookie
- ticket_dict
- init_cookie_dict

- 收发消息

2. 高性能相关

基本原理:
IO多路复用:select,用于检测socket对象是否发生变化(是否连接成功,是否有数据到来)
Socket:socket客户端

import socket
import select

class Request(object):
def __init__(self,sock,func,url):
self.sock = sock
self.func = func
self.url = url

def fileno(self):
return self.sock.fileno()

def async_request(url_list):

input_list = []
conn_list = []

for url in url_list:
client = socket.socket()
client.setblocking(False)
# 创建连接,不阻塞
try:
client.connect((url[0],80,)) # 100个向百度发送的请求
except BlockingIOError as e:
pass

obj = Request(client,url[1],url[0])

input_list.append(obj)
conn_list.append(obj)

while True:
# 监听socket是否已经发生变化 [request_obj,request_obj....request_obj]
# 如果有请求连接成功:wlist = [request_obj,request_obj]
# 如果有响应的数据: rlist = [request_obj,request_obj....client100]
rlist,wlist,elist = select.select(input_list,conn_list,[],0.05)
for request_obj in wlist:
# print('连接成功')
# # # # 发送Http请求
# print('发送请求')
request_obj.sock.sendall("GET / HTTP/1.0\r\nhost:{0}\r\n\r\n".format(request_obj.url).encode('utf-8'))
conn_list.remove(request_obj)

for request_obj in rlist:
data = request_obj.sock.recv(8096)
request_obj.func(data)
request_obj.sock.close()
input_list.remove(request_obj)

if not input_list:
break

使用一个线程完成并发操作,如何并发?
当第一个任务到来时,先发送连接请求,此时会发生IO等待,但是我不等待,我继续发送第二个任务的连接请求....

IO多路复用监听socket变化
先连接成功:
发送请求信息: GET / http/1.0\r\nhost....
遇到IO等待,不等待,继续检测是否有人连接成功:
发送请求信息: GET / http/1.0\r\nhost....
遇到IO等待,不等待,继续检测是否有人连接成功:
发送请求信息: GET / http/1.0\r\nhost....

有结果返回:
读取返回内容,执行回调函数
读取返回内容,执行回调函数
读取返回内容,执行回调函数
读取返回内容,执行回调函数
读取返回内容,执行回调函数
读取返回内容,执行回调函数
读取返回内容,执行回调函数

问题:什么是协程?
单纯的执行一端代码后,调到另外一端代码执行,再继续跳...

异步IO:
- 【基于协程】可以用 协程+非阻塞socket+select实现,gevent
- 【基于事件循环】完全通用socket+select实现,Twsited

1. 如何提高爬虫并发?
利用异步IO模块,如:asyncio,twisted,gevent
本质:
- 【基于协程】可以用 协程+非阻塞socket+select实现,gevent
- 【基于事件循环】完全通用socket+select实现,Twsited,tornado

2. 异步非阻塞
异步:回调 select
非阻塞:不等待 setblocking(False)

3. 什么是协程?
pip3 install gevent

from greenlet import greenlet

def test1():
print(12)
gr2.switch()
print(34)
gr2.switch()

def test2():
print(56)
gr1.switch()
print(78)

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()

3. 爬虫
- request+bs4+twisted或gevent或asyncio
- scrapy框架
- twisted
- 自己html解析
- 限速
- 去重
- 递归,找4层
- 代理
- https
- 中间件
....
- 安装scrapy
依赖Twisted

- 开始写爬虫
执行命令:
scrapy startproject sp1

sp1
- sp1
- spiders 爬虫
- xx.py
- chouti.py
- middlewares 中间件
- pipelines 持久化
- items 规则化
- settings 配置
- scrapy.cfg

cd sp1
scrapy genspider xx xx.com
scrapy genspider chouti chouti.com
- scrapy crawl chouti
name
allow_domains
start_urls
parse(self,response)
yield Item
yield Request(url,callback)

本周任务:
1. Web微信

2. 高性能示例保存

3.
- 煎蛋
- 拉钩
- 知乎
- 抽屉

day37 爬虫2(web微信、高性能相关、Scrapy)的更多相关文章

  1. python自动化开发-[第二十四天]-高性能相关与初识scrapy

    今日内容概要 1.高性能相关 2.scrapy初识 上节回顾: 1. Http协议 Http协议:GET / http1.1/r/n...../r/r/r/na=1 TCP协议:sendall(&qu ...

  2. 高性能相关、Scrapy框架

    高性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...

  3. 爬虫概要及web微信请求分析

    一.爬虫概要 1.网络爬虫是什么 百度百科:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常 ...

  4. 爬虫相关-scrapy框架介绍

    性能相关-进程.线程.协程 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. 串行执行 import requests def fetc ...

  5. Python 爬虫五 进阶案例-web微信登陆与消息发送

    首先回顾下网页微信登陆的一般流程 1.打开浏览器输入网址 2.使用手机微信扫码登陆 3.进入用户界面 1.打开浏览器输入网址 首先打开浏览器输入web微信网址,并进行监控: https://wx.qq ...

  6. python 全栈开发,Day137(爬虫系列之第4章-scrapy框架)

    一.scrapy框架简介 1. 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前S ...

  7. 基于flask的web微信

    web微信 1.扫码获取头像 当你打开web微信的时候,因为http是无状态的,web微信如何实时的获取用户的扫码动作? 那么这里用到的是长轮询的方式. from flask import Flask ...

  8. web微信开发

    群里接收消息时,使用广播,但需要刷新页面才能接收到广播内容. - 轮询: 定时每秒刷新一次,当群不活跃时,群里的每个客户端都在刷新,对服务端压力太大. - 长轮询:客户端连服务端,服务端一直不断开,也 ...

  9. 八、asynicio模块以及爬虫应用asynicio模块(高性能爬虫)

    asynicio模块以及爬虫应用asynicio模块(高性能爬虫) 一.背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行, ...

随机推荐

  1. PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)

    题目大意:原题链接 给你一张图,初始你在房间1,初始生命值为100,进入每个房间会加上那个房间的生命(可能为负),问是否能到达房间n.(要求进入每个房间后生命值都大于0) 解题思路: 解法一:Floy ...

  2. 如何使用iClap进行产品管理?

    iClap概述: iClap是DevStore的全新产品,于2015年8月29号上线,该款产品专注于为移动互联网企业提供企业规范化解决方案,颠覆传统的产品管理模式,实现产品管理场景化.APP.甚至原型 ...

  3. Python的幂运算

    直接用例子说明

  4. Object-c 开发之property

    @property 关键字:atomic,nonatomic,readonly,readwrite,assign,retain,copy,getter,setter,strong 默认行为(atomi ...

  5. 关于MVC 上传文件

    前台代码如下 @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>Index</ti ...

  6. logstash编写2以及结合kibana使用

    有时候根据日志的内容,可能一行不能全部显示,会延续在下一行,为了将上下内容关联在一起,于是codec插件中的multiline插件 就派上用场了,源日志内容: [2017-09-20T16:04:34 ...

  7. 20145312 《Java程序设计》第四周学习总结

    20145312 <Java程序设计>第四周学习总结 学习笔记 Chapter 6 6.1何为继承 1.定义:面向对象中子类继承父类,避免重复的行为定义. 6.1.1 继承共同行为 1.以 ...

  8. mybatis的sql映射文件—增删改查

    前提:需要的包log4j.jar,mybatis-3.4.1.jar,mysql-connector-java-5.1.37-bin.jar 1.基本类 员工类 package com.hand.my ...

  9. LeetCode——Longest Palindromic Subsequence

    1. Question Given a string s, find the longest palindromic subsequence's length in s. You may assume ...

  10. js 日期 处理 加减时分秒

    1.日期处理 var _d = new Date("2018/01/01 12:00:00"); _d = new Date(_d.valueOf() + 60 * 1000);/ ...