爬虫是python应用的一个方面,且是比较容易上手并看到结果的应用。说是容易上手,不过对新手而言,也不免碰到各种各样的坑。今天用多个案例跟大家分享本人学习爬虫技术中碰到一些问题,希望对初学爬虫者有一定参考价值。对于完全的小白而言,建议先自行学习爬虫基础知识,如常见库的安装和常用功能,如requests, beautifulsoup4, Selenium, Scrapy等。欢迎各位指点交流!
案例一:家具网站图片的爬取。
爬虫逻辑很简单:
导入相应的库–>用requests库请求网址—>将请求结果转化成BeautifulSoup类对象–>用BeautifulSoup的findall方法找到图片网址–>循环写入文件。代码如下(看起来密密麻麻,只是用了很多注释,逻辑简单)
#爬取家具网站一个面页的餐椅图片
import requests
import os
from bs4 import BeautifulSoup
url='https://www.ikea.cn/cn/en/catalog/categories/departments/dining/25219/' #待爬取的网址
picurl='https://www.ikea.cn' #用来获得完整的图片网址
htmlfile=requests.get(url) #requests库get()函数请求
htmlfile.raise_for_status() #检查是否请求成功,失败则抛出异常,可以省略。
htmlfile.status_code #相应状态值为200,表示请求成功
print(type(htmlfile)) #查看对象类型, 这是一个好的习惯。这里获得Respone类对象
objsoup=BeautifulSoup(htmlfile.text,'lxml') #转化成BeautifulSoup类对象
print(type(objsoup)) #查看对象类型
imgurl=objsoup.find_all('img',class_='prodImg') # 用find_all或findAll获得<img>标签。
#批量下载并写入文件
picnum=1 #统计下载图片数量
for j in imgurl:
finurl=picurl+j.get('src') #图片的完整网址
picture=requests.get(finurl) #获取图片内容
#将图片写入文件的第一种方法
with open('C:/Users/Administrator/Desktop/ikeapic/'+os.path.basename(j.get('src')),'wb') as f:
#保存的图片名字文件名由路径加文件名组成,也可以简单的用数字表示
f.write(picture.content) #.content就是图片内容,字节方式,这个方法简单明了。
print(type(picture.content)) #严重类型为字节方式,可以省略
print('完成第'+str(picnum)+'张图片的下载')
#将图片写入文件的第二总方法用iter_content(),用''' '''注释形式显示如下。
'''with open('C:/Users/Administrator/Desktop/ikeapic/'+os.path.basename(j.get('src')),'wb') as f:
#保存的图片名字文件名由路径加文件名组成,也可以简单的用数字表示
for i in picture.iter_content(10240):
f.write(i)
print('完成第'+str(picnum)+'张图片的下载')'''
picnum+=1
总结:这个简单的爬虫案例对新手来说有哪些坑呢?
1、bs4里的查找函数是find()和find_all或findAll(),千万不要用findall(),后者是re正则表达式的函数,新手容
易搞错。
2、图片的下载,即将获取得图片写入本地文件。由于是字节文件,所以open()函数的模式要用’wb’,不能
用‘w’,否则无法写入。另外两种写入文件的方案也需要掌握,用请求结果.content的属性直接得到,比较
简单。
3、某些网站有反爬措施,需要再请求函数get()中加入header参数,模拟成浏览器访问,否则会被拒绝请
求,即时.status_code不为200。我会在第二个案例中分享。
额外分享:
requests库是一个很好用的库,导入后用help(requests)命令可以显示如下(篇幅限制,列出部分内容)。
从如下内容,requests是一个用于HTTP访问的库,作者是Kenneth Reitz,美国人,生于1988年。库的网址是’http://python-requests.org’,可以上去看一下。这个哥们是为多才多艺的高手。他的个人网站是https://www.kennethreitz.org/,有兴趣可以访问下,乍一看,以为他是摄影师,都看不出是个Coder。
他的语录:
“Writing great code is an art — finding the perfect balance between simplicity and functionality, opinions and open-mindedness.”
— Kenneth Reitz
Help on package requests:
NAME
requests
DESCRIPTION
Requests HTTP Library
~~~~~~~~~~~~~~~~~~~~~
Requests is an HTTP library, written in Python, for human beings. Basic GET
usage:
import requests
r = requests.get(‘https://www.python.org’)
r.status_code
200
‘Python is a programming language’ in r.content
True
or POST:
payload = dict(key1=‘value1’, key2=‘value2’)
r = requests.post(‘http://httpbin.org/post’, data=payload)
print(r.text)
{
…
“form”: {
“key2”: “value2”,
“key1”: “value1”
},
…
}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FUNCTIONS
check_compatibility(urllib3_version, chardet_version)
DATA
author_email = ‘me@kennethreitz.org’
build = 137473
cake = ‘✨ 🍰 ✨’
copyright = ‘Copyright 2018 Kenneth Reitz’
description = ‘Python HTTP for Humans.’
license = ‘Apache 2.0’
title = ‘requests’
url = ‘http://python-requests.org’
codes = <lookup ‘status_codes’>
VERSION
2.19.1
AUTHOR
Kenneth Reitz
FILE
d:\anaconda3\lib\site-packages\requests_init_.py