【1】基于python的网路爬虫笔记

1.urllib包

Urllib是一个收集多个模块以使用URL的包,有一下模块:

  • urllib.request 用于打开和读取URL
  • urllib.error 包含urllib.request引发的异常
  • urllib.parse 用于分析URL
  • urllib.robotparser 用于分析robots.txt文件

本章介绍urllib.request中简单方法


1.1urllib.request模块

urllib.request模块定义函数和类,这些函数和类有助于在复杂的环境中打开URL(主要是HTTP)——基本和摘要式身份验证、重定向、cookie等等。urllib.request模块定义了如下常用方法:

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)(请求一个url)

  1. URL应该是包含有效URL的字符串。
  2. data默认值为None。data必须是一个指定要发送到服务器的附加数据的对象,如果不需要这些数据,则为“None”。目前,HTTP请求是唯一使用data的请求。支持的对象类型包括字节、类似文件的对象和iterables。对于http,post请求需要将data进行编码,可以使用urllib.parse.urlencode()函数进行编码
  3. headers用于设置user-agent,有些网站不允许爬虫,此时使用headers自行设置user-agent欺骗浏览器,headers应该设置为一个字典,
  4. origin_re_host 指请求方的host名称或ip地址
  5. unverifiable,用户没有足够的权限来选择接收的结果,例如,如果请求是针对HTML文档中的图像,并且用户没有批准自动提取图像的选项,那么这个unverifiable就应该设置为true
  6. method是一个字符串,指示将使用的HTTP请求方法,如GET POST PUT 等等

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)(打开URL)

  1. URL应该是包含有效URL的字符串。
  2. data默认值为None。data必须是一个指定要发送到服务器的附加数据的对象,如果不需要这些数据,则为“None”。目前,HTTP请求是唯一使用data的请求。支持的对象类型包括字节、类似文件的对象和iterables。对于http,post请求需要将data进行编码,可以使用urllib.parse.urlencode()函数进行编码
  3. 可选参数,设置最大连接超时时间,如果为设置则使用全局默认,这实际上只适用于HTTP、HTTPS和FTP连接
  4. 可选的cafile和capath参数为https请求指定一组受信任的CA证书
  5. cadefault通常是可忽略的
  6. context上下文,如果指定了,则它是描述各种SSL选项的

示例1:打开B站(未使用data,有时不人为的修改headers是无法访问的,以为某些网站为了防止爬虫,会查看user-agent是否为浏览器,是否为人类在使用)

import urllib.request

head={}

head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
#把head设置为字典

URL='https://www.bilibili.com/'

#访问B站,B站使用utf-8编码的

req=urllib.request.Request(URL,None,head)

#请求连接,Request的第二个参数为data,第三个参数才为headers
#返回的是一个urllib.request.Request对象给req

response=urllib.request.urlopen(req)

#使用这个req对象打开url

html=response.read().decode('utf-8')

#打开网站后获得响应,读取页面内容,使用utf-8解码

print(html)

 

结果


示例2使用有道翻译

在使用有道翻译时,按F12打开审查元素在network一栏可以看到如下,data里提交的数据在formdata里

因此代码如下:

import urllib.request
import urllib.parse
import json

data={}  #添加data内容,根据form data 填充
head={}  #修改header
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data['from']='AUTO'
data['to']=' AUTO'
data['smartresult']= 'dict'
data['client'] ='fanyideskweb'
data['salt']= '15482326606477'
data['sign']= '76b7a1ddc911e391cce840322f68c908'
data['ts']= '1548232660647'
data['bv']= '97ba7c7fb78632ae9b11dcf6be726aee'
data['doctype']= 'json'
data['version']= '2.1'
data['keyfrom']= 'fanyi.web'
data['action']= 'FY_BY_CLICKBUTTION'
data['typoResult']=' false'
while True:  #为了可以多次使用
 
   
    print('\n')
    a=input()
    if a=='q':
        break

    data['i']=a

    data=urllib.parse.urlencode(data).encode('utf-8')
    #注意data一定要用该函数进行编码,否则会出错
    req=urllib.request.Request(url,data,head)
    #请求URL
    response=urllib.request.urlopen(req)
    #打开URL
    html=response.read().decode('utf-8')
    traget=json.loads(html)
    traget=traget['translateResult'][0][0]['tgt']
    #这里利用json优化了一下显示
    print('\n')
    print(traget)

注:data如果没进行编码会报如下错误,上面已经说了编码用的函数

结果


 

下一章将会讲当服务器在短时间内收到同一个IP大量访问而被拒绝时,如何通过代理使用不同的ip进行访问。

本章最重要记得

urllib.request.Request

urllib.request.urlopen

有不明白的地方,或者想交流的朋友,欢迎添加QQ:498721954

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值