python爬虫(二)

python爬虫之urllib

在python2和python3中的差异

在python2中,urllib和urllib2各有各个的功能,虽然urllib2是urllib的升级版,但是urllib2还是不能完全替代urllib,但是在python3中,全部封装成一个类urllib。

Urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接受一个URL。这就意味着你不能通过urllib伪装自己的请求头。
Urllib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具备这样的功能,而且urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是urllib和urllib2一起使用的原因。。quote用来url转码的。

Request
import urllib.request
urllib.request.Request(url, data=None, headers = {}, method= None)

headers = {
      ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ‘
                    ‘Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3‘,
      ‘Referer‘: ‘http://www.lagou.com/zhaopin/Python/?labelWords=label‘,
      ‘Connection‘: ‘keep-alive‘
 }

http的头信息可以直接使用字典的形式。

urllib发送数据

Request如果要发送data,并无法直接传入字典类型的参数,需要进行数据转换,你可以直接使用类似于get传出参数的方法,也可以使用urllib给我们提供的类。

from urllib import request, parse
data = {
    ‘first‘: ‘true‘,
    ‘pn‘: 1,
    ‘kd‘: ‘Python‘
}
data = parse.urlencode(data).encode(‘utf-8‘)
print(data)
结果:
b‘first=true&pn=1&kd=Python‘

urlencode()主要作用就是将url附上要提交的数据。
Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码。

urllib.parse.urlencode(query, doseq=False, safe=‘‘, encoding=None, errors=None)

urlopen

没法伪装我们的头信息
urllib.request.urlopen(url, data=None, timeout=None)

url       需要打开的网站
data      psot提交的数据
Timeout   网站访问的超时时间

Request

可以伪装头信息
from urllib import request
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read()

urllib的下载

from urllib import request

url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
request.urlretrieve(url, "1.jpg")

或者通过以下方式

from urllib import request

url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
req = request.Request(url)
res = request.urlopen(req)
text = res.read()
with open("2.jpg", "wb") as f:
    f.write(text)

urllib的代理

from urllib import request, parse

data = {
        ‘first‘: ‘true‘,
        ‘pn‘: 1,
        ‘kd‘: ‘Python‘
    }
url = ‘http://2018.ip138.com/ic.asp‘

proxy = request.ProxyHandler({‘http‘: ‘113.95.51.146:8118‘})  # 设置proxy
opener = request.build_opener(proxy)  # 挂载opener
# opener = request.build_opener()  # 挂载opener
request.install_opener(opener)  # 安装opener
data = parse.urlencode(data).encode(‘utf-8‘)
page = opener.open(url, data).read()
print(type(page))
print(page.decode("gbk"))

结果:<body style="margin:0px"><center>您的IP是:[113.95.51.146] 来自:湖北省武汉市 联通</center></body></html>

urllib的cookie使用

如果已经知道cookie,或者说你是通过抓包获取到的cookie,直接放在header的信息中直接登陆就可以;
登陆京东网站的cookie信息和不登录京东的cookie信息是不一样的。
你可以登录京东以后,抓取cookie的信息,然后访问任何网站就可以了。

import urllib.request
url = “http://www.jd.com"
header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
          "cookie": "xxxxx"}
req = urllib.request.Request(url=url, headers=header)
res = urllib.request.urlopen(req)
text = res.read()

urllib的cookie相关的类

在python2中cookie的类叫做:import cookielib
在python3中cookie的类叫做:import http.cookiejar

opener的概念

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。
urlopen是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。

终端输出cookie对象

import urllib.request
import http.cookiejar

url = "http://www.hao123.com"
req = urllib.request.Request(url)
cookiejar = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)
<CookieJar[<Cookie BAIDUID=93B415355E0704B2BC94B5D514468898:FG=1 for .hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>

Cookie保存到文件中

import urllib.request
import http.cookiejar

url = "http://www.hao123.com"
req = urllib.request.Request(url)

cookieFileName = "cookie.txt"
cookiejar = http.cookiejar.MozillaCookieJar(cookieFileName)#文件cookie
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)
cookiejar.save() # 保存在了文件cookie.txt中

MozillaCookieJar继承FileCookieJar()继承CookieJar

Cookie从文件中读取cookie信息并访问

import urllib.request
import http.cookiejar
cookie_filename = ‘cookie.txt‘
cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
print(cookie)
url = "http://www.hao123.com"
req = urllib.request.Request(url)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)  # 利用urllib2的build_opener方法创建一个opener
response = opener.open(req)

print(response.read().decode(“utf-8”))#解决乱码的问题

原文地址:https://www.cnblogs.com/yangjian319/p/9188296.html

时间: 2024-11-09 00:51:11

python爬虫(二)的相关文章

Python 爬虫二

requests模块 beautifulsoup模块 Request模块 get方法请求 整体演示一下: import requests response = requests.get("https://www.baidu.com") print(type(response)) print(response.status_code) print(type(response.text)) print(response.text) print(response.cookies) print

python爬虫(二)--了解deque

队列-deque有了上面一节的基础,当然你需要完全掌握上一节的所有方法,因为上一节的方法,在下面的教程中会反复的用到.如果你没有记住,请你返回上一节.这一节我们要了解一种队列--deque.在下面的爬虫基础中,我们也要反复的使用deque,来完成网址的出队入队. 有了对deque基本的认识,我们开始进一步的学习了解他. colloections.deque([iterable[,maxlen]])从左到右初始化一个新的deque对象,如果iterable没有给出,那么产生一个空的deque.de

Python爬虫(二)_urllib2的使用

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2是Python2.x自带的模块(不需要下载,导入即可使用) urllib2官网文档:https://docs.python.org/2/library/urllib2.html urllib2源码 urllib2在python3.x中被改为urllib.request urlopen 我们先来段代码: #-*- coding:utf-8

python爬虫二、Urllib库的基本使用

什么是Urllib Urllib是python内置的HTTP请求库 包括以下模块 urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 urllib.robotparser robots.txt解析模块 urlopen 关于urllib.request.urlopen参数的介绍: urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=No

Python爬虫(二十三)_selenium案例:动态模拟页面点击

本篇主要介绍使用selenium模拟点击下一页,更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import time class douyuSelenium(unittest.TestCase): #初始化方法 d

python爬虫(二)_HTTP的请求和响应

HTTP和HTTPS HTTP(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收HTML页面的方法 HTTPS(HyperText Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层. SSL(Secure Socket Layer安全套接层)主要用于web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全. HTTP的端口号为80 HT

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用selenium+phantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time #如果获取页面时获取不到文本内容,加入下面参数 driver = webdriver.PhantomJS(service_args=[

Python爬虫(二十)_动态爬取影评信息

本案例介绍从JavaScript中采集加载的数据.更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import time import json #数据下载器 class HtmlDownloader(object): def download(self, url, params=None): if url is None: return None user_agent = 'Mozilla/5.0 (Wind

Python爬虫(二十四)_selenium案例:执行javascript脚本

本章叫介绍如何使用selenium在浏览器中使用js脚本,更多内容请参考:Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句 from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get('https://www.baidu.com/') #给搜索输入框标

Python爬虫(二)

爬取电影吧一个帖子里的所有楼主发言: # python2 # -*- coding: utf-8 -*- import urllib2 import string import re class Baidu_Spider: feature_pattern = re.compile(r'id="post_content.*?>\s+(.*?)</div>', re.S) replaceList = [(''', '\''), ('"', '\"')] def