如何用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目录下敲入命令)
时间: 2024-10-05 04:26:06