python3爬虫POST传递参数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3爬虫POST传递参数问题相关的知识,希望对你有一定的参考价值。

Traceback (most recent call last):
File "/home/qians2014/文档/_proj_/spider.py", line 11, in <module>
response = urllib.request.urlopen(req)
File "/usr/lib/python3.3/urllib/request.py", line 160, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.3/urllib/request.py", line 471, in open
req = meth(req)
File "/usr/lib/python3.3/urllib/request.py", line 1183, in do_request_
raise TypeError(msg)
TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.
这个是run以后的问题。求解。下面贴上我的代码。用的python3.3 urllib写的。

import urllib.request
import urllib.parse

url = "http://xscj.hit.edu.cn/hitjwgl/xs/jscx_all.asp"
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (Khtml, like Gecko) Ubuntu Chromium/30.0.1599.114 Chrome/30.0.1599.114 Safari/537.36'
values = 'Submit':'%C8%AB%B2%BF%E4%AF%C0%C0','ZC':'11','XQ':'%D2%BB%D0%A3%C7%F8'
headers = 'User-Agent':user_agent

data = urllib.parse.urlencode(values)
req = urllib.request.Request(url,data,headers)
response = urllib.request.urlopen(req)
the_page = response.read()

print(the_page.decode("utf8"))

参考技术A data = urllib.parse.urlencode(values).encode(encoding='UTF8')
试下。本回答被提问者采纳

Python爬虫知识点——请求

请求

:请求方法、请求网址、请求头、请求体

请求方法:

常见的为:GET、POST

GET与POST主要区别:

  • GET请求参数包含在URL,可从URL中看出。POST请求的URL不包含参数,都是通过表单的形式传输的,包含在请求体中
  • GET请求提交的数据最多只有1024字节,POST无限制

其他还有HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE

请求的网址:

即URL,我们想要请求的资源

请求头:

用来说明服务器要使用的附加信息,比较总要的有Cookie、Referer、User-Agent等。

Accept:请求报头域,用于指定客户端可接受哪些类型的信息。

Accept-Language:指定客户端可接受的语言类型。

Accept-Encoding:指定客户端可接受的内容编码。

 Host:用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关的位   置。从HTTP1.1版本开始,请求必须包含此内容。

Cookie:也常用复数形式Cookies, 是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。例如,我们输人用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是Cookies的功劳。Cookies里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上Cookies 并将其发送给服务器,服务器通过Cookies识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登录之后才能看到的网页内容。

Referer:此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等。

User-Agent: 简称UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等消息。在做爬虫时加上此信息,可以伪装成浏览器;如果不加,很可能被识别出为爬虫

Content-Type:也叫互联网媒体类型( Intermet Media Type)或者MIME类型,在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。更多对应关系可以查看此对表:http://tool.oschina.net/commons

文件扩展名 Content-Type(Mime-Type)
.html、 .htx 、 .htm text/html
.gif image/gif
.json application/json

? Content-Type与POST提交数据方式的关系

Content-Type 提交数据的方式
appication/x-www-urlencodeed 表单数据
multipart/form-data 表单文件上传
applicatiobn/json 序列化json数据
text/html XML数据

如果构造POST请求,需要使用正确的Content-Type,不然可能导致POST提交后无法正常响应

==>因此,请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头。

请求体:

请求体一般承载的内容是POST请求中的表单数据,而对GET请求,请求体则为空。

文章摘自崔庆才的《Python3网络爬虫开发实战》

以上是关于python3爬虫POST传递参数问题的主要内容,如果未能解决你的问题,请参考以下文章

Python-爬虫-requests库用语post登录

python2与python3爬虫get与post对比

Python3爬虫反反爬之搞定同程旅游加密参数 antitoken

python3爬虫学习urllib模块的使用

爬虫基础:urllib库

Python3爬虫有道翻译