1. 分析网站信息
http://www.meizitu.com/
1.1 得到每页每个帖子连接:Xpath规则是://h2/a/@href
1.2得到帖子标签://div[@class='metaRight']/p/text()
1.3得到帖子中的信息得到帖子名称://h2/a/text()
1.4得到图片列表://div[@id="picture"]/p/img/@src
2. 创建项目
创建项目命令:scrapy startproject meizitu进入目录:cd meizitu
创建爬虫:scrapy genspider meizitu meizitu.com
使用PyCharm打开项目
在项目根目录下新建main.py文件,用于调试:
from scrapy import cmdline
cmdline.execute('scrapy crawl meizi'.split())
3. items.py
# -*- coding: utf-8 -*-
import scrapy
class MeizituItem(scrapy.Item):
#帖子路径
url = scrapy.Field()
#帖子名称
name = scrapy.Field()
#帖子标签
tags = scrapy.Field()
#帖子里面的图片列表
image_urls = scrapy.Field()
#图片存放在本地的路径
images = scrapy.Field()
4. spiders/coser.py
import scrapy
# Item Loaders提供了一种便捷的方式填充抓取到的 :Items
from scrapy.contrib.loader import ItemLoader, Identity
from meizitu.items import MeizituItem
class MeiziSpider(scrapy.Spider):
name = "meizi"
allowed_domains = ["meizitu.com"]
url = 'http://www.meizitu.com/'
start_urls = (
url,
)
def parse(self, response):
#得到每页每个帖子连接,用@href属性
link_lists = response.xpath('//h2/a/@href').extract()
for link in link_lists:
print("link==",link)
# 请求=Request(连接,parese_item)
yield scrapy.Request(link, callback=self.parse_item) # 返回请求
# 获取页码集合
# pages = response.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()
# print('pages: %s' % pages) # 打印页码
# if len(pages) > 2: # 如果页码集合>2
# page_link = pages[-2] # 图片连接=读取页码集合的倒数第二个页码
# # page_link = page_link.replace('/a/', '') # 图片连接=page_link(a替换成空)
# next_url = self.url+ page_link
# print("next_url==",next_url)
#
# yield scrapy.Request(next_url, callback=self.parse) # 返回请求
#解析具体的帖子信息
def parse_item(self, response):
print("parse_item in url===",response.url)
# l=用ItemLoader载入MeizituItem()
item_loader = ItemLoader(item=MeizituItem(), response=response)
# 名字
item_loader.add_xpath('name', '//h2/a/text()')
# 标签
item_loader.add_xpath('tags', "//div[@class='metaRight']/p/text()")
# 图片连接
item_loader.add_xpath('image_urls', "//div[@id='picture']/p/img/@src", Identity())
# url
item_loader.add_value('url', response.url)
return item_loader.load_item()
ItemLoader类的封装
执行新脚本程序
from scrapy import cmdlinecmdline.execute('scrapy crawl meizi -o meizi.json'.split())
扩展支持下一页
# -*- coding: utf-8 -*-
import scrapy
# Item Loaders提供了一种便捷的方式填充抓取到的 :Items
from scrapy.contrib.loader import ItemLoader, Identity
from meizitu.items import MeizituItem
class MeiziSpider(scrapy.Spider):
name = "meizi"
allowed_domains = ["meizitu.com"]
url = 'http://www.meizitu.com/'
start_urls = (
url,
)
def parse(self, response):
#得到每页每个帖子连接,用@href属性
link_lists = response.xpath('//h2/a/@href').extract()
for link in link_lists:
print("link==",link)
# 请求=Request(连接,parese_item)
yield scrapy.Request(link, callback=self.parse_item) # 返回请求
# 实现下一样获取页码集合
pages = response.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()
print('pages: %s' % pages) # 打印页码
for page in pages:
next_url = self.url+ page
yield scrapy.Request(next_url, callback=self.parse) # 返回请求
#解析具体的帖子信息
def parse_item(self, response):
print("parse_item in url===",response.url)
# l=用ItemLoader载入MeizituItem()
item_loader = ItemLoader(item=Meizitu2Item(),response=response)
#直接只用xpath
item_loader.add_xpath("title",'//div[@class="metaRight"]/h2/a/text()')
#如果已经是取到的值了就用add_value
item_loader.add_value("url",response.url)
#最后一个参数是返回里面的内容
item_loader.add_xpath("images", '//div[@id="picture"]/p/img/@src',Identity())
return item_loader.load_item()