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+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天池 在线编程 最小的行程(动态规划)

文章目录1. 题目2. 解题1. 题目 给定一个二维矩阵&#xff0c;找到从上到下的最小路径。只能向左下&#xff0c;下&#xff0c;右下移动 所有的元素都是正整数 矩阵大小 < 200x200 样例 1: 输入: 1 2 3 4 5 6 7 8 9 输出: 12 解释: 最短的路径为:1->4->7, 返回12.样…

messagebox

private void button1_Click(object sender, EventArgs e){/*//弹出消息对话框&#xff0c;包含确定按钮MessageBox.Show("消息","标题");//弹出消息对话框&#xff0c;包含确定按钮MessageBox.Show("消息", "标题",MessageBoxButtons…

centos 升级php5.5_CentOS 5.x 系统yum 升级php到5.2.x的方法(测试可用)

在用的centos 5.4系统中&#xff0c;目前提供php版本为5.1.6&#xff0c;通过以下方法升级PHP到5.2比较方便。先将以下地址导入&#xff1a;复制代码 代码示例:# rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka# vi /etc/yum.repos.d/CentOS-Base.repo 增加…

fluent瞬态计算终止条件在哪里设置_Fluent案例7【圆柱绕流】

一个瞬态的圆柱绕流案例知识点&#xff1a;瞬态圆柱绕流的模拟一个后处理的方法&#xff1a;将瞬态模型中一个点的速度变化绘成图表并将数值导出excel文件模型如下图所示&#xff0c;左边界为速度边界进口速度0.5m/s&#xff0c;试模拟出计算域中的速度变化打开workbench&#…

qq登录界面句柄_别小看QQ邮箱测试,80%的测试新手都不能写出完整的测试用例~...

对于很多刚进入测试行业的新手来说&#xff0c;由于自身的工作经验不足&#xff0c;虽有测试基础知识傍身&#xff0c;但仍然很难将测试用例写的尽善尽美。因此&#xff0c;学习别人的测试经验&#xff0c;将是你成为测试达人的必经之路。今天&#xff0c;我们就以QQ邮箱为例&a…

LeetCode 878. 第 N 个神奇数字(二分查找)

文章目录1. 题目2. 解题1. 题目 如果正整数可以被 A 或 B 整除&#xff0c;那么它是神奇的。 返回第 N 个神奇数字。由于答案可能非常大&#xff0c;返回它模 10^9 7 的结果。 示例 1&#xff1a; 输入&#xff1a;N 1, A 2, B 3 输出&#xff1a;2示例 2&#xff1a; 输…

js中的四舍五入函数

刚学到这部分时&#xff0c;感觉特别简单。可最近写个ajax分页时&#xff0c;忽然忘记应该怎么使用哪种函数来计算总的页数。。。哎&#xff0c;好记星不如烂笔头啊&#xff0c;还是老老实实的写下来吧。随时查看。 1.Math.ceil(x)&#xff1a;对x向上取整&#xff0c;即返回大…

为什么百度统计里面的广告那么多_里面东西一模一样的桶装方便面为什么比袋装贵那么多?...

今天特地买了一桶桶装的和一袋袋装的&#xff0c;同品牌同系列同口味&#xff0c;里面面饼&#xff0c;配料包也一模一样&#xff0c;桶装的只是多了一个小勺子&#xff0c;为什么一袋二元五&#xff0c;一桶就要卖4元&#xff1f;并且大家好像都不觉得有什么不妥……(好吧我就…

php获取页面视频文件,PHP获取各大视频网站页面中的Flash播放地址

先看一个简单的,我用PHP实现了这个功能,我觉得用PHP来做这项工作简直是一种享受&#xff01;使用其提供的强大的HTML页面处理函数和正则表达式&#xff0c;短短的几行代码就能搞定这个功能。贴一下关键代码://获取优酷页面中的flash地址function get_flash_url( $url ){$lines …

LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等

文章目录1. 题目2. 解题1. 题目 给你长度相等的两个字符串 s1 和 s2 。 一次 字符串交换 操作的步骤如下&#xff1a;选出某个字符串中的两个下标&#xff08;不必不同&#xff09;&#xff0c;并交换这两个下标所对应的字符。 如果对 其中一个字符串 执行 最多一次字符串交换…

gradle 上传jar包_Gradle学习记录014 关于依赖的声明

详细学习Gradle构建的依赖声明。该学习记录基于Gradle官方网站资料。本篇参考链接如下&#xff1a;https://docs.gradle.org/current/userguide/declaring_dependencies.html声明一个模块作为依赖通常声明一个模块作为依赖&#xff0c;需要指定这个模块的版本。Gradle提供了一套…

win10版本查看_想知道电脑中安装的win10版本号,用这3招就对了,一键查看

自从微软在Windows 10中更改了发布模型后&#xff0c;很多用户就对找出他们在电脑上安装的Windows 10版本感兴趣。大家可能都已经知道&#xff0c;微软不会再发布Windows的主要版本&#xff0c;而是会不断发布更新&#xff0c;这让人想起许多Linux发行版的滚动发行模型。如果你…

php熊掌号api,织梦dedecms熊掌号自动API提交当日资源php代码

你是不会代码&#xff0c;没有代码基础&#xff1f;是否每次还需要登录熊掌号后台&#xff1f;每次发表文章都需要登录熊掌号后台站点天级收录&#xff0c;进行提交资源网站链接&#xff1f;今天分享一段代码轻松解决这些问题。require_once ("include/common.inc.php&quo…

LeetCode 1791. 找出星型图的中心节点(图出入度)

文章目录1. 题目2. 解题1. 题目 有一个无向的 星型 图&#xff0c;由 n 个编号从 1 到 n 的节点组成。 星型图有一个 中心 节点&#xff0c;并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。 给你一个二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示在节…

ole db 错误 通讯链接失败_西门子PLC1200的S7通讯(同一项目下)--GET接收指令

西门子PLC1200的S7通讯&#xff08;同一项目下&#xff09;--GET接收指令1.0 首先在同一项目下&#xff0c;组态两个PL&#xff0c;如下图&#xff0c;组态了2个1200PLC 1214C的PLC2.0 点击链接里面&#xff0c;在窗口的右上角选择S7连接&#xff0c;这个窗口可以看到本地ID&am…

python求超级素数代码_C语言求超级素数

展开全部不考虑时间的需求&#xff0c;就用最简单的素数判断函数了#include #include #include bool isPrime(int n){for(int i 2; i < sqrt(n); i){if(n%i 0)return false;}return true;}int main(){int maxprime 0, count 0;for(int i 101; i {int temp i;bool fla…

php中写salt,请快速检查这个PHP+SALT实现-不工作?

在教程的基础上,使用salt实现一个基本的用户注册登录系统。目前我在注册阶段使用这个:define(SALT_LENGTH, 9);function generateHash($plainText, $salt null){if ($salt null){$salt substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);}else{$salt substr($salt, 0, SA…

电磁波

可见光谱只占有宽广的电磁波谱的一小部分。电磁波&#xff0c;又称电磁辐射&#xff0c;是由同相振荡且互相垂直的电场与磁场在空间中以波的形式传递能量和动量&#xff0c;其传播方向垂直于电场与磁场构成的平面。电磁辐射的载体为光子&#xff0c;不需要依靠介质传播&#xf…

LeetCode 1792. 最大平均通过率(优先队列)

文章目录1. 题目2. 解题1. 题目 一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班都会进行一场期末考试。 给你一个二维数组 classes &#xff0c;其中 classes[i] [passi, totali] &#xff0c;表示你提前知道了第 i 个班级总共有 totali 个学生…

分段线性插值c语言程序_【短道速滑】OpenCV中cvResize函数使用双线性插值缩小图像长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。...

点击上方↑↑↑“OpenCV学堂”关注我作者网名&#xff1a;laviewpbt是图像处理&#xff0c;算法实现与加速优化方面的大神&#xff01;其开发的imageshop软件大小只有1MB&#xff0c;却实现了非常丰富与复杂的各种图像处理功能&#xff0c;邮箱地址为&#xff1a;Email: laview…