python开发自己的工具包_爬虫开发python工具包介绍 (4)
本文来自网易云社区
作者:王涛
此处我们给出几个常用的代码例子,包括get,post(json,表单),带证书访问:
Get 请求@gen.coroutine
def fetch_url():
try:
c = CurlAsyncHTTPClient() # 定义一个httpclient
myheaders = {
"Host": "weixin.sogou.com",
"Connection": "keep-alive",
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 ",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}
url = "http://weixin.sogou.com/weixin?type=1&s_from=input&query=%E4%BA%BA%E6%B0%91%E6%97%A5%E6%8A%A5&ie=utf8&_sug_=n&_sug_type_="
req = HTTPRequest(url=url, method="GET", headers=myheaders, follow_redirects=True, request_timeout=20, connect_timeout=10,
proxy_host="127.0.0.1",
proxy_port=8888)
response = yield c.fetch(req) # 发起请求
print response.code
print response.body
IOLoop.current().stop() # 停止ioloop线程
except:
print traceback.format_exc()
Fiddler 抓到的报文请求头:
POST JSON数据请求@gen.coroutine
def fetch_url():
"""抓取url"""
try:
c = CurlAsyncHTTPClient() # 定义一个httpclient
myheaders = {
"Host": "weixin.sogou.com",
"Connection": "keep-alive",
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 ",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Content-Type": "Application/json",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}
url = "http://127.0.0.1?type=1&s_from=input&query=%E4%BA%BA%E6%B0%91%E6%97%A5%E6%8A%A5&ie=utf8&_sug_=n&_sug_type_="
body =json.dumps({"key1": "value1", "key2": "value2"}) # Json格式数据
req = HTTPRequest(url=url, method="POST", headers=myheaders, follow_redirects=True, request_timeout=20, connect_timeout=10,
proxy_host="127.0.0.1",proxy_port=8888,body=body)
response = yield c.fetch(req) # 发起请求
print response.code
print response.body
IOLoop.current().stop() # 停止ioloop线程
except:
print traceback.format_exc()
Fiddler 抓到的报文请求头:
POST Form表单数据请求@gen.coroutine
def fetch_url():
"""抓取url"""
try:
c = CurlAsyncHTTPClient() # 定义一个httpclient
myheaders = {
"Host": "weixin.sogou.com",
"Connection": "keep-alive",
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 ",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
# "Content-Type": "Application/json",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}
import urllib
url = "http://127.0.0.1?type=1&s_from=input&query=%E4%BA%BA%E6%B0%91%E6%97%A5%E6%8A%A5&ie=utf8&_sug_=n&_sug_type_="
body =urllib.urlencode({"key1": "value1", "key2": "value2"}) # 封装form表单
req = HTTPRequest(url=url, method="POST", headers=myheaders, follow_redirects=True, request_timeout=20, connect_timeout=10,
proxy_host="127.0.0.1",proxy_port=8888,body=body)
response = yield c.fetch(req) # 发起请求
print response.code
print response.body
IOLoop.current().stop() # 停止ioloop线程
except:
print traceback.format_exc()
Fiddler 抓到的报文请求头:
添加证书访问def fetch_url():
"""抓取url"""
try:
c = CurlAsyncHTTPClient() # 定义一个httpclient
myheaders = {
"Host": "www.amazon.com",
"Connection": "keep-alive",
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
"User-Agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/68.0.3440.106 Safari/537.36"),
"Accept": ("text/html,application/xhtml+xml,"
"application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"),
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}
import urllib
url = "https://www.amazon.com/"
req = HTTPRequest(url=url, method="GET", headers=myheaders, follow_redirects=True, request_timeout=20, connect_timeout=10,proxy_host="127.0.0.1",
proxy_port=8888,ca_certs="FiddlerRoot.pem") # 绑定证书
response = yield c.fetch(req) # 发起请求
print response.code
print response.body
IOLoop.current().stop() # 停止ioloop线程
except:
print traceback.format_exc()
Fiddler抓到的报文(说明可以正常访问)
四、总结
抓取量少的时候,建议使用requests,简单易用。
并发量大的时候,建议使用tornado,单线程高并发,高效易编程。
以上给出了requests和Fiddler中常用的接口和参数说明,能解决爬虫面对的大部分问题,包括并发抓取、日常的反爬应对,https网站的抓取。
附上一段我自己的常用抓取代码逻辑:import randomfrom tornado.ioloop import IOLoopfrom tornado import genfrom tornado.queues import Queue
import random
from tornado.ioloop import IOLoop
from tornado import gen
from tornado.queues import Queue
TASK_QUE = Queue(maxsize=1000)
def response_handler(res):
""" 处理应答,一般会把解析的新的url添加到任务队列中,并且解析出目标数据 """
pass
@gen.coroutine
def url_fetcher_without_param():
pass
@gen.coroutine
def url_fetcher(*args,**kwargs):
global TASK_QUE
c = CurlAsyncHTTPClient()
while 1:
#console_show_log("Let's spider")
try:
param = TASK_QUE.get(time.time() + 300) # 5 分钟超时
except tornado.util.TimeoutError::
yield gen.sleep(random.randint(10,100))
continue
try:
req = HTTPRequest(url,method=,headers=,....) # 按需配置参数
response = yield c.fetch(req)
if response.coe==200:
response_handler(response.body)
except Exception:
yield gen.sleep(10)
continue
finally:
print "I am a slow spider"
yield gen.sleep(random.randint(10,100))
@gen.coroutine
def period_callback():
pass
def main():
io_loop = IOLoop.current()
# 添加并发逻辑1
io_loop.spawn_callback(url_fetcher, 1)
io_loop.spawn_callback(url_fetcher, 2)
io_loop.spawn_callback(url_fetcher_without_param) # 参数是可选的
# 如果需要周期调用,调用PeriodicCallback:
PERIOD_CALLBACK_MILSEC = 10 # 10, 单位ms
io_loop.PeriodicCallback(period_callback,).start()
io_loop.start()
if __name__ == "__main__":
main()
以上,欢迎讨论交流
五、参考:
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。
python开发自己的工具包_爬虫开发python工具包介绍 (4)相关推荐
- 爬虫python和c语言区别_爬虫概述 - Python教程 - C语言网
网络爬虫(又称为网页蜘蛛,网络机器人,更经常的称为网页追逐者),它按照一定的规则自动地抓取网络信息. 1. 产生背景 随着时代的进步,互联网上拥有大量的信息,但是我们该如何高效的获取这些信息成为了一个 ...
- Arduino开发(一)_软件开发IDE工具的安装
Arduino开发(一)_软件开发IDE工具的安装 学习Arduino开发首先需要安装软件开发工具,下面给大家做详细的演示, Arduino官方网站网址如下: https://www.arduino. ...
- go与python作为后端_golang和python有什么区别?_后端开发
golang吉祥物是啥?_后端开发 golang吉祥物是一只英文名为"gopher"的地鼠(土拨鼠),大大的眼睛,圆圆的身子,短短的手. golang和python有什么区别?下面 ...
- python内置的集成开发工具是什么_python内置的集成开发工具是什么_后端开发
go语言之goroute协程_后端开发 协程(coroutine)是Go语言中的轻量级线程实现,由Go运行时(runtime)管理.下面就来由go入门教程栏目介绍一下go语言中的goroute协程. ...
- python的pyaudio教程入门_『开发技巧』Python音频操作工具PyAudio上手教程
『开发技巧』Python音频操作工具PyAudio上手教程 0.引子 当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包. ...
- python爬虫开发与项目实战pdf_Python爬虫开发与项目实战PDF高清文档下载
随着大数据时代到来,网络信息量也变得更多更大,基于传统搜索引擎的局限性,网络爬虫应运而生,本书从基本的爬虫原理开始讲解,通过介绍Pthyon编程语言和Web前端基础知识引领读者入门,之后介绍动态爬虫原 ...
- python处理音频的软件_『开发技巧』Python音频操作工具PyAudio上手教程
『开发技巧』Python音频操作工具PyAudio上手教程 0.引子 当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包. ...
- python画动物代码_如何用python画简单的动物_后端开发
python3.x完全兼容python2.x吗?_后端开发 可以说是完全不兼容.相对于Python的早期版本,Python3是一个较大的升级,为了不带入过多的累赘,Python 3.0在设计的时候没有 ...
- python是语言还是软件_程序开发语言之Python:是追逐还是坚守?
Python作为计算机程序设计语言的其中一种,最初是被设计用于编写自动化脚本(shell),随着版本的不断更新.语言新功能的添加和机器学习的兴起,Python从2017年开始受到广泛关注. Pytho ...
最新文章
- Android读写XML(上)
- Linux环境编程--进程
- 如何证明CRM WebClient UI上的应用是有状态(Stateful)的
- 4步win7下简单FTP服务器搭建(试验成功)
- Java—servlet简单使用
- 使用Quick BI连接AnalyticDB for PostgreSQL数据源
- python thread模块_【Python@Thread】thread模块
- C++实现字符串数组的计数功能总结
- Oracle 认证下载
- 深度学习图像分类问题涨分总结
- 汇编_stack的使用
- C#开发串口调试助手的详细教程
- CHM [CHM 电子书 文件格式 定义规范]
- 自信心受挫,该如何让项目团队成员重新振作起来
- 迷你星域冒险服务器维护中,迷你世界星域冒险攻略 星域冒险快速通关技巧[多图]...
- 多维数组存储的两种方式
- 《伟大的小细节:互联网产品设计中的微创新思维》——3.4 身份特征与使用习惯因素...
- 计算机html大作业聊天室,java大作业设计报告-JAVA聊天室.docx
- 爬虫-大学教务系统选修课抢课
- 国信证券笔试题总分120分