python爬虫学习笔记(1)

环境配置

本人使用了anaconda3中的python3环境,进行爬虫的环境为anaconda中的spyder,使用anaconda具体详细原因及安装教程可见
Anaconda3详细安装使用教程及问题总结

urllib简单使用

1.request模块

request就是请求的意思,主要用于url信息的请求

urlopen()

urllib.request.urlopen(“网址”)
实现向该网站发起访问请求,并获取响应结果。

import urllib.request
#首先需要引用这个模块
response = urllib.request.urlopen("http://www.baidu.com/")
#同构该模块的urlopen函数打开“网址”,将响应结果返回至response中,此时返回的是字节流
result = response.read().decode("utf-8")
#通过将response的内容读出,并作utf-8的解码,将该字节流转化为字符流
#初步认为utf-8是大多数网页的编码方式
printf(result)

urlopen()详细介绍可见python中urlopen()介绍
urlopen()方式所请求的网址访问不能设置用户代理,不支持重构User-Agent,初步认为代理是用于模仿浏览器访问网页所设置的,这个可以看作是爬虫与反爬虫作斗争的第一步。
关于网页的编码方式想了解更多可以参考网页编码方式

Request()

这个函数看着很奇怪,因为他就是之前urllib中request模块中首字母r进行大写后的名称。
通过Request()方式请求访问网址可用进行重构User-Agent,操作为

import urllib.request

url = "http://www.baidu.com/"
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"}
#以上所初始化的是url,以及headers,url就是访问的网址,headers就是所设置的浏览器参数,通过这个参数进行模仿。
#初步认为这url和headers加在一起可以作为User-Agent
req = urllib.request.Request(url,headers=headers)
#将之前构造的User-Agent放入Requst函数中作为参数,得到了这个访问请求的新的对象
res = urllib.request.urlopen(req)
# urlopen请求访问该网址,并附加了headers
html = res.read().decode("utf-8")
#print(html)

print(res.getcode())
#getcode就是获取此次爬取网页的http响应码,有很多的值,主要200是响应成功的。
print(res.geturl())
#返回此次爬取网页的网址

通过上面的直接使用urlopen()以及先用Request()构造新的User-Agent在使用urlopen()打开,可以看出来,url本身就可以作为urlopen的参数,也可以通过Request给url加了个headers后,再作为urlopen的参数。
更多的浏览器请求头可以参考浏览器User-Agent汇总

2.parse模块

parse的意思是解析,这个模块主要就是用于encode转码操作。

urlencode()

按我的理解,urlencode()是的作用说白了就是将{key:value}构造成的key=encode(value)字符串格式,用于url的构造。举例,

import urllib.request
import urllib.parse

baseurl = "http://www.baidu.com/s?"
#url前半部分
key = input("请输入要搜索的内容:")
key = urllib.parse.urlencode({"wd":key})
#url后半部分
#urlencode将{"wd":key}编码而成为"wd=%e8%a3%e6..."的形式
#而这个wd表示的是百度搜索所要的关键字word,后面的%e8...应该就是搜索的关键字转换成了另一种百度的关键字格式。
url = baseurl + key
#url拼接

headers = {"User-Agent":"Mozilla/5.0"}
req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8")
#这里就是熟悉的操作

with open("百度.html","w",encoding="utf-8") as f:
    f.write(html)
#这个语句是将所搜索的内容html保存到一个文件中,上面的open使用中参数分别是文件名,w表示写,编码方式。
#这里的编码方式需要注意,如果所写的方式不是访问页面的编码方式,当打开这个html文件的时候就会出现乱码

可见我们再爬取网页时首先就要对网页的url有充分的了解,关于百度网址的参数解析可以参考百度搜索网址参数解析

很奇怪的是,parse中虽然提供了{key:value}的urlencode方式,却没有对应的urldecode方式。下面介绍另一种编码方式。

quote()

quote简单粗暴,它就是直接将value的值进行编码,转换为%e8…。
在拼接url的时候就可以直接

baseurl = "http://www.baidu.com/s?wd="
key = input("请输入要搜索的内容:")
key = urllib.parse.quote(key)
# 将key直接编码为"%e8%a3%e6..."
url = baseurl + key

quote就有对应的反quote的函数,unquote,顾名思义,就是进行解码。

遇到了问题

html打开出现乱码

在学习过程中,对代码还不是很理解,导致将他人代码敲入后,爬取了信息把并存入了一个html文件,结果打开出现乱码。
已解决
html文件打开出现乱码,但将其转换为txt格式打开确实有正常代码的,查明原因后知道了是由于编码解码方式等原因而导致的。
一开始我是直接将文件另存时,设置其编码方式,在新建文件打开时正常显示。后发现了原因,是在从网页爬取信息下来的时候解码方式是utf-8,然而在保存至html文件中时选择的是gb18030的方式,将其修改为utf-8后正常显示。但所参考的代码的作者意图就不得而知了。

进行百度搜索时,出现安全验证网页无法打开情况

<title>百度安全验证</title>
<div class=“timeout-title”>网络不给力,请稍后重试
(大部分省略)

查明原因可能时代理方面的问题,被服务器拒绝加入了,具体如何操作较为复杂,毕竟我是初学者,看也看不懂。

未解决

此次学习主要参考于Spider(二) ——正则

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值