爬取投票页面,音乐与视频,高清图片

首先一般情况下爬虫爬取网页数据不违法,但有些收费或者限制下载次数的音乐网站,视频网站等数据很容易爬取到,我最近就爬取了好几个网站的音乐与视频,也用自动化模块分析了QQ空间,写了新型冠状肺炎的数据清洗与可视化。也写了投票软件,一般网站的投票页面还是很容易破解并刷票的,这里我随便上传了一个爬取高清壁纸的代码,这种爬取方式不需要下载人家的软件,也不需要登陆,就直接可以用不到一分钟全部爬取到我们的电脑上。

爬取需要如下九个模块

import requests
import re,os,random,urllib,numpy,pygal
import time
from bs4 import BeautifulSoup

为了防止网页反对爬取,这里我虚构插入了多个请求头,用于假装我们在用浏览器或者手机浏览网页,请求头是随机函数产生一个

agent1='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE'
agent2='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0'
agent3='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
agent_list=[agent1,agent2,agent3]
agent=random.choice(agent_list)
headers = {'User-Agent': agent}

设置大循环,可设置爬取的页码,且页码用于main_url实现翻页操作,一举两得

start_page=int(input("请输入爬取起始页码:"))
end_page=int(input("请输入爬取终止页码:"))
for p in range(start_page,end_page+1):
#主页网址(主页网址有时候与子页网址有一点点不同,大多时候是相同只是往后加一点点东西)
    main_url=r'http://desk.zol.com.cn/4'+'/{}.html'.format(p)

爬取主页网页信息,这里我用了requests,大家熟悉urllib的也可以,但rullib在爬取的时候会多三行代码,不推荐用,特别需要注意的是爬取页面代码中文无法显示,一定要转码!!!

main_url=r'http://desk.zol.com.cn/4'+'/{}.html'.format(p)
    #爬取主页
    response=requests.get(main_url,headers=headers)
    #让汉字正常显示
    response.encoding='gb2312'
    html=response.text

把爬取的网页代码转化为beautifulsoup可以完全驾驭的解析的格式,如div,a,ul,li等层次信息很明了

soup=BeautifulSoup(html,'lxml')

网页解析出相册集的标题,最终保存到本地的时候需要title保存,以防文件错乱,这里我用了正则表达式解析,当然你们可以用xpath,bs4等

name_pat=''
    name_list=re.findall(name_pat,html)

## 因为每一个页面对应好几十个相册集,故需要进入每个相册集爬取时需要通过主页面爬取每个url
## 这里我用了beautifulsoup中的find 与find_all,当然也可以用scc选择器来清洗数据```

```python
album_url_list=soup.find('ul',{"class":"pic-list2 clearfix"}).find_all('a')

上一步骤爬取的url只是末尾的url,需要加入前端网址加以构造才算完整,这里一定要注意,不然response会报错,这里用循环构造所有网址

head_url='http://desk.zol.com.cn'
    for i in album_url_list:
        #print(i.find('a')['href'])
        combine_url=head_url+i['href']
        #print(combine_url)

爬取相册集的网页信息,原理与前面类似,不做赘述

album_response=requests.get(combine_url,headers=headers)
        album_response.encoding = 'gb2312'
        album_html = album_response.text  
        album_soup = BeautifulSoup(album_html, 'lxml')
``
## 接下来就进入第一页面,这一页面是爬取最重要的部分,一定要看清楚网页构造与网页信息的数据逻辑,不然清洗数据的时候会拿到多余的数据,导致无法提取属性与键值对信息

```python
aa_list = album_soup.find('ul', {"id": "showImg"}).find_all('a')
a_list = aa_list

清洗数据时有高清图片与朴素图片,且图片大小也有各种分类,推荐图片也需筛除,故网页的javascrip页面一定要看清楚结构,我们要清洗的就是高清大壁纸这三个属性

big_jpg_url_list = []
        for a in a_list:

            a_result = a['href']
            combine_url = head_url + a_result

            big_response = requests.get(combine_url, headers=headers)
            big_response.encoding = 'gb2312'
            big_html = big_response.text
            test1 = BeautifulSoup(big_html, 'lxml')

            big_jpg_url = test1.find('img', {"id": "bigImg"})['src']
            big_jpg_url_list.append(big_jpg_url)

这里已经把高清大壁纸的资源数据已经清洗出来,且放入列表之中,下一步就是爬取和解析二进制的图片数据了,解析完就写入本地文件夹

1 自动按照文件title创建二级目录与文件名,且需要系统自己判断是否已经存在我们要创建的目录。这里我习惯用os模块,当然可以用sys这个内置的模块,都行的

# 创建一级目录
        path1 = r'C:\Users\liqiyan\Desktop\wallpaper' + '\{}'.format(name_list[album_url_list.index(i)])
        #print(path1)
        if not os.path.exists(path1):
            # 如果不存在则创建目录
            os.makedirs(path1)
        else:
            # 如果目录存在则不创建,并提示目录已存在
            print(path1 + ' 目录已存在')

2 爬取并解析二进制文件,并依次写入本地保存

        for m in range(len(big_jpg_url_list)):

            file=requests.get(big_jpg_url_list[m],headers=headers).content   #requests爬取的数据一定要看他的类型,不然无法获取
            time.sleep(0.5)
            # 创建二级目录(文件名不属于二级目录)
            path2=path1+'\图片{}.jpg'.format(str(m+1))

            with open(path2,'wb') as fh:
                fh.write(file)

最后记得把列表全部清空,这一步很关键,也是是否能够遍历循环的关键,因为不清空的话,下一页写入的时候又重新把第一页的数据写入了,不但数据重复,也占用了创建的文件路径导致报错,且最重要的就是当爬取速度过快过频时,网页服务器会发现你是爬虫,会禁止反爬,导致前功尽弃

big_jpg_url_list.clear()

        a_list.clear()
    name_list.clear()
    album_url_list.clear()

总结:这个爬虫脚本看起来不难,实则是我写过的爬虫里算中等难度的了,关键在于网页结构不易处理。

你可能感兴趣的:(python)