元旦献礼,爬虫基本与核心知识整理汇总(更新中)

爬虫学习

使用说明:本文借鉴了几本参考书写的。主要是按照自己的思路整理,我是一名刚学习爬虫的,所以有时候看文章和书籍感觉不是自己想要的,所以写了这篇文章。本文的代码都是可以运行的,而且还增加了实际的案例,比如解析的时候,给了html文本,感兴趣的可以自己琢磨学习。我就是这样学习的。另外,本文有很多自己的备注,可能语言不太流畅。一些代码只要去掉#就可以运行,我是一个个尝试,所以都写上了。如果你对某一个代码有疑问,可以留言,我看到了就会回复。
元旦献礼,爬虫基本与核心知识整理汇总(更新中)

先爬(抓上你想要的页面)

四大核心:抓文本、捕捉异常、IP代理、响应头

urllib库

#python系统自带的urllib库,上手抓文本
import urllib.request
re = urllib.request.urlopen("http://www.baidu.com")
print(re.read().decode("utf-8"))
#捕捉异常,有备无患
from urllib import request, error
try:
    response = request.urlopen('http://cuiqingcai.com/index.htm')
except error.URLError as e:
    print(e.reason)
#代理
import urllib.request
proxy_handler = urllib.request.ProxyHandler({
    'http': 'http://14.198.177.46',
    'https': 'https://14.198.177.46'
})#https://www.kuaidaili.com/free/intr/这个网站有免费的IP代理
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('http://www.baidu.com')
print(response.status)
#响应头带上,用add_header
from urllib import request, parse
url = 'http://www.baidu.com'
req = urllib.request.Request(url=url)
req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
req.add_header('Host','www.baidu.com')
req.add_header('Referer','https://www.baidu.com/index.php?tn=98012088_5_dg&ch=5')
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))

requests库

四大核心:抓文本、捕捉异常、IP代理、响应头

#请求头,爬文本
import requests
url = 'https://www.jingdianlaoge.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
res = requests.get(url=url, headers=headers)
#print(res.text)
res.encoding='utf-8'
print(res.text)
#捕捉异常
import requests
url = 'http://www.baidu.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
res = requests.get(url=url, headers=headers)
res.encoding=res.apparent_encoding
if res.status_code == 200:
    print("successful try")
    print(res.text)
else:
    print("error")
#代理IP
import requests

proxies = {'http': 'http://14.198.177.46',
    'https': 'https://14.198.177.46'}
res = requests.get('http://www.baidu.com',proxies=proxies)
print(res.status_code)

后读(读取你想要的内容)

两大核心:标签和属性,分别对应的值!

正则表达式

#正则掌握2个方法,第一个正则的代表(为了少些代码),就是compile,第二个是正则的所有查找。当然最重要的就是正则的替代规则。替代就是.*?.
#正则是真牛逼,只要写对了,啥都能给你弄出来,可能就是会不太方便。
import re

html = """<div class="navWrap">
        <div class="nav clearfix">
            <ul class="navList clearfix"> 
                <li><a class="active" href="/" title="首页">首页</a></li>
                <li><a target="_self"  href="/laoge/500shou.htm" title="经典老歌500首">经典老歌500首</a></li>
                <li><a target="_self" href="/laoge/80.htm" title="80后喜欢的经典老歌">80后老歌</a></li>
                <li><a target="_self" href="/laoge/70.htm" title="70后喜欢的经典老歌">70后老歌</a></li>
                <li><a target="_self" href="/laoge/90.htm" title="90后喜欢的经典老歌">90后老歌</a></li>
                <li><a target="_self" href="/laoge/yueyu.htm" title="粤语经典老歌">粤语老歌</a></li>
                <li><a target="_self" href="/laoge/english.htm" title="经典英文歌曲">经典英文歌曲</a></li>
                <li><a target="_self" href="/laoge/junge.htm" title="军歌大全">军歌大全</a></li> 
                <li><a target="_self" href="/laoge/chaqu.htm" title="影视歌曲">影视歌曲</a></li> 
                <li>
                    <a href="javascript:;">更多</a>
                    <div class="more">
                        <a target="_self" href="/zj/">经典歌单</a>
                        <a target="_self" href="/zhuiju/">热播影视</a>
                      	<a target="_self" href="/yanyuan/">明星大全</a>
                        <a target="_self" href="/news/">热点资讯</a>
                        <a target="_self" href="/soft/">安卓下载</a>
                    </div>
                </li> 
            </ul>
        </div>
    </div>"""
#print(html)
#results = re.findall('<li.*?title="(.*?)">(.*?)</a></li>',html,re.S)#方法一
#for result in results:
    #print(result)
pattern = re.compile('<li.*?title="(.*?)">(.*?)</a></li>',re.S)
results = re.findall(pattern,html)#方法二,有了compile,方便引用了
print(results)

Xpath

#Xpath,解析就两个学习目的,一个是标签,一个是属性。知道这两个,基本上就能查找了。注意,取标签就必须text(),取属性就必须@。
#Xpath明白了好简单,//就是第一个,/就是下一层,@就是拿标签里面的属性,知道了好简单。
from lxml import etree

text = """<div class="navWrap">
        <div class="nav clearfix">
            <ul class="navList clearfix"> 
                <li><a class="active" href="/" title="首页">首页</a></li>
                <li><a target="_self"  href="/laoge/500shou.htm" title="经典老歌500首">经典老歌500首</a></li>
                <li><a target="_self" href="/laoge/80.htm" title="80后喜欢的经典老歌">80后老歌</a></li>
                <li><a target="_self" href="/laoge/70.htm" title="70后喜欢的经典老歌">70后老歌</a></li>
                <li><a target="_self" href="/laoge/90.htm" title="90后喜欢的经典老歌">90后老歌</a></li>
                <li><a target="_self" href="/laoge/yueyu.htm" title="粤语经典老歌">粤语老歌</a></li>
                <li><a target="_self" href="/laoge/english.htm" title="经典英文歌曲">经典英文歌曲</a></li>
                <li><a target="_self" href="/laoge/junge.htm" title="军歌大全">军歌大全</a></li> 
                <li><a target="_self" href="/laoge/chaqu.htm" title="影视歌曲">影视歌曲</a></li> 
                <li>
                    <a href="javascript:;">更多</a>
                    <div class="more">
                        <a target="_self" href="/zj/">经典歌单</a>
                        <a target="_self" href="/zhuiju/">热播影视</a>
                      	<a target="_self" href="/yanyuan/">明星大全</a>
                        <a target="_self" href="/news/">热点资讯</a>
                        <a target="_self" href="/soft/">安卓下载</a>
                    </div>
                </li> 
            </ul>
        </div>
    </div>"""
html = etree.HTML(text)
#results = html.xpath('//li/a/text()')#标签的方法,得到的标签的值.如果是标签的话,就必须要使用text()函数,才能取到标签的值
#results = html.xpath('//li/a/@title')#属性的方法,得到的属性的值
#results = html.xpath('//li/a/@href')#属性的方法,得到的属性的值
results = html.xpath('//div[@class="more"]/a/@target')#看看这个东西,你就明白了[]的作用了
for result in results:
    print(result)
#print(len(datas))

Beautiful soup

#Beautiful soup,研究了半天,差一点武断了。属性值一般方法都不讲,我在这里用了两个方法都可以。标签值太容易了。哈哈
#来来,都来喝汤吧。这个方法确实简单。
from bs4 import BeautifulSoup
import bs4

html = """<div class="navWrap">
        <div class="nav clearfix">
            <ul class="navList clearfix"> 
                <li><a class="active" href="/" title="首页">首页</a></li>
                <li><a target="_self"  href="/laoge/500shou.htm" title="经典老歌500首">经典老歌500首</a></li>
                <li><a target="_self" href="/laoge/80.htm" title="80后喜欢的经典老歌">80后老歌</a></li>
                <li><a target="_self" href="/laoge/70.htm" title="70后喜欢的经典老歌">70后老歌</a></li>
                <li><a target="_self" href="/laoge/90.htm" title="90后喜欢的经典老歌">90后老歌</a></li>
                <li><a target="_self" href="/laoge/yueyu.htm" title="粤语经典老歌">粤语老歌</a></li>
                <li><a target="_self" href="/laoge/english.htm" title="经典英文歌曲">经典英文歌曲</a></li>
                <li><a target="_self" href="/laoge/junge.htm" title="军歌大全">军歌大全</a></li> 
                <li><a target="_self" href="/laoge/chaqu.htm" title="影视歌曲">影视歌曲</a></li> 
                <li>
                    <a href="javascript:;">更多</a>
                    <div class="more">
                        <a target="_self" href="/zj/">经典歌单</a>
                        <a target="_self" href="/zhuiju/">热播影视</a>
                      	<a target="_self" href="/yanyuan/">明星大全</a>
                        <a target="_self" href="/news/">热点资讯</a>
                        <a target="_self" href="/soft/">安卓下载</a>
                    </div>
                </li> 
            </ul>
        </div>
    </div>"""
soup=BeautifulSoup(html,"html.parser") 
#print(soup.a['href'])#得到/,这是啥???
results = soup.find_all(target='_self')#他把属性所在的标签输出了,这有啥用啊
for result in results:
    print(result['href'])#关键在这一步,看看不仅输出了属性值,而且还过滤了一种属性。简直完美。
    
#results = soup.select('a')
#for result in results:
    #print(result['href'])#漂亮!!!得到了属性值,哈哈哈

#infos = soup.find('ul',{'class':'navList clearfix'}).find_all('li')
#for info in infos:
    #name = info.find('a').get_text()#取标签,常规操作。
    #print(name)

再读(不过瘾?再读取更多更好的内容)

翻页

页中页

调用已有数据

保存(保存你想要的格式)

SCV格式

两大核心:横着放和竖着放!

#将每个数据保存到CSV文件里面,横着写!!!
with open('./lianjia_2.csv','a') as file:#a是只读的模式
    name = 1,2,3 #默认是有()符号的,如果是遍历的话,就没有符号了
    file.write('{}\n'.format(name))
``

```python
#每个数据保存到CSV文件里面,竖着写!!!
import csv
s = [1,2,3,4]
with open('./xiaoqu_id.csv', 'a',newline='')as f:
        write = csv.writer(f)
        for data in s:
            write.writerow([data])
        f.close()   

此文还在更新中,希望对朋友们有益!
我是一名新手,还请多多批评!
借此文,献给2020年的自己!
——老马不需扬鞭自奋蹄,再见2020年!

上一篇:【数据库|MySQL】在项目中应用mysql(vscode)


下一篇:测试发的发的发