day2、异常处理-写入本地json数据-微博登陆-代理服务器使用-xpath语法使用-糗事百科扒取图片-正则使用

1.异常处理

import urllib.request
import urllib.error

url = "http://www.mobiletrain.org/afd?pinzhuanbdtg=biaoti"

req = urllib.request.Request(url=url)


# res = urllib.request.urlopen(req)
try:
    res = urllib.request.urlopen(req)
    print("0")
except urllib.error.HTTPError as e:
    # 如果是http请求的时候或者响应的时候发生错误,就会检测到HTTPError这个异常
    print("1")
    print(e)

except urllib.error.URLError as e:
    # 网址本身存在错误,这个域名不存在
    print("2")
    print(e)
except Exception as e:
    print(e)

2.微博登陆带cookie,写入html

import urllib.request
url = "https://weibo.cn/6370062528/info"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
    "Cookie": "SCF=Ahz9Jk7TyV7zzLvwoCxFjRRTbASUHA9Jp8RcRyRaht68K11D0lYQBg5j9No1B157Zgv7Lx5COUC7DNdjo8APyKc.; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W59rVpGeZ7yg7I7HR0hyYPg5JpX5KzhUgL.Foq0S057Sozfeon2dJLoI05LxKML1heLB-BLxKqL1heL1h-LxKML1-2L1hBLxKqLBoeLBKzLxKqLBoeLBKz41K.t; SUB=_2A253_53KDeRhGeBN7FIR9izJyTSIHXVVAyOCrDV6PUJbkdANLW75kW1NRFYvPyNwa0XZ3DB_CJthDJ6-896SR-uQ; SUHB=0FQbkbkZxmWpX1; _T_WM=ae4d1af9302c562727db8db7ad8ef936"
}
# http协议是一个无状态的协议,不记录当前的会话的状态,在某些情况下,我们需要记录状态(比如在访问某些用户登录以后的页面中),这个时候就要借助于cookie或者Session来保存用户的信息

#创建请求对象
req = urllib.request.Request(url=url,headers=headers)
#解析网址
res = urllib.request.urlopen(req)
#写入weibo.html文件
with open("weibo.html","wb") as fp:
    fp.write(res.read())

3.handler保存会话信息的时候,采用的opener+handler的请求机制

import urllib.request

# Request对象无法保存会话信息,我们需要有另外的一个对象handler,用来保存
# 在handler保存会话信息的时候,采用的opener+handler的请求机制

# 1、创建一个handler对象
handler = urllib.request.HTTPHandler() # 用于保存会话信息
# 2、创建一个opener对象
opener = urllib.request.build_opener(handler) # 用于请求网络
# opener携带了handler,在用其发起http请求的时候就会携带存储在handler中的会话信息

# 构建请求
url = "http://www.baidu.com/"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
}
req = urllib.request.Request(headers=headers,url=url)

# urllib.request.urlopen(req) # 这个请求无法携带会话信息
# 用opener发出请求,携带会话信息
res = opener.open(req) # 此时在发起请求的时候,就会携带上"http://www.baidu.com"这个网址的cookie

print(res)

4.完整微博登陆

import urllib.request
import urllib.parse

# 处理cookie我们还需要导入cookiejar库
import http.cookiejar

# 登录过程
# 1、创建一个cookiejar对象,用于保存cookie
cookie = http.cookiejar.CookieJar()
# 2、创建一个handker对象,并且让这个handler对象携带上cookie
handler = urllib.request.HTTPCookieProcessor(cookie) # 这个对象是HTTPHandler的子对象
# 3、创建一个opener对象,并且让他携带上handler
opener = urllib.request.build_opener(handler)
# 此时opener所携带的handler对象就有cookie对象的存储,用它发请求就可以存储cookie

# 登录的url
url = "https://passport.weibo.cn/sso/login"
# 请求头
headers_login = {
    'Accept': '*/*',
    # Accept-Encoding: gzip, deflate, br
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    # Content-Length: 162
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'passport.weibo.cn',
    'Origin': 'https://passport.weibo.cn',
    # 'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt=',
    'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F%3Fluicode%3D20000174&backTitle=%CE%A2%B2%A9&vt=',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
# 请求体
form_data = {
    'username': '18610593606',
    'password': 'f12345678',
    'savestate': '1',
    'r': 'https://weibo.cn/',
    'ec': '0',
    'pagerefer':'',
    'entry': 'mweibo',
    'wentry':'',
    'loginfrom':'',
    'client_id': '',
    'code':'',
    'qq':'',
    'mainpageflag': '1',
    'hff':'',
    'hfp':''
}
# 将请求体处理成url参数的形式
data = urllib.parse.urlencode(form_data).encode("utf-8")
# print(data)
# 发起一个post请求
req = urllib.request.Request(url=url,headers=headers_login,data=data)
# 登录
# urllib.request.urlopen() # 这个方无法携带cookie
res = opener.open(req)
print(res.read().decode("utf-8"))

# 获取个人资料
info_url = "https://weibo.cn/6370062528/info"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
req = urllib.request.Request(url=info_url,headers=headers)
res = opener.open(req) # 此时如果登录成功,opener就携带当前用户对应的cookie信息,就可以获取当前用户的主要
print(res.read().decode("gb2312"))

5.使用代理服务器代替我们当前客户端去发起请求

import urllib.request

url = "https://www.baidu.com/s?wd=ip"

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
}

# 由于某些网站的反爬机制会通过检测ip地址的访问频率,进而决定是否是爬虫,然后进行封锁
# 通过设置代理服务器,然代理服务器代替我们当前客户端去发起请求,并且将请求结果反馈回来
# 创建一个请求对象
req = urllib.request.Request(url=url,headers=headers)
# 配置代理
handler = urllib.request.ProxyHandler({"http":"114.113.126.86:80"})
# 通过一个handler对象,携带代理服务器的ip地址和端口号
# 创建一个opener携带handler
opener = urllib.request.build_opener(handler)
# 发出请求
res = opener.open(req)
with open("ip.html","wb") as fp:
    fp.write(res.read())

# 在实际的项目中代理服务器需要购买

6.正则小使用

import re
# 导入正则支持模块

string = "<div><title>按时发大水</title><div>asdfdsafsadasfds</div></div>"

pat = r'<div>.*'

s = re.findall(pat,string)
print(s)

7.糗事百科爬取图片到本地

import urllib.request
import re

# 定义一个函数,用于处理url
def handler_url(url,page):
    # 把url和page拼接起来
    page_url = url + str(page)
    # 请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }
    # 创建请求对象
    req = urllib.request.Request(url=page_url,headers=headers)
    return req

# 定义一个函数,处理每一个请求对象,发起请求
def request_qiubai(req):
    res = urllib.request.urlopen(req)
    html = res.read().decode("utf-8")
    # print(html)
    return html

# 数据解析,对网页数据进行解析
def anlysis_qiubai(html):
    # 用正则表达式来匹配图片的url
    pat = re.compile(r'<div class="thumb">.*?<img src="(.*?)" alt=.*?>.*?</div>',re.S)
    # 正则匹配时,需要加上单行的模式修正
    res = pat.findall(html)
    # res中存储的是图片的url,对url进行处理
    imgs = []
    for url in res:
        img_url = "http:" + url
        imgs.append(img_url)
    print(imgs)
    return imgs

# 下载图片
def download_imgs(img_url,name):

    urllib.request.urlretrieve(img_url,"./images/"+name + '.jpg')


# 业务逻辑
def main():
    url = "https://www.qiushibaike.com/pic/page/"
    # 输入要获取的页码
    start_page = input("请输入起始页:")
    end_page = input("请输入终止页:")
    print("开始下载...")
    # 从起始页到终止页循环遍历
    img_name = 0
    for i in range(int(start_page),int(end_page)+1):
        # 创建每一个页面的请求对象
        page_req = handler_url(url,i)
        # 发起请求
        qiu_html = request_qiubai(page_req)
        # 解析网页
        res = anlysis_qiubai(qiu_html)
        # 下载图片
        for img in res:
            print("当前正在下载:"+img)
            download_imgs(img,str(img_name))
            img_name += 1

    print("下载完毕!")

if __name__ == '__main__':
    main()

8.xpath语法使用

# xpath是一种在xml文件中根据其文档结构来提取目标元素的语法
# html就是一种特殊的xml文件
from lxml import etree
# lxml这个库用于解析和提取xml文件中的内容,etree就是把xml(html)里面内容用一个树形结构来表达
# 如何用xpath语法寻找html里面的内容
# 1、用etree把整个html文档读取出来,并且创建成一棵树
html_tree = etree.parse("./test.html")
print(html_tree) #<lxml.etree._ElementTree object at 0x000001FE48F7AB08>
# 2、根据树形结构获取目标节点
ret = html_tree.xpath("/html/body/ol/li")
ret = html_tree.xpath("/html/body/div/div/a")

# 3、找节点中的内容与属性
ret = html_tree.xpath("/html/body/ol/li/text()")
ret = html_tree.xpath("/html/body/div/div/a/@href")

# 4、定位
# 1)层级定位
# 找所有li
ret = html_tree.xpath("//body/div//li/text()")
# 在xpath语法中"//"代表前面有若干层,"/"代表前面一层不隔
# 2)属性定位
# 找所有带id属性的li
ret = html_tree.xpath("//li[@id]/text()")
# 找所有class值为dudu的li
ret = html_tree.xpath("//li[@class='dudu']/text()")
# 模糊匹配
# 找左右class值以h开头的li
ret = html_tree.xpath("//li[starts-with(@class,'h')]/text()")
ret = html_tree.xpath("//li[contains(@class,'a')]/text()")
# 逻辑运算
# 找class值为hehe并且id值为tata
ret = html_tree.xpath("//li[@class='hehe' and @id='tata']/text()")
# 找class值为hehe或者class值为haha
ret = html_tree.xpath("//li[@class='hehe' or @class='haha']")
ret = html_tree.xpath("//div[@class='hh kk']/text()")

# 【注意】通过xpath获取到的子节点也可作为当前字节的树根取构造另外一棵节点树
obj = html_tree.xpath("//div[@id='pp']")[0]
ret = obj.xpath("//div")

print(ret)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容