기사 디렉토리
2021 년인데 좋아하는 뷰티 사진을 크롤링하지 않았습니다. 내 크롤러가 겉으로 보이나요? 하지만 괜찮아요. 현재 인터페이스가 바뀌었지만 2021 년에 전체 뷰티 네트워크를 얻는 방법에 대해 이야기 할 것입니다. 이것은 개선 된 프로젝트입니다. 저는 이해하기 어려운 몇몇 아이디어 등 제 자신의 많은 아이디어에 참여했습니다. 제가 직접 사용하고 있습니다. 간단하게 깨달았고, 좋은 실현이라고 생각합니다.보실 수 있습니다. 첫 번째 크롤링의 결과입니다.
소개
Scrapy 프레임 워크 기반 뷰티 웹 크롤링
크롤러 항목 주소 : http://www.meinv.hk/?cat=2
크롤러가 정상적으로 실행 중이지만 데이터가없는 경우 가능한 이유는 사이트에 액세스하려면 사다리가 필요하기 때문입니다.
여기서는 주로 커스텀 픽쳐 파이프 라인과 커스텀 csv 데이터 파이프 라인의 두 가지 기술 포인트를 배웁니다.
구현 프로세스
프로젝트를 만드는 것은 말할 것도없이 너무 간단합니다.
웹 사이트 열기
클릭하는 과정에서 구체적인 크롤링 아이디어를 얻고, 먼저 인기있는 추천 태그를 크롤링 한 다음 각 미녀의 특정 사진의 URL을 얻는다.
그런 다음 규칙을 사용하십시오.
응답에서 URL을 크롤링하는 규칙은 규칙에 지정되어 있습니다. 크롤링을 통해 얻은 URL은 다시 요청되고 콜백 함수 및 팔로우 속성의 설정에 따라 구문 분석 또는 추적됩니다.
여기에서 두 가지 사항이 강조됩니다.
- 하나는 첫 번째 URL 요청의 응답을 포함하여 반환 된 모든 응답에서 URL을 추출하는 것입니다.
- 두 번째는 규칙 목록에 지정된 모든 규칙이 실행된다는 것입니다.
pipeline.py를 입력하고 scrapy.pipelines.images에서 가져 오기 이미지를 가져오고 ImagesPipeline을 상속합니다.
스크래피와 함께 제공되는 ImagesPipeline을 기반으로 사용자 지정 파이프 라인을 완료 할 수 있습니다.
ImagesPipeline에서 세 가지 메소드를 다시 작성할 수 있습니다. get_media_requests (), file_path (), item_completed ()
특정 코드
사용자 지정 파이프 라인 (그림 및 CSV)을 사용하고 있으므로 item.py 를 작성할 필요가 없습니다.
mv.py
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class MvSpider(CrawlSpider):
name = 'mv'
allowed_domains = ['www.meinv.hk']
start_urls = ['http://www.meinv.hk/?cat=2']
# 增加提取 a 标签的href连接的规则
# 将提取到的href连接,生成新的Request 请求, 同时指定新的请求后解析函数
rules = (
# allow 默认使用正则的表达式,查找所有a标签的href
# follow 为True时,表示在提取规则连接下载完成后,是否再次提取规则中连接
Rule(LinkExtractor(allow=r'p=\d+'), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = {}
info = response.xpath('//div[@class="wshop wshop-layzeload"]/text()').extract_first()
try:
item['hometown'] = info.split("/")[2].strip().split()[1]
item['birthday'] = info.split("/")[1].strip().split()[1]
except:
item['birthday'] = "未知"
item['hometown'] = "未知"
item['name'] = response.xpath('//h1[@class="title"]/text()').extract_first()
images = response.xpath('//div[@class="post-content"]//img/@src')
try:
item['image_urls'] = images.extract()
except:
item['image_urls'] = ''
item['images'] = ''
item['detail_url'] = response.url
yield item
middlewares.py
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
class RandomUserAgentMiddleware(UserAgentMiddleware):
def __init__(self, user_agent_list):
super().__init__()
self.user_agent_list = user_agent_list
@classmethod
def from_crawler(cls, crawler):
return cls(user_agent_list=crawler.settings.get('USER_AGENT_LIST'))
def process_request(self, request, spider):
user_agent = random.choice(self.user_agent_list)
if user_agent:
request.headers['User-Agent'] = user_agent
return None
pipelines.py
import csv
import os
from hashlib import sha1
from scrapy import Request
from scrapy.pipelines.images import ImagesPipeline
from meinv import settings
class MvImagePipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for url in item['image_urls']:
yield Request(url, meta={'name': item['name']})
def item_completed(self, results, item, info):
#将下载完成后的图片路径设置到item中
item['images'] = [x for ok, x in results if ok]
return item
def file_path(self, request, response=None, info=None):
# 为每位人员创建一个目录,存放她自己所有的图片
author_name = request.meta['name']
author_dir = os.path.join(settings.IMAGES_STORE, author_name)
if not os.path.exists(author_dir):
os.makedirs(author_dir)
#从连接中提取文件名和扩展名
try:
filename = request.url.split("/")[-1].split(".")[0]
except:
filename = sha1(request.url.encode(encoding='utf-8')).hexdigest()
try:
ext_name = request.url.split(".")[-1]
except:
ext_name = 'jpg'
# 返回的相对路径
return '%s/%s.%s' % (author_name, filename, ext_name)
class MeinvPipeline(object):
def __init__(self):
self.csv_filename = 'meinv.csv'
self.existed_header = False
def process_item(self, item, spider):
# item dict对象,是spider.detail_parse() yield{}输出模块
with open(self.csv_filename, 'a', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=(
'name', 'hometown', 'birthday', 'detail_url'))
if not self.existed_header:
# 如果文件不存在,则表示第一次写入
writer.writeheader()
self.existed_header = True
image_urls = ''
for image_url in item['image_urls']:
image_urls += image_url + ','
image_urls.strip("\"").strip("\'")
data = {
'name': item['name'].strip(),
'hometown': item['hometown'],
'birthday': item['birthday'].replace('年', '-').replace('月', '-').replace('日', ''),
'detail_url': item['detail_url'],
}
writer.writerow(data)
f.close()
return item
Setting.py
import os
BOT_NAME = 'meinv'
SPIDER_MODULES = ['meinv.spiders']
NEWSPIDER_MODULE = 'meinv.spiders'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
DOWNLOADER_MIDDLEWARES = {
'meinv.middlewares.RandomUserAgentMiddleware': 543,
}
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# ImagePipeline 存放图片使用的目录位置
IMAGES_STORE = os.path.join(BASE_DIR, 'images')
ITEM_PIPELINES = {
'meinv.pipelines.MeinvPipeline': 300,
'meinv.pipelines.MvImagePipeline':100
}
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
]
1. 파일 디렉토리
2. 누군가의 사진
3.csv 파일 내용
마지막으로 아름다운 사진 몇 장
코드 다운로드
https://download.csdn.net/download/weixin_54707168/15902904