如何用python爬取校花图片并保存到本地来?
1. 获取什么数据?
校花名字 name
校花所在学校 school
校花图片的url img_ulr
2.如何获取?
打开网页http://www.xiaohuar.com/hua/ ,打开开发工具,研究每一张图片对应的html,找规律
通过python 的scrapy框架进行批量爬取
环境声明:
python 3.50
scrapy 库
出现了哪些问题?
1. 如何去除重复的url?
通过对获取的url 进行md5,进行去重
2. 如何该网站上所有的校花信息?
先获取网页上所有的a标签,通过递归去取其他内容
3. 如何内容永久化?
写入文件,数据库等,该爬校花图片程序,我选择写入文件保存
如何创建与逻辑处理?
1. 新建爬虫项目
scrapy startproject pa_girls (通过命令行)
2. spiders 目录下,建立 一个叫 、school_girls.py文件
在school_girls.py文件中写入:
#!/usr/bin/python3 import scrapy
from scrapy.selector import HtmlXPathSelector
import hashlib
# 把item模块添加到环境变量
from items import Pa1Item # # 最终获取信息列表
# school_girl = [] # 获得总url,目的去重
all_urls = {} class SchoolGirls(scrapy.Spider):
name = 'school_girls'
# 初始url,依次
start_urls = [
'http://www.xiaohuar.com/hua/',
] def parse(self, response):
# 爬虫主体
try:
# 找标签
hxs = HtmlXPathSelector(response)
girls = Pa1Item()
# 获取标签中指定数据
school = hxs.select('//div[@class="img"]/div[@class="btns"]/a/text()').extract()
name = hxs.select('//div[@class="img"]/span[@class="price"]/text()').extract()
img_url = hxs.select('//div[@class="img"]/a/img/@src').extract()
if school and name and img_url:
girls['school'] = hxs.select('//div[@class="img"]/div[@class="btns"]/a/text()').extract()
girls['name'] = hxs.select('//div[@class="img"]/span[@class="price"]/text()').extract()
girls['img_url'] = hxs.select('//div[@class="img"]/a/img/@src').extract()
yield girls
else:
pass
#
# 获取页面的所有连接
page_urls = hxs.select('//a/@href').extract()
page_urls.append('http://www.xiaohuar.com/hua/')
# print(page_urls) # 进行url去重
url_list = {}
for url in page_urls:
if url.startswith('JavaScript') or url.startswith('#') or not url:
continue
else:
m = hashlib.md5()
m.update(bytes(url, encoding='utf-8'))
img_id = m.hexdigest()
# 判断是否重复url,重复就不需要再次访问
if img_id in all_urls:
continue
else:
all_urls[img_id] = url
url_list[img_id] = url # 递归查找该页面所有url
for url in url_list.values():
yield scrapy.Request(url=url, callback=self.parse)
except Exception as e:
print(e)
3. 在 items.py文件中写入
import scrapy class Pa1Item(scrapy.Item):
name = scrapy.Field()
school = scrapy.Field()
img_url = scrapy.Field()
4. 在pipelines.py文件中写入
import os
import requests class GirlsMessage(object):
'''获取有效数据'''
def process_item(self, item, spider):
for i in range(len(item['name'])):
if item['name'][i].strip() and item['school'][i].strip() and item['img_url'][i].strip(): # 把信息写入文件
message_girls = item['name'][i] + '_' + item['school'][i] + ':' \
+ 'http://www.xiaohuar.com/' + item['img_url'][i]
with open('E:\scrapy_new\img\message_girls.text', 'a+', encoding='utf-8') as f_girls:
f_girls.write(message_girls) # 下载图片
img_path = os.path.join('E:\scrapy_new\img', item['name'][i] +'_' + item['school'][i] +'.jpg')
img_url = 'http://www.xiaohuar.com/' + item['img_url'][i]
try:
img_date = requests.get(img_url).content
with open(img_path, 'bw',) as f_img:
f_img.write(img_date)
f_img.flush()
except Exception as e:
print(e)
return item
5. 在setting文件中添加
# 设置爬取深度
DEPTH_LIMIT = 1 # 激活pipelines中类
ITEM_PIPELINES = {
'pa_1.pipelines.GirlsMessage': 200,
}
可能会出现哪些问题?
1. items模块导入不了,如何解决
在spiders目录下的__init__.py文件中加入:
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
如何启动项目?
scrapy crawl school_girls (需要在项目下,spiders目录下敲入命令)