首先一般情况下爬虫爬取网页数据不违法,但有些收费或者限制下载次数的音乐网站,视频网站等数据很容易爬取到,我最近就爬取了好几个网站的音乐与视频,也用自动化模块分析了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)
```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:
combine_url=head_url+i['href']
爬取相册集的网页信息,原理与前面类似,不做赘述
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)])
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
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()
总结:这个爬虫脚本看起来不难,实则是我写过的爬虫里算中等难度的了,关键在于网页结构不易处理。