(把知乎当github用)
爬虫应该算是入门容易进阶难。下面实现一个最简单的爬取下厨房首页图片的例子。
import os
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/68.0.3440.106 Safari/537.36'
}
r = requests.get('http://www.xiachufang.com', headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
image_dir = os.path.join(os.curdir, 'xiachufang-images')
img_list = []
for img in soup.select('img'):
if img.has_attr('src'):
img_list.append(img.attrs['src'])
else:
img_list.append(img.attrs['src'])
for img in img_list:
o = urlparse(img)
if not o.path[1:]:
continue
filepath = os.path.join(image_dir, o.path[1:])
if not os.path.isdir(os.path.dirname(filepath)):
os.mkdir(os.path.dirname(filepath))
url = '%s://%s%s' % (o.scheme, o.netloc, o.path)
resp = requests.get(url, headers=headers)
with open(filepath, 'wb') as f:
for chunk in resp.iter_content(1024):
f.write(chunk)
爬取效果:
(是不是还挺有食欲的)
代码的几个要点:
- HTTP GET request需要加headers,俗话说演戏演全套,如果不加headers的话,下厨房的服务器会拒绝你的HTTP request...
- 为什么要专门用url = '%s://%s%s' % (o.scheme, o.netloc, o.path)来合成下载图片的url?因为原本的|img|这个url里面带有附加参数,会使得我们下载小图片。我们合成的|url|不带有附加参数,就可以下载大图片。
- 有些图片的src链接在src属性里,而不在src属性里,所以要专门看过HTTP response的形式再决定爬虫怎么写。