专栏首页python3Python爬虫-04:贴吧爬虫以及GE

Python爬虫-04:贴吧爬虫以及GE

目录

  • 1. URL的组成
  • 2. 贴吧爬虫
    • 2.1. 只爬贴吧第一页
    • 2.2. 爬取所有贴吧的页面
  • 3. GET和POST的区别
    • 3.1. GET请求
    • 3.2. POST请求
    • 3.3. 有道翻译模拟发送POST请求

1. URL的组成


汉字通过URL encode(UTF-8)编码出来的编码,里面的字符全是打字节

如果你复制粘贴下来这个网址,出来的不是汉字,而是编码后的字节 https://www.baidu.com/s?wd=%E7%BC%96%E7%A8%8B%E5%90%A7

我们也可以在python中做转换-urllib.parse.urlencode

import urllib.parse.urlencode
url = "http://www.baidu.com/s?"
wd = {"wd": "编程吧"}
out = urllib.parse.urlencode(wd)
print(out)

结果是: wd=%E7%BC%96%E7%A8%8B%E5%90%A7

2. 贴吧爬虫

2.1. 只爬贴吧第一页

import urllib.parse
import urllib.request

url = "http://www.baidu.com/s?"
keyword = input("Please input query: ")

wd = {"wd": keyword}
wd = urllib.parse.urlencode(wd)

fullurl = url + "?" + wd
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
request = urllib.request.Request(fullurl, headers = headers)
response = urllib.request.urlopen(request)
html = response.read()

print(html)

2.2. 爬取所有贴吧的页面

对于一个贴吧(编程吧)爬虫,可以翻页,我们可以总结规律

page 1: http://tieba.baidu.com/f?kw=%E7%BC%96%E7%A8%8B&ie=utf-8&pn=0 
page 2: http://tieba.baidu.com/f?kw=%E7%BC%96%E7%A8%8B&ie=utf-8&pn=50
page 3: http://tieba.baidu.com/f?kw=%E7%BC%96%E7%A8%8B&ie=utf-8&pn=100
import urllib.request
import urllib.parse

def loadPage(url,filename):
    """
        作用: url发送请求
        url:地址
        filename: 处理的文件名
    """
    print("正在下载", filename)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
    request = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(request)
    html = response.read()
    return html



def writePage(html,filename):
    """
        作用:将html内容写入到本地
        html:服务器响应文件内容
    """
    print("正在保存",filename)
    with open(filename, "wb") as f:
        f.write(html)
    print("-"*30)


def tiebaSpider(url, beginPage, endPage):
    """
        作用:贴吧爬虫调度器,复制组合处理每个页面的url
    """
    for page in range(beginPage, endPage + 1):
        pn = (page - 1) * 50
        filename = "第" + str(page) + "页.html"
        fullurl = url + "&pn=" + str(pn)
        html = loadPage(fullurl,filename)
        writePage(html,filename)


if __name__ == "__main__":
    kw = input("Please input query: ")
    beginPage = int(input("Start page: "))
    endPage = int(input("End page: "))

    url = "http://tieba.baidu.com/f?"
    key = urllib.parse.urlencode({"kw":kw})
    fullurl = url + key
    tiebaSpider(fullurl, beginPage, endPage)

结果是:

Please input query: 编程吧
Start page: 1
End page: 5
正在下载 第1页.html
正在保存 第1页.html
------------------------------
正在下载 第2页.html
正在保存 第2页.html
------------------------------
正在下载 第3页.html
正在保存 第3页.html
------------------------------
正在下载 第4页.html
正在保存 第4页.html
------------------------------
正在下载 第5页.html
正在保存 第5页.html
------------------------------

3. GET和POST的区别


  • GET: 请求的url会附带查询参数
  • POST: 请求的url不会

3.1. GET请求

对于GET请求:查询参数在QueryString里保存

3.2. POST请求

对于POST请求: 茶韵参数在WebForm里面

3.3. 有道翻译模拟发送POST请求

  1. 首先我们用抓包工具获取请求信息
POST http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null HTTP/1.1
Host: fanyi.youdao.com
Connection: keep-alive
Content-Length: 254
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://fanyi.youdao.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://fanyi.youdao.com/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,en-CA;q=0.6
Cookie: OUTFOX_SEARCH_USER_ID=-1071824454@10.169.0.83; OUTFOX_SEARCH_USER_ID_NCOO=848207426.083082; JSESSIONID=aaaiYkBB5LZ2t6rO6rCGw; ___rl__test__cookies=1546662813170
x-hd-token: rent-your-own-vps
# 这一行是form表单数据,重要
i=love&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=15466628131726&sign=63253c84e50c70b0125b869fd5e2936d&ts=1546662813172&bv=363eb5a1de8cfbadd0cd78bd6bd43bee&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTIME&typoResult=false
  1. 提取关键的表单数据
i=love
doctype=json
version=2.1
keyfrom=fanyi.web
action=FY_BY_REALTIME
typoResult=false  
  1. 有道翻译模拟
import urllib.request
import urllib.parse

# 通过抓包方式获取,并不是浏览器上面的URL地址
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

# 完整的headers
headers = {
    "Accept" : "application/json, text/javascript, */*; q=0.01",
    "X-Requested-With" : "XMLHttpRequest",
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
    "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8"
}

# 输入用户接口
key = input("Please input english: ")

# 模拟有道翻译传回的form数据
# 这是post发送到服务器的form数据,post是有数据提交到web服务器的,与服务器做一个交互,通过传的数据返回响应的文件,而get不会发数据
formdata = {
    "i":key,
    "doctype":"json",
    "version":"2.1",
    "keyfrom":"fanyi.web",
    "action":"FY_BY_REALTIME",
    "typoResult": "false"
}

# 通过转码
data = urllib.parse.urlencode(formdata).encode("utf-8")
# 通过data和header数据,就可以构建post请求,data参数有值,就是POST,没有就是GET
request = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
html = response.read()

print(html)

结果如下:

Please input english: hello
b'                          {"type":"EN2ZH_CN","errorCode":0,"elapsedTime":1,"translateResult":[[{"src":"hello","tgt":"\xe4\xbd\xa0\xe5\xa5\xbd"}]]}\n'

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 53. Python 爬虫(2)

        Name   value   domain   path  expires

    py3study
  • python中的urllib模块中的方法

    urllib.request模块定义了一些打开URLs(一般是HTTP协议)复杂操作像是basic 和摘要模式认证,重定向,cookies等的方法和类。这个模块...

    py3study
  • python爬虫常用模块

    涉及到网络这块,必不可少的模式就是urllib.request了,顾名思义这个模块主要负责打开URL和HTTP协议之类的

    py3study
  • Python的urllib库

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    于小勇
  • 爬虫篇| 爬虫中的urllib库使用(三)

    我们首先了解一下 Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块:

    润森
  • VS Code 正在统治代码编辑器领地!

    Microsoft Visual Studio编辑器的使用率正在快速上升!我们在访谈期间发现VS Code是现在大多数工程师选择的代码编辑器,它似乎正迅速抢占其...

    AI科技大本营
  • Android Q 分区储存: 最佳实践和几项更新

    应用沙盒是 Android 设计的核心部分,它可将不同的应用隔离。基于应用沙盒的基本原则,Android Q 引入了分区储存特性。

    Android 开发者
  • 新增应用商店、支持GPU,KubeOperator V2.3发布

    1月19日,开源容器集群管理平台KubeOperator发布V2.3版本。KubeOperatorV2.3版本新增了Kubeapps的定制版本——Kubeapp...

    用户6967211
  • python调试代码举例

    Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的。

    py3study
  • Flask(三)之请求上下文源码分析

    run_simple是werkzeug内部的方法,在run_simple执行时会将app加括号调用从而执行app的__call__方法,来看__call__源码...

    GH

扫码关注云+社区

领取腾讯云代金券