您的位置:首页 > 编程语言 > Python开发

Python爬虫笔记1-基本概念

2019-10-07 07:13 579 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_45379724/article/details/102284530

基本概念

  • 工具
  • 基础语法
  • 函数
  • 面向对象编程
  • 2.继承
  • 错误处理
  • 编写第一个简单的爬虫程序

  • 学习来源:Python网络爬虫从入门到实践(第2版)——唐松

    爬虫流程

    1.获取网页

    基础技术:request、urllib、selenium(模拟浏览器)
    进阶技术:多进程多线程抓取、登录抓取、突破IP封禁和服务器抓取

    2.解析网页

    基础技术:re正则表达式、BeautifulSoup和Lxml
    进阶技术:解决中文乱码

    3.储存数据

    基础技术:存入txt、csv文件
    进阶技术:存入MySQL、MongDB数据库

    工具

    Anoconda下的Jupyter

    基础语法

    python要求严格的代码缩进,以#注释。
    Python是面向对象(object oriented)的一种语言,不需要在使用前声明需要使用的变量和类别。
    print()

    数据类型

    字符串String(放在单引号或者双引号中)
    数字Number(int 和float)
    列表list(类似于数组,不同的是列表能够包含任意数量的不同数据类型,以方括号表示)
    访问:list[1:3]
    修改:list[0] = “”
    字典Dictionaries(key与value一一对应,但值不唯一,以{"":’","":""}表示)
    遍历:

    for key,value in xxx.items():
    print (key,value)

    条件语句和循环语句

    if 判断条件1:
    执行语句1
    elif 判断条件2:
    执行语句2
    else 判断条件3:
    执行语句3

    for xxx in list1:
    执行语句

    whlie 判断条件:
    执行语句

    函数

    #定义函数
    def increment (x):
    y = x + 1
    return y
    #调用函数
    result = increment(2)
    print (result)
    3

    面向对象编程

    面向过程编程:根据业务逻辑从上往下写代码
    函数式编程:把某些功能封装到函数中

    def detail(name,age)
    print (name)
    print (age)
    obj1 = detail('zhangwei',20)
    zhangwei
    20

    面向对象编程:把函数进行分类和封装以后放入对象中

    class Person:
    #创建类
    def _init_(self, name, age):
    #_init_()方法称为类的构造方法
    self.name = name
    self.age = age
    
    def detail(self):
    #通过self调用被封装的内容
    print (self.name)
    print (self.age)
    
    obj1 = Person('zhangwei', 20)
    obj1.detail()
    #Python将obj1传给self参数,即obj1.detail(obj1),此时内部self=obj1
    zhangwei
    20

    选择:如果各个函数之间独立且无共用的数据,则选择函数式编程,如果各个函数之间有一定的关联性,那么选用面对对象编程比较好。因为函数式编程只要写清楚输入和输出变量并执行函数即可,面向对象编程需要先创建封装对象,然后通过对象调用被封装的内容。

    1.封装

    第一步:封装内容
    第二步:调用被封装的内容

    封装内容

    class Person:
    #创建类
    def _init_(self, name, age):
    #_init_()方法称为类的构造方法
    self.name = name
    self.age = age
    
    def detail(self):
    #通过self调用被封装的内容
    print (self.name)
    print (self.age)
    
    obj1 = Person('zhangwei', 20)
    #将"zhangwei"和18分别封装到 obj1及self的name和age属性

    self只是形式参数,执行obj1 = Person(‘zhangwei’, 20)时,self等于obj1。

    调用被封装的内容

    两种方式:通过对象直接调用和通过self间接调用

    class Person:
    #创建类
    def _init_(self, name, age):
    #_init_()方法称为类的构造方法
    self.name = name
    self.age = age
    
    def detail(self):
    #通过self调用被封装的内容
    print (self.name)
    print (self.age)
    
    obj1 = Person('zhangwei', 20)
    #将"zhangwei"和18分别封装到 obj1及self的name和age属性prinf (obj1.name)
    #直接调用obj1的name属性
    prinf (obj1.age)
    #直接调用obj1的age属性
    
    class Person:
    #创建类
    def _init_(self, name, age):
    #_init_()方法称为类的构造方法
    self.name = name
    self.age = age
    
    def detail(self):
    #通过self调用被封装的内容
    print (self.name)
    print (self.age)
    
    obj1 = Person('zhangwei', 20)
    obj1.detail()
    #Python将obj1传给self参数,即obj1.detail(obj1),此时内部self=obj1
    zhangwei
    20

    通过self方法间接调用时,Python默认会将obj1传给self参数,即obj1.detail(obj1)。此时方法内部的self等于obj1。

    2.继承

    继承是以普通的类为基础建立专门的类对象。
    如果我们要分别为猫和狗创建一个类,就需要为猫和狗实现他们的所有功能,例如
    猫可以:喵喵叫、吃喝拉撒
    狗可以:汪汪叫、吃喝拉撒

    class 猫:
    def 喵喵叫(self):
    print ('喵喵叫')
    def 吃(self):
    # do something
    def 喝(self):
    # do something
    def 拉(self):
    # do something
    def 撒(self):
    # do something
    
    class 狗:
    def 汪汪叫(self):
    print ('汪汪叫')
    def 吃(self):
    # do something
    def 喝(self):
    # do something
    def 拉(self):
    # do something
    def 撒(self):
    # do something

    显然吃喝拉撒是他们共有的特性,没必要反复编写,用继承的思想,就可以写成
    动物:吃喝拉撒
    猫:喵喵叫(继承动物的功能)
    狗:汪汪叫(继承动物的功能)

    class Animal:
    def eat(self):
    print ("%s 吃 " %self.name)
    def drink(self):
    print ("%s 喝 " %self.name)
    def shit(self):
    print ("%s 拉 " %self.name)
    def pee(self):
    print ("%s 撒 " %self.name)
    class Cat(Animal):
    def __init__(self, name):
    self.name = name
    def cry(self):
    print ('喵喵叫')
    class Dog(Animal):
    def __init__(self, name):
    self.name = name
    def cry(self):
    print ('汪汪叫')
    
    c1 = Cat('小白家的小黑猫')
    c1.eat()
    c1.cry()
    
    d1 = Dog('胖子家的小瘦狗')
    d1.eat()
    d1.eat()
    d1.cry()
    小白家的小黑猫吃
    喵喵叫
    胖子家的小瘦狗吃
    汪汪叫

    继承就是将多个类共有的方法提取到父类中,子类继承父类的方法即可。

    错误处理

    try/except,使用try来检测语句块中的错误,如果有错误的话,except则会执行捕获异常信息并处理。

    try:
    result = 5/0
    #除以0会产生运算错误
    except Exception as e:
    #出现错误则会执行except
    print(e)
    #打印错误

    如果不想打印错误,可以将except语句替换为pass

    编写第一个简单的爬虫程序

    爬取目标:www.santostang.com

    获取页面

    步骤

    (1)首先定义link为目标网页地址。
    (2)之后用headers来定义请求头的浏览器代理,进行伪装。
    (3)r是requests的Response回复对象,我们从中可以获取想要的信息。r.text是获取的网页内容代码。
    注意使用浏览器的 检查 功能快速找到想获取的信息的位置.

    代码

    import requests
    from bs4 import BeautifulSoup     #从bs4这个库中导入BeautifulSoup
    
    link = "http://www.santostang.com/"
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    # 定义请求头的浏览器代理,伪装成浏览器
    r = requests.get(link, headers= headers)
    #请求网页
    soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析
    #r.text是获取的网页内容代码
    #找到第一篇文章标题,定位到class
    title = soup.find("h1", class_="post-title").a.text.strip()
    print (title)
    
    # 打开一个空白的txt,然后使用f.write写入刚刚的字符串title
    with open('title_test.txt', "a+") as f:
    f.write(title)
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: