Python爬虫笔记1-基本概念
基本概念
学习来源: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)
- 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念
- Python基本概念--Python学习笔记
- Python爬虫(一):基本概念
- Python学习笔记(2):基本概念
- Python爬虫(一):基本概念
- python3自学之路-笔记15_函数的基本概念与使用
- python 学习笔记第四章:基本概念
- 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令
- 学习笔记(01):Python数据分析与爬虫-基本的数据类型
- python基础教程学习笔记 — 基本概念
- 学习笔记(13):Python数据分析与爬虫-Numpy:ndarray的基本用法
- Python 学习笔记 - 线程(基本概念和创建)
- 小鸟游的Python爬虫学习笔记——基本库的使用
- Python爬虫学习--urllib的基本使用笔记
- python学习笔记【一】--基本概念
- python学习笔记(2)--基本概念
- Python学习笔记-模块介绍(一)-模块概念和基本使用
- Python笔记一-基本概念
- 学习python笔记——基本概念
- Python学习笔记-List基本操作【python 3】//为继续学习爬虫准备-01