Python爬虫第一步
这只是记录一下自己学习爬虫的过程,可能少了些章法。我使用过的是Python3.x版本,IDE为Pycharm。
这里贴出代码集合,这一份代码也是以防自己以后忘记了什么,方便查阅。
import requests
#以不同的请求方式获取response
r = requests.get('https://api.github.com/events')
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get') payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=payload)
#params参数接收一个dict来添加query string
#以None为value的key不会添加到query string里 #pass a list of items as value
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.url)
#Output:http://httpbin.org/get?key1=value1&key2=value2&key2=value3 r.text #The text encoding guessed by Requests
r.encoding #find out what encoding Requests is using
#and you can change it whenever you wanna work out what the encoding of the content will be r.content #to find the encoding
r.encoding #set encoding as you need
r.text #get r.text with correct encoding r.content #accesss the response body as bytes(binary response content)
r.json()
#It should be noted that the success of the call to r.json()
#does not indicate the success of the response.
#To check that a request is successful,
#use r.raise_for_status() or check r.status_code is what you expect. r = requests.get('https://api.github.com/events', stream=True)
#if you'd like to get the raw socket response,make sure you have set
#the parameter stream as True
r.raw #get raw socket response
r.raw.read(10) #to save what is being streamed to a file
with open(filename, 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk) #we didn't specify our user-agent in the previous example
#If you'd like to add HTTP headers to a request,
#simply pass in a dict to the headers parameter
url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers) #Note: All header values must be a string, bytestring, or unicode.
# While permitted, it's advised to avoid passing unicode header values. #you want to send some form-encoded data
payload = {'key1': 'value1', 'key2': 'value2'} #the form
r = requests.post("http://httpbin.org/post", data=payload)
#set data parameter with the a dict you defined
>>>print(r.text)
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
} # the GitHub API v3 accepts JSON-Encoded POST/PATCH data
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload)) #爬取一张照片
from urllib import request
url='http://imgpoobbs.b0.upaiyun.com/uploadfile/photo/2016/8/201608051206091841435218.jpg!photo.middle.jpg'
Request = request.urlopen(url)#发出请求
Response = Request.read()#获取返回结果
f = open('1.png','wb')#创建一个图片文件
f.write(Response)#把Response写入文件f中
f.close()#关闭文件 #urlopen的data参数
import urllib.request
import urllib.parse
data=bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
#bytes()方法转字节流,第一个参数为string,这里用urllib.parse.urlencode()
#把字典转换为string,第二个参数为编码方式
response = urllib.request.urlopen('http://www.python.org',data=data)
#添加附加参数data,传递了data参数则请求方式为POST
#print(type(response))
print(response.read()) #urlopen的timeout参数
import urllib.request
import urllib.error
import socket
try:#(通过try...except..可以使一个页面如果长时间未响应就跳过它的抓取)
response=urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
#设置超时timeout参数,当到达参数时间服务器还未响应,则会抛出URLError
except urllib.error.URLError as e :
if isinstance(e.reason,socket.timeout):
print('TIME OUT') #urllib.request.Request的格式
class urllib.request.Request(url, data=None, headers={}, origin_
req_host=None, unverifiable=False, method=None)
#headers={}参数为请求头,请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,
#默认的 UserAgent 是 Python-urllib ,你可以通过修改它来伪装浏览器,
#比如要伪装火狐浏览器,你可以把它设置为 Mozilla/5.0 (X11; U; Linux i686)
#Gecko/20071127 Firefox/2.0.0.11 #urllib.request.Request的使用
from urllib import request,parse
url='http://httpbin.org/post'
headers={'User-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',
'Host':'httpbin.org'}
dict={'name':'Germey'}
data=bytes(parse.urlencode(dict),encoding='utf8')
req=request.Request(url=url,data=data,headers=headers,method='POST')
#request.Request()可以设置比urlopen多的参数
response=request.urlopen(req)#再通过urlopen()来发送请求,获取响应
print(response.read().decode('utf-8')) #Handler
import urllib.request
auth_handler=urllib.request.HTTPBasicAuthHandler()
#实例化一个HTTPBasicAuthHandler对象
auth_handler.add_password(realm='PDQ Application',
uri='http://mahler:8092/site-updates.py',
user='klem',
passwd='kadidd!ehopper')
#给这个对象添加进去用户名和密码,相当于建立了一个处理认证的处理器
opener=urllib.request.build_opener(auth_handler)
#build_opener方法利用这个处理器构建一个Opener,则这个Opener在发送请求的时候
#就具备认证功能了
urllib.request.install_opener(opener)
#完成认证
urllib.request.urlopen('http://www.example.com/login.html') #添加代理
import urllib.request
proxy_handler = urllib.request.ProxyHandler({
'http':'http://218.202.111.10:80',
'https':'http://180.250.163.34:8888'
})#参数为一个字典,key为协议类型,value是代理链接
opener = urllib.request.build_opener(proxy_handler)
#给这个Handler构建一个Opener
response = opener.open('https://www.baidu.com')
#发送请求
print(response.read()) #1.Handler 2.bulid.opener 3.open #异常处理
#error.URLError
from urllib import request,error
try:
response = request.urlopen('http://cuiqingcai.com/index.htm')
except error.URLError as e:#由request产生的异常都由URLError捕获
print(e.reason)#URLError的reason属性返回错误原因 #error.HTTPError
from urllib import request,error
try:
response = request.urlopen('http://cuiqingcai.com/index.htm')
except error.HTTPError as e:
print(e.reason,e.code,e.headers)#三个属性,code为错误代码,headers为响应头
except error.URLError as e:#URLError为HTTPError的父类,先捕获子类的错误
#如果非HTTPError再捕获父类URLError的错误
print(e.reason)
else:
print('Request Successfully') from urllib import request,error
import socket
try:
response = request.urlopen('http://www.baidu.com',timeout=0.01)
except error.URLError as e:
print(type(e.reason))
if isinstance(e.reason,socket.timeout):
print('TIME OUT')
#Output:<class 'socket.timeout'> # reason不一定都返回字符串,这里e.reason为一个socket.timeout对象,而非一个字符串
# TIME OUT #解析链接
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
#urlparse的API:urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
print(type(result),result)
#Output:<class 'urllib.parse.ParseResult'> #ParseResult为一个元祖
#ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
#标准链接格式scheme://netloc/path;parameters?query#fragment #urlunparse
from urllib.parse import urlunparse
data=['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))#参数为一个有6个参数(即标准链接格式的六部分)的Iterable #urlsplit
from urllib.parse import urlsplit
result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result)
#Output:SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')
#和urlparse一样只不过不返回params,而把它归为path #urlunsplit同urlunparse,只不过它只用传5个参数(无params) #urljoin的拼接
from urllib.parse import urljoin print(urljoin('http://www.baidu.com', 'FAQ.html'))
print(urljoin('http://www.baidu.com', 'https://cuiqingcai.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'http://cuiqingcai.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/'
'FAQ.html?question=2'))
print(urljoin('http://www.baidu.com?wd=abc', 'https://cuiqingcai.com/index.php'))
print(urljoin('http://www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu,com', '?categoty=2#comment'))
print(urljoin('www.baidu.com#comment', '?category=2'))
#给出两个链接,第一个为base_url,它会提供scheme,netloc,path三项内容
#对于第二个链接中没有这三项内容的就用base_url的来补充
#Output:http://www.baidu.com/FAQ.html
#https://cuiqingcai.com/FAQ.html
#http://cuiqingcai.com/FAQ.html
#https://cuiqingcai.com/FAQ.html?question=2
#https://cuiqingcai.com/index.php
#http://www.baidu.com?category=2#comment
#www.baidu,com?categoty=2#comment
#www.baidu.com?category=2 #robots协议
from urllib.robotparser import RobotFileParser
rp=RobotFileParser()#创建类实例
rp.set_url('http://www.jianshu.com/robots.txt')
rp.read()#读取robots.txt文件并进行分析,一定要调用这个方法,否则不读取的!
print(rp.can_fetch('*', 'http://www.jianshu.com/p/b67554025d7d'))#判断是否can_fetch
print(rp.can_fetch('*', 'http://www.jianshu.com/search?q=python&page=1&type=collections'))
最开始自己看HTTP协议的一些基本知识,这里也不叙述了。
学习内容参考Python3WebSpider,网上应该也找得到。
如果有需要联系邮箱dadozsama@163.com。
Python爬虫第一步的更多相关文章
- python爬虫第一天
python爬虫第一天 太久没折腾爬虫 又要重头开始了....感谢虫师大牛的文章. 接下来的是我的随笔 0x01 获取整个页面 我要爬的是百度贴吧的图,当然也是跟着虫师大牛的思路. 代码如下: #co ...
- Python 编程第一步
Python 编程第一步 在前面的教程中我们已经学习了一些 Python3 的基本语法知识,下面我们尝试来写一个斐波纳契数列. # Fibonacci series: 斐波纳契数列 # 两个元素的总 ...
- Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化
拿来主义: python -m cProfile -o profile.pstats to_profile.py gprof2dot -f pstats profile.pstats |dot -Tp ...
- 网络爬虫第一步:通用代码框架(python版)
import requests def getHTMLText(url): try: r=requests.get(url,timeout=30) r.rais ...
- 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- 1.python的第一步
学习python也有一段时间了,自认为基本算是入门了,想要写一些博客进行知识的汇总的时候.却发现不知道该从何说起了,因为python这门语言在语法上其实并不难,关键在于如何建立程序员的思维方式,而对于 ...
- python+selenium第一步 - 环境搭建
刚开始学习一门技术,肯定是要从环境搭建开始的,我也不例外. 首先选择需要安装的版本,我使用的是mac自带的2.7版本. selenium2,和火狐浏览器 为求稳定不会出现未知问题,我选择了seleni ...
- 猿人学python爬虫第一题
打开网站.F12,开启devtools.发现有段代码阻止了我们调试 好的.接下来有几种解决方法 1- 绕过阻止调试方法 方法1(推荐) 鼠标放在debugger该行,左边数字行号那一列.右键选择不在永 ...
- Python爬虫第一个成功版
爬取http://www.mzitu.com/all里面的图片 import urllib.request import re import os url = 'http://www.mzitu.co ...
随机推荐
- Android WebRTC 音视频开发总结
www.cnblogs.com/lingyunhu/p/3621057.html 前面介绍了WebRTCDemo的基本结构,本节主要介绍WebRTC音视频服务端的处理,,转载请说明出处(博客园RTC. ...
- Little shop of flowers - SGU 104 (DP)
题目大意:把 M 朵花插入 N 个花瓶中,每个花插入不同的花瓶都有一个价值A[Mi][Nj],要使所有的花都插入花瓶,求出来最大的总价值(花瓶为空时价值是0). 分析:dp[i][j]表示前i朵花插入 ...
- DES加密后get获取url参数无法解密问题
参考:http://www.cnblogs.com/lori/archive/2011/09/08/2170979.html 问题,就是URL编码问题,如果不对URL进行编码直接加码,那么在解码时,如 ...
- 【设计模式 - 10】之外观模式(Facade)
1 模式简介 外观模式隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.外观模式往往涉及到一个类,这个类提供了客户端请求的简化方法和对现有系统类方法的委托调用.外观模式使得系统中的 ...
- app启动其他应用
因开发需要内包一个app,所以要启动一个app,这种操作 如果知道包名和类名 其实很简单 只需要将包名内嵌即可(一般情况 我们都可以解压或者反接拿到) 代码如下: Intent intent = ne ...
- Node.js小Httpserver
须要说明两点: 1 程序文件hello.js需用记事本另存为utf-8格式的hello.js watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVhcGVk ...
- [Reactive Programming] Using an event stream of double clicks -- buffer()
See a practical example of reactive programming in JavaScript and the DOM. Learn how to detect doubl ...
- [Angular 2] 9. Replace ng-modle with #ref & events
Let's say you want to write a simple data bing app. when you type in a text box, somewhere in the ap ...
- mybatis0204 一对多查询
查询所有订单信息及订单下的订单明细信息. sql语句 主查询表:订单表 关联查询表:订单明细 SELECT orders.*, user.username, user.sex , orderdetai ...
- spring mvc DispatcherServlet详解之二---request通过Controller获取ModelAndView过程
整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet通过request获取控制器Controller的过程,现在来讲解DispatcherServletDisp ...