爬虫三次课总结
个人学习记录提示:以下是本篇文章正文内容,下面案例可供参考
一、爬虫原理
1.网络爬虫爬取数据过程和原理的理解。
- 取初始的URL。初始的URL地址可以由用户人为地指定,也可以由用户指定的某个或某几个初始爬取网页决定。
- 根据初始的URL爬取页面并获得新的URL。获得初始的URL地址之后,首先需要爬取对应URL地址中的网页,爬取了对应的URL地址中的网页后,将网页存储到原始数据库中,并且在爬取网页的同时,发现新的URL地址,同时将已爬取的URL地址存放到一个URL列表中,用于去重及判断爬取的进程。
- 将新的URL放到URL队列中。在第2步中,获取了下一个新的URL地址之后,会将新的URL地址放到URL队列中。
- 从URL队列中读取新的URL,并依据新的URL爬取网页,同时从新网页中获取新URL,并重复上述的爬取过程。
- 满足爬虫系统设置的停止条件时,停止爬取。在编写爬虫的时候,一般会设置相应的停止条件。如果没有设置停止条件,爬虫则会一直爬取下去,一直到无法获取新的URL地址为止,若设置了停止条件,爬虫则会在停止条件满足时停止爬取。
2.主要构成
**Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)**-
调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
-
URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。
-
网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)
-
网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析xml和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。
-
应用程序:就是从网页中提取的有用数据组成的一个应用。
二、基本函数和库
1.常用库
- requests 做请求的时候用到。
- requests.get(“url”)
- selenium 自动化会用到。
- lxml
- beautifulsoup
- pyquery 网页解析库 说是比beautiful 好用,语法和jquery非常像。
- pymysql 存储库。操作mysql数据的。
- pymongo 操作MongoDB 数据库。
- redis 非关系型数据库。
- jupyter 在线记事本。
2. Urllib
Python内置的Http请求库
urllib.request 请求模块 模拟浏览器
urllib.error 异常处理模块
urllib.parse url解析模块 工具模块,如:拆分、合并
urllib.robotparser robots.txt 解析模块
三、一个简单的爬虫包括五个主要的部分
1) spider_main 一个调度的逻辑
2) url_manager url的管理器,复杂url的获得和去重 ,这一部分深度的可以利用redis的队列,以及深度广度优先原则
3) html_parser html的解析器,获得html中想得到的数据和子url
4) html_downloader 具体执行下载逻辑的部分,深度的话会涉及cookid的处理,https,header,多线程,定时,反爬虫的策略
5) html_outputer 与数据库连接以及在前台的展现
四、基本案例
1.简单的爬取
1.简单的爬取
import requests
def getHTMLText(url):
header = {'User-agent': 'Baiduspider'}
try:
r = requests.get(url,headers = header, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("404")
return ''
url = "https://baike.baidu.com/item/%E5%96%9C%E7%BE%8A%E7%BE%8A/3844280?fr=aladdin"
print(getHTMLText(url))
运行结果如图:
2.爬取NBA排名信息
import requests
import bs4
from bs4 import BeautifulSoup
def getHtmlText(url):
try:
r=requests.get(url)
r.raise_for_status()
r.enconding=r.apparent_encoding
return r.text
except:
return ""
#根据内容分析并存储到列表中
def cunNeiRong(ls,html):
#用BeautifulSoup的parse解析器解析网页
soup=BeautifulSoup(html,"html.parser")
#将body的儿子节点返回列表类型
t_list = list(soup.find("tbody").contents)
for tr in t_list:
if isinstance(tr,bs4.element.Tag):
if (tr.find("td").string == u"东部" or tr.find("td").string == u"西部"):
continue
tds = tr("td")
ls.append([tds[0].string,tds[1].string,tds[2].string,tds[3].string,tds[4].string,tds[12].string,tds[13].string])
#把内容以容易理解清晰的表现输出出来
def printNeiRong(ls):
print(u"东部排名")
#循环打出NBA东部排名前15
for i in range(16):
s= ls[i]
#格式化输出
print("%-5s%-8s%-5s%-5s"%(s[0],s[1],s[2],s[3]))
#主函数进行调用实现目的
def main():
ls =[]
url= "https://nba.hupu.com/standings"
NBA = getHtmlText(url)
cunNeiRong(ls,NBA)
printNeiRong(ls)
main()
运行结果图片如下:
综合爬虫案例
1.爬取糗事百科
import requests
import re
import urllib
import os
url1='https://www.qiushibaike.com/imgrank/pagel'
headers= {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.41'
}
#创建存放图片文件夹
if not os.path.exists('./qiutu'):
os.mkdir('./qiutu')
start_page = int(input('enter a start pageNum:'))
end_page = int(input('enter a end pageNum:'))
for page in range(start_page,end_page+1):
new_url=url1+str(page)
page_text = requests.get(url=new_url,headers=headers).text
img_url_list = re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>',page_text,re.S)
for img_url in img_url_list:
img_url = "https:"+img_url
imgName = img_url.split('/')[-1]
imgPath = 'qiutu/'+imgName
urllib.request.urlretrieve(url=img_url,filename=imgPath)
print(imgPath,'下载成功!')
print("over!")
运行结果如下图: