本文来自网易云社区

作者:王涛

此处我们给出几个常用的代码例子,包括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()

以上,欢迎讨论交流

五、参考:

  1. requests快速入门:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

  2. requests高级应用:http://docs.python-requests.org/en/master/user/advanced/

  3. 什么是CA_BUNDLE:https://www.namecheap.com/support/knowledgebase/article.aspx/986/69/what-is-ca-bundle

  4. 如何用requests下载图片:https://stackoverflow.com/questions/13137817/how-to-download-image-using-requests

  5. tornado AsyncHttpClient: https://www.tornadoweb.org/en/stable/httpclient.html

  6. 100 Continue状态码:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/100

  7. HTTP认证: https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication

  8. 证书转换: https://www.alibabacloud.com/help/zh/faq-detail/40526.htm

网易云免费体验馆,0成本体验20+款云产品!

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

相关文章:
【推荐】 分布式存储系统可靠性系列二:系统估算示例
【推荐】 网易云数据库架构设计实践

爬虫开发python工具包介绍 (4)的更多相关文章

  1. 爬虫开发python工具包介绍 (1)

    本文来自网易云社区 作者:王涛 本文大纲: 简易介绍今天要讲解的两个爬虫开发的python库 详细介绍 requests库及函数中的各个参数 详细介绍 tornado 中的httpcilent的应用 ...

  2. 爬虫开发python工具包介绍 (2)

    本文来自网易云社区 作者:王涛 可选参数我们一一介绍一下: 参数 释义 示例 params 生成url中?号后面的查询Key=value 示例1: >>>payload = {'ke ...

  3. 爬虫开发python工具包介绍 (3)

    本文来自网易云社区 作者:王涛         :arg str url: URL to fetch         :arg str method: HTTP method, e.g. " ...

  4. Python爬虫开发与项目实战

    Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...

  5. Python 3网络爬虫开发实战》中文PDF+源代码+书籍软件包

    Python 3网络爬虫开发实战>中文PDF+源代码+书籍软件包 下载:正在上传请稍后... 本书书籍软件包为本人原创,在这个时间就是金钱的时代,有些软件下起来是很麻烦的,真的可以为你们节省很多 ...

  6. Python 3网络爬虫开发实战中文 书籍软件包(原创)

    Python 3网络爬虫开发实战中文 书籍软件包(原创) 本书书籍软件包为本人原创,想学爬虫的朋友你们的福利来了.软件包包含了该书籍所需的所有软件. 因为软件导致这个文件比较大,所以百度网盘没有加速的 ...

  7. Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包(免费赠送)+崔庆才

    Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包+崔庆才 下载: 链接:https://pan.baidu.com/s/1H-VrvrT7wE9-CW2Dy2p0qA 提取码:35go ...

  8. 《Python 3网络爬虫开发实战中文》超清PDF+源代码+书籍软件包

    <Python 3网络爬虫开发实战中文>PDF+源代码+书籍软件包 下载: 链接:https://pan.baidu.com/s/18yqCr7i9x_vTazuMPzL23Q 提取码:i ...

  9. Python 3网络爬虫开发实战书籍

    Python 3网络爬虫开发实战书籍,教你学会如何用Python 3开发爬虫   本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.reques ...

随机推荐

  1. RESTful架构搜集

    今天才知道RESTful这个词,感觉好落后呀.自从5月份后很少学习新知识,这是个不好的信号. RESTful是Representational State Transfer的缩写.怎么理解Repres ...

  2. python_15(jquery)

    第1章 iquery 1.1 官网 1.2 流程图 1.3 Javascripts方法 1.4 书写格式 1.5 jQuery 的两大特 1.6 对比javascript代码量 第2章 入口函数(重要 ...

  3. 如何查看和分析IIS日志

    日志的在IIS中是很重要的,但是很多人却忽略了,在这里说说,日志格式建议使用W3C扩充日志文件格式,这也是IIS 5.0默认的格式,可以指定每天记录客户IP地址.用户名.服务器端口.方法.URI资源. ...

  4. P1202 [USACO1.1]黑色星期五Friday the Thirteenth

    题目描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N- ...

  5. HDU4035 Maze(期望DP)

    题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 有n个房间,由n-1条隧道连通起来,形成一棵树,从结点1出发,开始走,在每个结点i ...

  6. Selenium私房菜系列5 -- 第一个Selenium RC测试案例

    <Selenium简介>中讲过,Selenium RC支持多种语言编写测试案例,如:C#,Python.在工作中,我倾向于是用Python这类动态语言编写测试案例,因为这样的测试案例无需编 ...

  7. MySQL主服务配置文件

    [mysql]port=3306socket=/var/lib/mysql/mysql.sockdefault-character-set = utf8mb4 [mysqld]server-id = ...

  8. 霍金的新语音系统 ACAT 将开源

    英国理论物理学家斯蒂芬·霍金(Stephen Hawking)使用了二十年的语音通讯系统被英特尔开发的新一代通讯平台替代,显著改进了通讯效率.但霍金的声音并没有发生改变,他仍然使用相同的语音合成器.霍 ...

  9. UVA 11374 Airport Express (最短路)

    题目只有一条路径会发生改变. 常见的思路,预处理出S和T的两个单源最短路,然后枚举商业线,商业线两端一定是选择到s和t的最短路. 路径输出可以在求最短路的同时保存pa数组得到一棵最短路树,也可以用di ...

  10. UVA - 12264 Risk (二分,网络流)

    题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了... 最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行. 这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的 ...