2021-06-07

爬虫三次课总结

个人学习记录

提示:以下是本篇文章正文内容,下面案例可供参考

一、爬虫原理

1.网络爬虫爬取数据过程和原理的理解。

  1. 取初始的URL。初始的URL地址可以由用户人为地指定,也可以由用户指定的某个或某几个初始爬取网页决定。
  2. 根据初始的URL爬取页面并获得新的URL。获得初始的URL地址之后,首先需要爬取对应URL地址中的网页,爬取了对应的URL地址中的网页后,将网页存储到原始数据库中,并且在爬取网页的同时,发现新的URL地址,同时将已爬取的URL地址存放到一个URL列表中,用于去重及判断爬取的进程。
  3. 将新的URL放到URL队列中。在第2步中,获取了下一个新的URL地址之后,会将新的URL地址放到URL队列中。
  4. 从URL队列中读取新的URL,并依据新的URL爬取网页,同时从新网页中获取新URL,并重复上述的爬取过程。
  5. 满足爬虫系统设置的停止条件时,停止爬取。在编写爬虫的时候,一般会设置相应的停止条件。如果没有设置停止条件,爬虫则会一直爬取下去,一直到无法获取新的URL地址为止,若设置了停止条件,爬虫则会在停止条件满足时停止爬取。

2.主要构成

**Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)**
  1. 调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。

  2. URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。

  3. 网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)

  4. 网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析xml和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。

  5. 应用程序:就是从网页中提取的有用数据组成的一个应用。

二、基本函数和库

1.常用库

  1. requests 做请求的时候用到。
  2. requests.get(“url”)
  3. selenium 自动化会用到。
  4. lxml
  5. beautifulsoup
  6. pyquery 网页解析库 说是比beautiful 好用,语法和jquery非常像。
  7. pymysql 存储库。操作mysql数据的。
  8. pymongo 操作MongoDB 数据库。
  9. redis 非关系型数据库。
  10. 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!")

运行结果如下图:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值