学习爬虫的常见问题分享(一)

爬虫是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值